Re: Daten loggen Kategorie: Programmierung (von André H. - 2.09.2006 16:34) | ||
Als Antwort auf Re: Daten loggen von Leo - 26.07.2006 10:14 | ||
| ||
Hallo Leo, > Ich dachte mir schon, da� es keine einfache Lösung gibt. > Es sollen die unterschiedlichsten Variablen der Heizungsregelung geloggt werden können, also von > Termpaturen über Outputs der Regelkreise bis zu Ansteuerzustand von Pumpen. > Diese Variablen sind natürlich quer über die Module verteilt. Ich werde sicher nicht den modularen > Aufbau opfern, sonst kenne ich mich über kurz oder lang in meine eigenen Programm nicht mehr aus. Dumu�t nicht den Modularen Aufbau opfern. Allerdings rate ich dennoch immer ein eigenes Modul z.B. mit dem Namen var.c2 anzulegen, in dem alle globalen, aus mehreren Modulen genutzten Variablen angelegt werden. Dazu kannst Du noch eine eben höher ein Modul konst.c2 anlegen. So kann man dann folgende Konstrukte machen: var.temp[konst.puffer_oben]=x; in var.c2 ist ein Array temp[] mit dern nötigen Grö�e angelegt. In konst.c2 legst Du dann einfach Konstanten mit den nötigen Indizies an. 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]; } > Momentan schwebt mir eher vor eine beschränkgte Anzahl an logbaren Variablen zu haben und für jede > Variable ein Bit zu reservieren, das angibt, ob die Variable nun geloggt werden soll oder nicht. > Natürlich mu� es pro Variable auch einen String mit deren Namen geben (sonst kann man's auf der > Station ja nicht im Menü auswählen). > Die zum loggen gekennzeichneten Variablen werden dann einfach in einer zyklischen Log-Routine ins > RAM-Device kopiert. > Um die Sache nicht zu komplizhieren sind alle logbaren Variablen Integer oder werden zu Integer auf- > geblasen. Es gibt momentan keine Motivation Datentypen unterschiedlicher Länge zu implementieren. Wie gesagt, ist es dann das einfachste, einfach die globalen Variablen für Temperaturen in ein Array zu packen, um sie dann über einen Index ansprechen zu können. für die LCD-Texte kannst Du einfach ein String-Konstanten-Array mit übereinstimmenden Indizies anlegen. > Jetzt mu� ich mich nur noch schlau machen wie man in C2 bits anspricht. Es geht mir schon länger auf > die Nerven für jede boolsche Variable ein Byte zu verwenden. Wo ich doch glaube, da� der µC Bits und > Bitfields unterstützt (so diese im Bitadressierbaren Bereich liegen). Bei einzelnen boolschen Variablen > kann ich es verschmerzen Bytes zu verwenden. Aber wenn ich jetzt ein Array von boolean für das > log-flag brauche, mu� ich mich mir was einfallen lassen ;-). 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. ;-) MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: Daten loggen (von Leo - 28.09.2006 16:59) |