Modbus ist ein Kommunikationsprotokoll, welches als Quasi-Standard in der Automatisierungstechnik gilt. Es basiert auf binärer Datendarstellung und nutzt einen Master-Slave-Mechanismus (Client-Server-Architektur). Das Prinzip der Datenübertragung dabei ist einfach: Adresse, Befehlscode, Längenangabe, Dateninhalt und Checksumme bilden die Pakete. Dies lässt sich universell nutzen und erklärt die große Verbreitung.
Doch warum kommt es immer wieder zu Unstimmigkeiten in Sachen Modbus-Kommunikation?
Wer ist dieser Groß-Ender?
Nein, bei Modbus geht es nicht um Rotwild. Hier geht es nicht um Zwölfender, sondern um die Reihenfolge der Datendarstellung, also um die „Endianness“ bzw. „byte order“.
Gerade weil Modbus so ein einfaches und universelles Protokoll ist, hat man dabei mit unterschiedlichen Rechner- und Speicherarchitekturen zu tun. Hier kommt die Endianness ins Spiel.
Modbus nutzt 16 bit-Register zum Datenaustausch. Die kleinste Einheit ist hier also 16 bit bzw. 2 Byte groß. In 8 bit-Architekturen werden daher zwei Speichereinheiten zusammengefasst. Hier stellt sich zum ersten Mal die Frage der Reihenfolge.
Wenn zwei Teilwerte zu einem Gesamtwert zusammengefügt werden, wie hier zwei 8 bit-Werte zu einem 16 bit-Wert, muss man sich über deren Reihenfolge Gedanken machen. Nehmen wir beispielsweise den Wert 4660 (oder hexadezimal 0x1234). Dieser 16 bit-Wert besteht aus den 8 bit-Werten 0x12 und 0x34. Im Speicher können diese aber so abgelegt sein:
Speicheradresse | Big-Endian | Little-Endian |
1 | 0x12 | 0x34 |
2 | 0x34 | 0x12 |
Big-Endian bedeutet hier, dass der höchstwertige Teil an der niedrigsten Speicheradresse steht und somit die Darstellung sich an der klassischen, arabischen Zahlennotation orientiert. Die vorn stehenden Ziffern (z.B. Tausender) haben eine höhere Wertigkeit als die hinten (z.B. Einer).
Little-Endian bedeutet, dass der niederwertigste Teil an der niedrigsten Speicheradresse steht. Dies widerspricht der klassischen, arabischen Zahlennotation, folgt jedoch eher der Verarbeitungsreihenfolge bei Rechnungen, nämlich, dass wie bei der schriftlichen Addition an der Einer-Stelle begonnen wird. Arithmetisch kann dies Vorteile bringen und wird daher in allen x86-kompatiblen Rechnerarchitekturen verwendet, also auch Ihrem PC.
Als Analogie wird oft Datum und Uhrzeit angegeben. Das Datum ist im deutschsprachigem Raum Little-Endian, also der niederwertigste Wert Tag zuerst: 01.02.2003. Die Uhrzeit hingegen ist Big-Endian: 12:34.
Für den Modbus ist dies relevant weil fast immer eine serielle Kommunikation mit 8 Bit Datenbreite genutzt wird. Selbst bei Modbus TCP wird der Dateninhalt wie bei einer seriellen Kommunikation angeordnet.
Vermutlich wegen der Lesbarkeit im Datenstrom, vielleicht auch wegen der Architektur früherer SPSen, nutzt Modbus die Big-Endian-Darstellung. Daher wird das höherwertige Byte zuerst übertragen: erst die 0x12 und dann die 0x34. Trifft Modbus so auf eine typische x86-Architektur am PC kommt es zum Konflikt, da dieser zuerst die 0x34 im Speicher hat oder in den Speicher schieben will. Hier muss gedreht bzw. vertauscht werden („swapping“).
Für 16 bit-Werte muss man sich also die Reihenfolge der Einzelbytes anschauen und ggf. swappen. Geht man auf größere Wertebereiche, wie 32 bit-Werte oder gar 64 bit-Werte, potenziert sich diese Variabilität. Jedoch wird man nicht alle Kombinationen finden, da die Architektur sich in der Regel in ihren Endianness treu bleiben.
Aber nun konkret ein Beispiel: Nehmen wir die Zahl 305419896 oder hexadezimal 0x12345678. Die Bytereihenfolge kann dann so aussehen:
Reihenfolge | Modbus | Big-Endian | Big-Mix* | Little-Mix* | Little-Endian |
1 | 0x12 | 0x12 | 0x34 | 0x56 | 0x78 |
2 | 0x34 | 0x34 | 0x12 | 0x78 | 0x56 |
3 | 0x56 | 0x56 | 0x78 | 0x12 | 0x34 |
4 | 0x78 | 0x78 | 0x56 | 0x34 | 0x12 |
*Phantasienamen
Und somit ergibt sich schnell die Möglichkeit, dass eine Software auf einer SPS oder einem PC die Zahl nicht als 0x12, 0x34, 0x56, 0x78 im Modbus überträgt, sondern sei es aus Unachtsamkeit oder falschem Sachverstand eben als 0x78, 0x56, 0x34, 0x12 (dezimal 2018915346) oder gar eine der Mischformen. Da ist es gut, wenn man die Möglichkeit des Swappen hat, zumindest um von Big auf Little umzustellen.
Bei unseren Modbus-Gateways können Sie das Swapping von Big-Endian auf Little-Endian umstellen. Dafür dient der Schalter “Modbus swap”. Ist dieser aktiviert, dann wird die Little-Endian-Darstellung genutzt.
Wie sagt man so schön: Dies war der erste Streich und der zweite folgt zugleich! Im zweiten Teil unseres Modbus-Leitfadens geht es um die richtige Adressierung der Register bzw. der Speicherstellen.
PDF | 232 kB