Modbus Frame-Decoder
Fügen Sie die Hex-Bytes eines Modbus-RTU-, TCP- oder ASCII-Frames ein. Der Decoder zerlegt sie in Felder, prüft die CRC, ordnet Antworten ihren Anfragen zu und erklärt Exception-Codes.
Frames
BeispielRTU mit CRC, TCP mit MBAP-Header oder ASCII mit führendem Doppelpunkt. Mehrere Frames jeweils in eine eigene Zeile. Hex-Streams und Hex-Dumps aus Wireshark sowie Logs aus Modbus Poll funktionieren unverändert.
Zerlegte Frames
Läuft komplett in Ihrem Browser. Ihre Eingaben werden an keinen Server gesendet.
So sind Modbus-Frames aufgebaut
Modbus RTU
| Teil | Bytes |
|---|---|
| Geräteadresse (Unit-ID) | 1 |
| Funktionscode | 1 |
| Daten | 0–252 |
| CRC, niedriges Byte zuerst | 2 |
Modbus TCP
| Teil | Bytes |
|---|---|
| Transaktions-ID | 2 |
| Protokoll-ID, immer 0 | 2 |
| Länge: Unit-ID + PDU | 2 |
| Geräteadresse (Unit-ID) | 1 |
| Funktionscode | 1 |
| Daten | 0–252 |
Modbus ASCII
| Teil | Bytes |
|---|---|
| : | 1 |
| Geräteadresse (Unit-ID) | 2 |
| Funktionscode | 2 |
| Daten | 0–504 |
| LRC | 2 |
| CR LF | 2 |
Der Teil vom Funktionscode bis zum Ende der Daten heißt PDU und ist in allen drei Varianten gleich. Registerwerte werden mit dem höherwertigen Byte zuerst gesendet, nur die RTU-CRC mit dem niedrigen Byte zuerst.
So liest der Decoder einen Frame
Zuerst sucht er die Hülle. Ein RTU-Frame endet mit einer CRC, die zu den Bytes davor passt. Ein TCP-Frame beginnt mit einem 7 Byte langen MBAP-Header, dessen Längenfeld zum Rest passt. Ein ASCII-Frame beginnt mit einem Doppelpunkt. Innerhalb der Hülle bestimmt der Funktionscode, wie der Rest aufgebaut ist. Anfrage und Antwort derselben Funktion sind unterschiedlich aufgebaut, daher kann der Decoder sie unterscheiden, und er ordnet jede Antwort der Anfrage davor zu.
Eine Antwort auf eine Leseanfrage enthält nur die Werte, nicht die Startadresse. Fügen Sie die Anfrage zusammen mit der Antwort ein, dann zeigt der Decoder die echten Registernummern. Mit einem Klick öffnen Sie die Werte im Register-Decoder, der Floats, 32-Bit-Werte und die Byte-Reihenfolge findet.
Häufige Fehler
- Exception 02, obwohl das Register existiert. Meist ist die Adresse um eins verschoben: Register 40001 ist im Frame Adresse 0. Der Adress-Umrechner zeigt beides.
- Gar keine Antwort. Ein Gerät schweigt, wenn die CRC falsch ist, die Geräteadresse nicht passt oder Baudrate und Parität abweichen. Findet der Decoder die Anfrage korrekt, liegt der Fehler in Verdrahtung oder Schnittstelleneinstellungen. Der CRC-16-Rechner baut einen korrekten Frame zum Testen.
- Ganzes Ethernet-Paket eingefügt. Kein Problem. Der Decoder überspringt Ethernet-, IP- und TCP-Header, wenn die IPv4-Prüfsumme stimmt. Mehrere Pakete jeweils in eine eigene Zeile.
- Antworten der falschen Anfrage zugeordnet. Bei Modbus TCP ordnet die Transaktions-ID eine Antwort ihrer Anfrage zu. Ein Client, der IDs zu früh wiederverwendet, bekommt verwirrende Ergebnisse, ebenso ein Log, in dem Anfragen und Antworten nicht der Reihe nach stehen.
Fragen aus der Praxis
Was steht im MBAP-Header von Modbus TCP?
Sieben Bytes: Transaktions-ID (2), Protokoll-ID (2, immer 0), Länge (2) und Unit-ID (1). Die Länge zählt die Bytes danach, also Unit-ID plus PDU. 00 01 00 00 00 06 11 bedeutet Transaktion 1, Modbus-Protokoll, 6 Bytes folgen, Unit 17.
Wie kopiere ich einen Modbus-Frame aus Wireshark?
Klicken Sie in den Paketdetails mit der rechten Maustaste auf die Zeile Modbus/TCP und kopieren Sie sie als Hex-Stream, oder kopieren Sie die Bytes des ganzen Pakets. Beides funktioniert: Der Decoder erkennt Ethernet-, IPv4- und TCP-Header und überspringt sie. Ein Hex-Dump mit Offsets und ASCII-Spalte funktioniert ebenfalls.
Warum zeigt eine zerlegte Antwort keine Registernummern?
Eine Leseantwort enthält die Byteanzahl und die Werte, sonst nichts. Aus welchen Registern sie stammen, steht nur in der Anfrage. Fügen Sie die Anfrage in die Zeile über der Antwort ein, dann ordnet der Decoder beide zu, nummeriert die Register und gibt die Startadresse an den Register-Decoder weiter.
Was ist der Unterschied zwischen Modbus TCP und RTU over TCP?
Modbus TCP setzt den 7 Byte langen MBAP-Header vor die PDU und hat keine CRC. RTU over TCP schickt den unveränderten seriellen Frame samt Geräteadresse und CRC durch eine TCP-Verbindung. Ein Client mit der falschen Variante bekommt keine Antwort. Der Decoder kann beides: Ein Frame mit gültiger CRC wird als RTU gezeigt, egal wie er übertragen wurde.
Was bedeutet Exception-Code 0B?
Gateway Target Device Failed to Respond: Das Modbus-TCP-Gateway hat die Anfrage empfangen und auf die serielle Leitung geschickt, aber das Gerät dahinter hat nicht rechtzeitig geantwortet. Prüfen Sie, ob die Unit-ID der Adresse des seriellen Geräts entspricht, dann Baudrate und Parität des Gateways und die RS-485-Verdrahtung. Code 0A bedeutet, dass das Gateway nicht einmal wusste, wohin es die Anfrage schicken soll.
Verwandte Werkzeuge
- Register-DecoderFloat32, Int32, UInt16 und Bits in jeder Byte-Reihenfolge, dazu „Wert finden“.
- Adress-Umrechner40001 ↔ Offset 0, Schreibweise 4x/3x/0x/1x, 5- und 6-stellige Adressen.
- Wert-KodiererEinen Wert wie 230.5 in Register für jede Byte-Reihenfolge umwandeln.
- CRC-16-RechnerModbus-RTU-Prüfsumme in Übertragungsreihenfolge, dazu eine vollständige Frame-Prüfung.
- Funktions- & FehlercodesWas jeder Code bedeutet und was in der Praxis meist dahintersteckt.