Adressierung in UDT / DB

Praktiker2007

Level-1
Beiträge
6
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,
ich bin gerade dabei in SCL ein paar Funktionen für Modbus TCP zu schreiben.
Dabei bin ich auf ein kleines Problem gestossen. Ich habe einen UDT der wir folgt aussieht:
Code:
   TIH : BYTE ;     //Transaction identifier (High-BYTE)
   TIL : BYTE ;     //Transaction identifier (Low-BYTE)
   PIH : BYTE ;     //Protocol identifier (High-Byte)
   PIL : BYTE ;     //Protocol identifier (Low-Byte)
   LFH : BYTE ;    //Length field (High-BYTE)  immer 0 da Nachrichten kleiner 256BYTE 
   LFL : BYTE ;    //Length field (Low-Byte)  Anzahl der nachfolgenden Bytes 
   SLAVE : BYTE ; //Slave Adresse
   FUNCCODE : BYTE ;// Funktionscode 
                    //    01h     Read n Bits         n Bit lesen von Master-Ausgabe-Bereich 0x 
                    //    02h     Read n Bits         n Bit lesen von Master-Eingabe-Bereich 1x 
                    //    03h     Read n Words    n Worte lesen von Master-Ausgabe-Bereich 4x 
                    //    04h     Read n Words    n Worte lesen von Master-Eingabe-Bereich 3x 
                    //    05h     Write one Bit       1 Bit schreiben in Master-Ausgabe-Bereich 0x 
                    //    06h     Write one Word  1 Wort schreiben in Master-Ausgabe-Bereich 4x 
                    //    0Fh     Write n Bits         n Bit schreiben in Master-Ausgabe-Bereich 0x 
                    //    10h     Write n Words    n Worte schreiben in Master-Ausgabe-Bereich 4x 
                    //    17h     Write n Word and Read m Words 
   ADRESS : WORD ;    
   ANZAHL : WORD ;    
   ANZAHL_BYTES : BYTE ;   
   DATEN001         : BYTE ; 
   DATEN002         : BYTE ; 
   .... Bis 248
Eigentlich möchte ich die Datenxxx als Word haben dann bekomme ich aber eine Lücke von einem Byte in dem Instanz DB.
Ebenso wenn ich die Bytes als Array deklariere.
Ich habe schon probiert mit AT eine Wortweise Schablone über die Bytes zu legen aber ohne Erfolg.
Diesen Block sende ich über AG_Send an einen anderen Client. Normalerweise arbeite ich mit BEckhoff da hätte ich einfach ein Word Array mit Memcpy auf die Adresse des Ersten Bytes kopiert.
Nun nochmal die Frage:
Ich habe im Instanz db ab Byte 25 248 Byte die ich mit 124 Worten füllen mochte wie mach ich das?
Dank im Vorraus.
 
Hallo Praktiker,

aus dagobertscher Sicht gehören solche Daten in einen Global-DB. Es gibt aber für beide Varianten eine Lösung.

Wenn die Daten in einem Global-DB lägen, könntest du den jeweiligen Datensatz (UDT) als ANY an die FC übergeben. Aus dem ANY kannst du die Startadresse und somit auch die Adresse des Bytes "DATEN001" ermitteln. Mittels dieser Adresse in einer Schleife die 248 Bytes in ein temporäres ARRAY of WORD kopieren, und nach der Bearbeitung wieder zurück in den DB.

Wenn die Daten unbedingt in dem IDB bleiben sollen, dann mußt du die Adresse des Bytes "DATEN001" im IDB ermitteln. Das ginge z.Bsp. mit einer zweiten FC, der man das Byte als ANY übergibt. In dieser FC den ANY zerpflücken und die DB-Nr. sowie die Adresse zurück geben. Anschließend verfahren wie oben beschrieben. Vielleicht kennt jemand auch eine einfachere Möglichkeit, die Adresse einer Variablen im IDB in SCL zu ermitteln?

Das o.g. Hin- und Her- kopieren ist nicht gerade förderlich für die Performance. Wenn die Adresse des Bytes erst einmal bekannt ist, kannst du natürlich auch ohne Umwege direkt (bzw. indirekt) mit den Daten im IDB oder DB arbeiten. Erstes Word Adresse "n", zweites Word Adresse "n+2" usw, unabhängig ob "n" gerade oder ungerade ist.


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Dagobert,

danke für deine Anregungen. ich enke ich habe eine gangbare Lösung gefunden.
Code:
SendBuffer : ARRAY[1..262] OF Byte;
  HeaderWrite  AT SendBuffer : UDT98;
Ich habe einfach den Puffer als byte Deklariert Dadrüber die Schablone gelegt.
Vor dem senden kann ich dann die Entsprechenden Bytes im Puffer in einer Schleife um eins Verschieben.
Klappt einwandfrei und ist nicht so aufwendig.

Viele Grüße aussm Pott.
Praktiker
 
Zurück
Oben