Array of Byte in Struktur kopieren TwinCAT

TiZe

Level-1
Beiträge
12
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich bin nach einer eleganten Lösung, um einen Array of Byte in eine Struktur zu wandeln. Ich habe die folgende Situation, dass ich einen ARRAY[1..1400] OF BYTE in die Struktur von ST_PacketScan kopieren möchte. Vorab schonmal erwähnt das ich grade erst in die Beckhoff-Welt eingestiegen bin und ein kompletter Neuling bin.

Hardware ist ein CX5020 mit dem Build 4018.XX.

Code:
TYPE ST_PacketScan :
STRUCT
    nPacketType : UINT;
    nPacketSize : UDINT;
    nHeaderSize : UINT;
    nScanNumber : UINT;
    nPacketNumber : UINT;
    nTimestapmRaw : ULINT;
    nTimestampSync : ULINT;
    nStatusFlags : UDINT;
    nScanFrequency : UDINT;
    nNumberPointScan : UINT;
    nNumberPointPacket : UINT;
    nFirstIndex : UINT;
    nFirstAngle : DINT;
    nAngularIncrement : DINT;
    nIqInput : UDINT;
    nIqOverload : UDINT;
    nMeasuredDistance : ARRAY[1..336] OF UDINT;
END_STRUCT
END_TYPE

Mein erster Ansatz war eine UNION zu benutzen in der ich den ARRAY[1..1400] OF BYTE und ST_PacketScan übereinanderlege, aber leider klappt das mit den unterschiedlichen Datentypen und deren Offsets nicht.
Nun habe ich eine Methode zum Umwandeln geschrieben, welche auch soweit funktioniert, aber da ich eben ein Anfänger bin möchte ich da gerne nach anderen, besseren Möglichkeiten fragen.

Code:
METHOD PRIVATE Packet_ArrByteToSt
VAR_INPUT
    pPacketAsByte : POINTER TO T_PacketOfScan;
END_VAR
VAR_IN_OUT
    stPacketAsSt: ST_PacketScan;
END_VAR

MEMCPY(ADR(stPacketAsSt.nPacketType), pPacketAsByte, SIZEOF(stPacketAsSt.nPacketType));
MEMCPY(ADR(stPacketAsSt.nPacketSize), pPacketAsByte+2, SIZEOF(stPacketAsSt.nPacketSize));
MEMCPY(ADR(stPacketAsSt.nHeaderSize), pPacketAsByte+6, SIZEOF(stPacketAsSt.nHeaderSize));
MEMCPY(ADR(stPacketAsSt.nScanNumber), pPacketAsByte+8, SIZEOF(stPacketAsSt.nScanNumber));
MEMCPY(ADR(stPacketAsSt.nPacketNumber), pPacketAsByte+10, SIZEOF(stPacketAsSt.nPacketNumber));

Für stPacketAsSt habe ich eine IN_OUT-Variable gewählt, damit ich den Punkt-Operator benutzen kann.

Grüße
 
Das Problem ist vermutlich tatsächlich, dass TwinCAT bei einer Struktur Füllbytes einfügt um auf ein bestimmtes Alignment zu kommen.
Versuch es mal mit folgendem Pragma:
Code:
{attribute 'pack_mode' := '0'}
Dann wäre noch die Frage, ob die Werte in dem Byte-Array die richtige Byteorder haben (Little/Big Endian)
 
Danke für deinen Vorschlag! Ich habe meine UNION entsprechend deines Vorschlags angepasst und schaut nun so aus:

Code:
{attribute 'pack_mode' := '0'}
TYPE U_PacketScan :
UNION
    stPacketScan : ST_PacketScan;
    tRawPacket : T_RawPacketAsBytes;
END_UNION
END_TYPE

Aber Leider führt das noch nicht zum gewünschten Ergebnis!
Dann wäre noch die Frage, ob die Werte in dem Byte-Array die richtige Byteorder haben (Little/Big Endian)

Wenn ich das Prinzip richtig verstanden habe sind die Werte im Array nach dem Little Endian Prinzip abgelegt. Ich füge mal einen Screenshot ein. Bei dem normalen MEMCPY() hat das funktioniert, also nehme ich an die Byteorder ist richtig?


1651490460938.png

Ach ja, soweit die Karte groß genug ist solltest Du über ein Update nachdenken. 4018 ist schon etwas arg alt, derzeit aktuell ist die 4024.
Wie sieht so ein Update aus? Wird da einfach auf dem Betriebssystem vom CX eine neue XEA/XAR installiert?
z.B. aus dem Linkt: https://www.beckhoff.com/de-de/support/downloadfinder/software-und-tools/
Wäre da auch entscheidend welches Betriebssystem installiert ist?

Beste Grüße!
 
Das Problem ist vermutlich tatsächlich, dass TwinCAT bei einer Struktur Füllbytes einfügt um auf ein bestimmtes Alignment zu kommen.
Versuch es mal mit folgendem Pragma:
Code:
{attribute 'pack_mode' := '0'}
Dann wäre noch die Frage, ob die Werte in dem Byte-Array die richtige Byteorder haben (Little/Big Endian)
Aber Leider führt das noch nicht zum gewünschten Ergebnis!
Ich hatte das wohl falsch verstanden. Das Pragma muss in die Struktur rein und nicht in die Union, richtig? Jetzt geht es auf jeden Fall! Danke! Nun kommt mir das deutlich eleganter vor, als mit dem Rumkopieren. :)
 
Wie sieht so ein Update aus? Wird da einfach auf dem Betriebssystem vom CX eine neue XEA/XAR installiert?
z.B. aus dem Linkt: https://www.beckhoff.com/de-de/support/downloadfinder/software-und-tools/
Wäre da auch entscheidend welches Betriebssystem installiert ist?
Das kommt auf das Betriebssystem an. Vermutlich ist Windows CE vorhanden, dann findest Du hier die passende ZIP-Datei für Deinen CX. Diese entpacken und auf die Karte spielen. Die Karte aber vorher löschen (Achtung, dabei gehen alle Einstellungen flöten).
 
Zurück
Oben