Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > 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: > <code> > //-------------------------------------------------------------- > 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); > </code> > > Wenn Du den Inhalt des Datentyps 1:1 über HWCOM raussenden möchtest, > gibt es noch folgenden kleinen Trick: > <code> > //---------------------------------------- > 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); > </code> > > 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: > > > > <code> > > //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]; > > } > > > > </code> > >