TIA Byte-Endianess eines ganzen PLC-Datentyps ändern

Staubsauger

Level-2
Beiträge
70
Reaktionspunkte
17
Hallo zusammen,

wir habe Standard-Geräte mit ET200SP Steuerung und Schnittstelle zum Kunden über ein Gateway. Ja nach Kundenwunsch mit Profinet, EtherCAT, Ethernet/IP.
Je nachdem welche Steuerung der Kunde verwendet, müssen die Bytes in den Schnittstellen-Variablen getauscht werden.

Für die Schnittstelle gibt es einen Datentyp, welcher direkt auf den PLC-Variablen der Steuerung liegt. Da die Schnittstelle relativ viele Variablen enthält, will ich nicht jede einzeln drehen und stelle mir daher die Frage ob man das nicht "smarter" machen kann indem man den ganzen Datentyp wandelt. Das hätte außerdem den Vorteil, dass man bei Änderung des Datentyps keine Anpassungen machen muss.

Folgender Gedanke:
Meines Wissens nach arbeiten die 1500er Steuerungen intern der optimierten Bausteine auch mit dem Little-Endian-System.
Ich stelle mir die Frage, ob man das nicht nutzen kann indem man die Daten irgendwie aus einem Datentyp in einem optimierten Speicherbereich serialisiert und dabei das Little-Endian Format beibehält.

Hat das so schon mal jemand probiert?

Bisher habe ich es mit dem SERIALIZE Befehl und Datenbausteinen mit Optimierung/ohne Optimierung versucht. Dabei legt er die Daten aber immer im Big-Endian ab. Dasselbe gilt für die AT-Sicht.
 
Ich habe sowas schon über eine Schleife gemacht.
In einen Rutsch alle mit SWAP drehen.
Dazu brauchst du aber ein Lückenlose Struktur. Also nicht das dazwischen Daten stehen die nicht gedreht werden sollen.

Wenn du es brauchst den Code einblenden, sonnst ausblenden
 
Weil die S7 1500 eben nur intern mit Little Endian arbeitet, sich aber nach außen wie eine "normale" Siemens SPS verhält. Hätte man ruhig abschneiden können, diese alten Zöpfe... naja...

Insofern ist doch die Idee mit dem Swap in einer Schleife gut? Natürlich blöd, wenn da INT, DINT und REAL auftauchen...
Aber wenn es ein Standardinterface ist, sollte es ja auch kein Problem sein mit mehreren Schleifen zu arbeiten oder schlimmstenfalls den Swap einmal händisch runtertippen für alle Variablen.
 
Die Idee mit der Schleife ist gut. Allerdings für mich nicht optimal.
Bei der Schnittstelle handelt es sich um ein "gewachsenes", abwärtskompatibles Etwas.

Daher findet man dort Bits, Ints und Reals im Mischmasch. o_O
 
Wie riesig ist die Schnittstelle? Ist das wirklich so ein Problem, einmal die nötigen Swaps händisch runter zu tippen? Am besten in 2 FC, einmal mit Swap und einmal ohne.
 
Wie riesig ist die Schnittstelle? Ist das wirklich so ein Problem, einmal die nötigen Swaps händisch runter zu tippen? Am besten in 2 FC, einmal mit Swap und einmal ohne.

Sind insgesamt 244 Bytes IN sowie OUT.

Darauf wird es wohl hinauslaufen. Ist jetzt auch kein Beinbruch.
Ich dachte nur, dass evtl. jemand eine Idee hat, wie man das besser lösen kann.
 
Sind insgesamt 244 Bytes IN sowie OUT.

Darauf wird es wohl hinauslaufen. Ist jetzt auch kein Beinbruch.
Ich dachte nur, dass evtl. jemand eine Idee hat, wie man das besser lösen kann.
Wäre es kein Mischmasch, würde das auch relativ einfach gehen. So ist es nun aber einfacher und vor allem für andere verständlicher, wenn man es einfach einmal runtertippt.
Spricht auf jeden Fall dafür in den Schnittstellen nach Bool, Int und Real zu sortieren bzw. diese zu gruppieren.
 
Vielen Dank für eure Antworten.
So wie es aussieht gibt es wohl keine Möglichkeit das automatisiert zu machen.

Ich werde für Big-Endian einfach das Struct auf die EAs kopieren und für Little-Indian die Bytes mit dem Swap-Befehl drehen.
Denke das ist das einfachste und nachher auch am besten nachzuvollziehen.
 
Ich wollte vor längere Zeit auch das auch intergrieren in unsere Standart Bausteinen.
Also einen SWAP.
Speziell für die Anbindung an fremde Leittechnik.
Mein Plan war einen Eingang am Baustein (FB) als SWAP Vorwahl an zu legen.
true ist SWAP, false ist kein SWAP. Dan hatte ich 1 FB für allles.

Ausendlich habe ich es nicht umgesetzt weil es kaum bis nicht vorkommt das ich es gebraucht habe.
 
Zurück
Oben