Re: Zugriff auf benutzerdefinierte Variablen Kategorie: Programmierung (von André H. - 26.12.2006 20:47) | ||
Als Antwort auf Zugriff auf benutzerdefinierte Variablen von Horst - 24.12.2006 12:48 | ||
| ||
Hallo Horst, > In meiner Heizungssteuerung habe ich mehrere benutzerdefinierte Variablen definiert. > > Einige dieser Varibalen setze ich um in ein Byte-Feld und diese dann über die Schnittstelle > an das Auswerteprogramm auf dem PC zu senden. > > Frage: kann ich auf die Variable im Hauptspeicher direkt zugreifen und die benutzerdef. Variable > direkt mit dem copy-Befehle in ein Bytefeld übertragen? Es gibt hier mehrere einfache Möglichkeiten, Dein Ziel zu erreichen. Wenn Du "nur" den Inhalt eines eigenen Datentyps kopieren möchtest, geht das mit einen angepassten mem.copypos()-Funktion: //-------------------------------------------------------------- inline function copy_Einstell_Vektor_byte ( byte dest[], int destpos, Einstell_Vektor src, int srcpos, int len ) //-------------------------------------------------------------- { inline vmcodes.VM_INLINE_SYSCALL+mem.Segment; inline mem._COPY; } //-------------------------------------------------------------- inline function copy_byte_Einstell_Vektor ( Einstell_Vektor dest, int destpos, byte src[], int srcpos, int len ) //-------------------------------------------------------------- { inline vmcodes.VM_INLINE_SYSCALL+mem.Segment; inline mem._COPY; } byte buffer[72]; Einstell_Vektor Daten; ... //Daten in Byte-Array kopieren: copy_Einstell_Vektor_byte(buffer,0,Daten,0,72); //Daten in eigenen Datentyp kopieren: copy_byte_Einstell_Vektor(Daten,0,buffer,0,72); Wenn Du den Inhalt des Datentyps 1:1 über HWCOM raussenden möchtest, gibt es noch folgenden kleinen Trick: //---------------------------------------- function send ( Einstell_Vektor buf[], int length ) //---------------------------------------- { capture; wait hwcom.ready(); inline vmcodes.VM_LOAD_LOCAL_INT; inline -8; inline vmcodes.VM_LOAD_LOCAL_INT; inline -6; inline vmcodes.VM_HWCOM | (vmcodes.HWCOM_SEND << 8); release; } ... send(Daten,72); Als Hintergrund: Eigene Datentypen werden, wie auch Strings, als Arrays behandelt. Bei �bergabe an Funktionen wird lediglich der Offset in Byte der Variabel einer Funktion übergeben. Somit kann man nahezu alle Grundfunktionen für Arrays auch bei eigenen Datentypen anwenden. MfG André H. > > Hier ein Beispiel wie es momentan programmiert ist: > > > //Konstanten für Einstell_Vektor > const EV_lang = (2*4) + (11*2) + 42; //Anzahl der Bytes: 72 > const EV_V1 = 1; > const EV_V2 = 0; > type Einstell_Vektor > { > byte Version_gr; > byte Version_kl; > long Prog_Datum; > long Prog_Zeit; > int MischerKenn_x2; > int MischerKenn_x1; > int MischerKenn_x0; > int HeizKenn_x2; > int HeizKenn_x1; > int HeizKenn_x0; > byte Mischerfaktor; > byte Mischer_max_Laufzeit; > byte Mischer_min_Zeit; > byte Mischer_Wartezeit; > byte Mischer_Toleranz; > byte Aufheiztag; > int Konfiguration; > int Zustand; > int Aufheiztemp; > int Zeitversatz_Kamin_Brenner; > byte Durch_Std_von; > byte Durch_Std_bis; > int Durch_Temp; > byte Zu_R[16]; > byte Zu_T[16]; > } > > //Fuktion zum Umsetzen der Variable in Bytefeld > // zum �bertragen an PC > function EinstV_to_Umsetz() > { > byte i; > //Schreibt den Einstell-Vektor in Umsetz-Bytearray > um[0] = Einst.Version_gr; > um[1] = Einst.Version_kl; > mem.putlong(um, 2, Einst.Prog_Datum); > mem.putlong(um, 6, Einst.Prog_Zeit); > mem.putint(um, 10, Einst.MischerKenn_x2); > mem.putint(um, 12, Einst.MischerKenn_x1); > mem.putint(um, 14, Einst.MischerKenn_x0); > mem.putint(um, 16, Einst.HeizKenn_x2); > mem.putint(um, 18, Einst.HeizKenn_x1); > mem.putint(um, 20, Einst.HeizKenn_x0); > um[22] = Einst.Mischerfaktor; > um[23] = Einst.Mischer_max_Laufzeit; > um[24] = Einst.Mischer_min_Zeit; > um[25] = Einst.Mischer_Wartezeit; > um[26] = Einst.Mischer_Toleranz; > um[27] = Einst.Aufheiztag; > mem.putint(um, 28, Einst.Konfiguration); > mem.putint(um, 30, Einst.Zustand); > mem.putint(um, 32, Einst.Aufheiztemp); > mem.putint(um, 34, Einst.Zeitversatz_Kamin_Brenner); > um[36] = Einst.Durch_Std_von; > um[37] = Einst.Durch_Std_bis; > mem.putint(um, 38, Einst.Durch_Temp); > for i = 0...15 > um[40 + i] = Einst.Zu_R[i]; > for i = 0...15 > um[56 + i] = Einst.Zu_T[i]; > } > > //Funktion zum Umsetzen der Daten vom PC in benutzetrdef. Variable > function Umsetz_to_EinstV() > { > byte i; > //Schreibt das Bytefeld in Einstell-Vektor um > Einst.Version_gr = um[0]; > Einst.Version_kl = um[1]; > Einst.Prog_Datum = mem.getlong(um, 2); > Einst.Prog_Zeit = mem.getlong(um, 6); > Einst.MischerKenn_x2 = mem.getint(um, 10); > Einst.MischerKenn_x1 = mem.getint(um, 12); > Einst.MischerKenn_x0 = mem.getint(um, 14); > Einst.HeizKenn_x2 = mem.getint(um, 16); > Einst.HeizKenn_x1 = mem.getint(um, 18); > Einst.HeizKenn_x0 = mem.getint(um, 20); > Einst.Mischerfaktor = um[22]; > Einst.Mischer_max_Laufzeit = um[23]; > Einst.Mischer_min_Zeit = um[24]; > Einst.Mischer_Wartezeit = um[25]; > Einst.Mischer_Toleranz = um[26]; > Einst.Aufheiztag = um[27]; > Einst.Konfiguration = mem.getint(um, 28); > Einst.Zustand = mem.getint(um, 30); > Einst.Aufheiztemp = mem.getint(um, 32); > Einst.Zeitversatz_Kamin_Brenner = mem.getint(um, 34); > Einst.Durch_Std_von = um[36]; > Einst.Durch_Std_bis = um[37]; > Einst.Durch_Temp = mem.getint(um, 38); > for i = 0...15 > Einst.Zu_R[i] = um[40 + i]; > for i = 0...15 > Einst.Zu_T[i] = um[56 + i]; > } > > > Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: |