Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0, OSOPT V3.1
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: