INT / DINT in Array of Byte kopieren

smartie

Level-1
Beiträge
298
Reaktionspunkte
22
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich arbeite in der Regel mit dem TIA Portal und muss nun für ein aktuelles Projekt auch ein wenig an Codesys arbeiten.
Die normalen IF, THEN, ELSE Anweisungen sollten eigentlich kein Problem darstellen. - Allerdings habe ich etwas Probleme mit der Typkonvertierung.

Bei meinem Projekt habe ich Daten die vom Feldbus in ein Array of Byte eingelesen werden. Diese Daten will ich in eine Struktur mit unterschiedlichen Datentypen mappen.
Bit und Byte Zugriffe sind dabei kein Problem. Was ich aber nicht verstehe, bzw. wo ich mir nicht sicher bin, ist wie ich ein INT auf zwei Bytes im Array aufteile.

Das habe ich jetzt so gelöst, kann es aber nicht testen:

Code:
    temp:= INT_TO_WORD(st_Transportband.Status_Umrichter);
    ProfiNetOutData[PDNo_Transportband+2] := WORD_TO_BYTE(SHR(temp,8));
    ProfiNetOutData[PDNo_Transportband+3] := WORD_TO_BYTE(temp);

Die Variable Status_Umrichter ist Teil meiner Struktur und vom Typ Integer.
Die Variable temp ist eine lokale Variable meines Programms.

Einen Fehler bekomme ich nicht angezeigt und für mein Verständnis müsste das so funktionieren. Nur kann ich es nicht testen, muss mein Programm aber weiter vorbereiten.
Kann mir jemand sagen ob das so funktionieren wird?

Das größere Problem ist wie ich ein DINT auf 4 Bytes im Array verteilen kann. Da stehe ich im Moment voll am Schlauch, bzw. bin mir einfach unsicher weil ich das noch nie gemacht habe.
Kann mir bitte jemand auf die Sprünge helfen?

Gruß smartie
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Ausgangsdaten müssen in einem Array of Byte abgelegt werden, weil das so vom Hersteller der Servoachsen vorgegeben ist.

Also will ich jetzt die Daten vom Array in meine Struktur kopieren bzw. aus meiner Struktur in das Array, damit ich in meinem Programmteil nicht direkt in das Array schreiben muss.
Das erscheint mir übersichtlicher.
 
Eigentlich geht das ganz einfach. Du legst Dir eine Struktur mit allen benötigten Daten an. Diese füllst Du und überträgst Sie dann mit memcpy in das Array. Funktioniert natürlich nur solange die Byteausrichtung die Selbe ist.
Nachtrag: Oben in der Struktur muss noch ein Pragma eingefügt werden, damit keine Lücken zwischen den Daten eingefügt werden.

Von irgendwas mit Internetzugang gesendet.
 
Zuletzt bearbeitet:
Allerdings habe ich etwas Probleme mit der Typkonvertierung.

Bei meinem Projekt habe ich Daten die vom Feldbus in ein Array of Byte eingelesen werden. Diese Daten will ich in eine Struktur mit unterschiedlichen Datentypen mappen.
Achtung: Du willst nicht Typen konvertieren sondern typlose Bytes in getypte Variablen kopieren - das ist nicht dasselbe, und Du mußt aufpassen, daß Dir das Codesys nicht mit automatischen Konvertierungen dazwischenpfuscht.

Du könntest wie in TIA-SCL per AT eine Byte-Array-Sicht über die Struktur legen und die Bytes in das AT-Byte-Array kopieren. (Kennt Dein Codesys UNIONs?)
Wenn die Bytes in der richtigen Reihenfolge im Quell-Array liegen kannst Du auch MEMCPY verwenden.
In Codesys kannst Du auch Pointer verwenden, z.B. mit einem "POINTER TO DINT" 4 aufeinanderfolgende Bytes aus dem Quell-Array lesen.

Harald
 
Hab ich jetzt auch gesehen, sorry.
Soweit die Byteorder der Profibusdaten und Codesys gleich ist, geht der umgekehrte Weg auch relativ einfach. Entweder eine Struktur, passend zur Antwort anlegen und dann alles in einem Rutsch reinkopieren, oder jedes Element einzeln mit memcpy kopieren.

Von irgendwas mit Internetzugang gesendet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erst mal danke für die Antworten. Mit der Funktion MemCpy bzw. SysMemCpy habe ich auch erst etwas herumgespielt.
Die hätte auch den Vorteil das ich nicht jeden Eintrag einzeln kopieren muss.

Ich könnte dann die einzelnen Strukturen der Servoachsen an die entsprechenden Stellen im Array kopieren.
Allerdings War ich mir nicht sicher ob das funktioniert da ich es ja nicht testen kann.
Und je nachdem wie die Byteorder ist muss ich die Byte Reihenfolge korrigieren. Deswegen dachte ich mir das ich erst mal den aufwändigen Weg gehe, bevor ich dann während der IBN anfange alles über den Haufen zu werfen.

Der Vorschlag von PN/DP würde mich näher interessieren. Den Datentyp Unions gibt es wohl.
Allerdings verstehe ich nicht ganz wie du das meinst. Ich habe SCL im TIA bisher nur für kleine Schleifen oder ähnliches verwendet.

Gruß smartie
 
Guten Morgen

ich habe es jetzt mit dem UNION probiert. Das scheint zu funktionieren und erschließt sich mir auch. Darüber müsste ich dann ja auch die Byte-Reihenfolge ändern können, falls notwendig.
Ich werde es jetzt mal so ohne sysmemcpy aber mit UNION umsetzen, ist zwar etwas mehr Schreibarbeit, aber ich bin flexibler was die Anordnung meiner Daten im Array betrifft.

Dieses Union habe ich angelegt:
Code:
TYPE st_ProfiNetUnion : UNION
    PN_DWord : DWORD;
    PN_Real : REAL;
    PN_Word : st_ProfiNetStructWord;
    PN_Byte : st_ProfiNetStructByte;
END_UNION
END_TYPE

st_ProfiNetStructByte:
Code:
 TYPE st_ProfiNetStructByte :STRUCT
    Byte0:BYTE;
    Byte1:BYTE;
    Byte2:BYTE;
    Byte3:BYTE;
END_STRUCT
END_TYPE

Variablendeklaration:
Code:
 temp : ProfinetUnion;

Verwendung im Programm:
Code:
    temp.PN_Word := st_Transportband.Status_Umrichter;    
    ProfiNetOutData[PDNo_Transportband+2] := temp.PN_Byte.Byte0;
    ProfiNetOutData[PDNo_Transportband+3] := temp.PN_Byte.Byte1;

Danke!
 
Zurück
Oben