Re: Daten loggen Kategorie: Programmierung (von Leo - 28.09.2006 16:59) | ||
Als Antwort auf Re: Daten loggen von André H. - 2.09.2006 16:34 | ||
| ||
Ich gehe erst die kommenden Tage das programmien des Logging-Teils an. Inzwischen bin ich ein wenig von meinem hohen Ro� abgestiegen. Bevor ich überhaupt das loggen ins RAM device implementiere, werde ich (diese Woche) das raus- blasen der Werte nach einer fixen Log-Tabelle implementieren. Da mu� halt dann ständig ein PC dranhängen, aber PC seitig ist logging SW vorhanden, da brauch ich nix schreiben. Als nächster Schritt wird der Speicher implementiert, damit nicht ständig ein PC laufen mu�. Und danach (irgendwann) ist geplant, da� die Log-Tabelle via PC geändert werden kann. Hier wird es vermutlich immer möglich sein, den Speicher vorher zu löschen, so da� das hantieren mit unterschiedlichen Log-Tabellen im RAM Device vermutlich unnötig sein wird. Am Menü der Station wird man vermutlich nie die Log-Tabelle ändern können, weil ich das vermutlich vom PC aus machen werde, bevor ich in den Heizraum latsche (die Station wird per seriell zu LAN Konverter ans Netz kommen). Was ich eigentlich anmerken wollte > var.temp[konst.puffer_oben]=x; zu diesem Konstrukt bin ich auch gekommen. Zumindest bei den Parametern die ich implementiert habe. Schaut dann zB. so aus: para.meter[const.COL_BOIL_DIFF] Das gro�e Problem ist, da� der Code recht unleserlich wird. Schon eine Abfrage x > (a*b)+c verteilt sich über 2 Zeilen, wenn alle Variablen solche Konstrukte sind. Nachdem es leider ja kein define gibt... > Bei Ausgängen benötigst Du nur eine Funktion, die Dir anhand eines Index > den entsprechnden Port abfragt. > Als Bsp. aus meinem seit nunmehr fast 4 Jahre alten Provisorium: > function get(int port) returns int > { > if port>=8 return states[port]!=0; > if port>=5 and port<=7 return not rbports.get(port); > if port>=0 and port<=2 return rbports.get(port); > if port==-1 return IWP[0]; > if port==-2 return IWP[1]; > } Ich wei� nicht ganz, was Du mir damit sagen willst. Ich denke es trifft einfach nicht auf mein Beispiel zu. Bis jetzt habe ich zumindest keine Digital Eingänge. Die Analogwerte werden zyklisch berechnet und liegen sowieso in einem Array. > für die LCD-Texte kannst Du einfach ein String-Konstanten-Array mit übereinstimmenden > Indizies anlegen. Das habe ich nicht verstanden. > Prinzipiell gibt es in C2 keine Bit-Variablen und auch keine VMCodes > für den gezielten Bitzugriff. > Es bleibt hier nur das Maskieren von Bits. (siehe z.B. im Modul srrel.c2 oder rbports.c2) > Man könnte sich hier natürlich auch ASM-Routinen schreiben, aber das wäre für > ein paar Temperaturen ein unnötiger Aufwand. > Den bitadressierbaren bereich kann man aus C2 direkt nicht nutzen. Auch wird ein Teil > bereits vom OS bzw. von Systemtreibern benötigt. > > Auch wenn es natürlich Speicherverschwendungen ist, kannst Du ohne > weiteres ein Bytearray benutzen. Die CC2 hat 64kB RAM. Hier darf > man schon vereinzelt etwas verschwenderisch werden. ;-) > Und selbst bei 100 Variablen, die Du loggen willst, wären es nur 100 Byte von 64kB. > Das sind gerade etwas über 0,15% des RAMs. > Aber soviele unterschiedliche Werte werden es sicher nichteinmal sein. ;-) Ich finde das eine Schwäche. Es hätte sich angeboten ein boolean zu definieren und die Dinger in Bitfields abzulegen. Da brauchen wir gar nicht über Speicherplatz diskutieren, wenn man mal die Zeit eines HW-Bit-Befehls mit einem masking in C2 vergleicht ;-). Gru� Leo | ||
Antwort schreiben Antworten: |