Modbus Exception Codes 01 bis 0B: Bedeutung und Behebung
· Von Vladimir Chemeris, Entwickler von Modbus TCP FieldKit
Kurzantwort: Eine Modbus Exception ist eine gültige Antwort, die sagt: Das Gerät hat den Frame verstanden und lehnt ihn ab. Der Function Code kommt mit addiertem 0x80 zurück, gefolgt von einem Byte mit dem Code. 83 02 heißt: Function 03 ist mit Exception 02, Illegal Data Address, fehlgeschlagen. Eine Exception beweist, dass die Verbindung funktioniert, Sie müssen das Netzwerk also nicht weiter prüfen.
So lesen Sie eine Exception
Eine Exception-Antwort umfasst bei Modbus TCP 9 Bytes. Ein Server mit pymodbus 3.16.1 sendete diese, als wir eine Adresse abfragten, die er nicht hat:
TX 00 03 00 00 00 06 01 03 00 64 00 01
RX 00 03 00 00 00 03 01 83 02
Das Längenfeld enthält 3: die Unit-ID, 83 und 02. Fügen Sie einen Frame in den Frame-Decoder ein, dann benennt er die Felder.
Die Codes
Die Tabelle listet die Codes aus Abschnitt 7 der Spezifikation. Die Bedeutung stammt von dort, die Spalte mit den Lösungsvorschlägen von uns.
| Code | Name | Häufige Ursache | Vorgehen |
|---|---|---|---|
01 |
Illegal Function | Das Gerät unterstützt diesen Function Code hier nicht oder ist noch nicht konfiguriert | Prüfen Sie im Handbuch, welche Function Codes aufgeführt sind. Eingangsregister brauchen 04, Holding-Register 03 |
02 |
Illegal Data Address | Adresse plus Anzahl liegt außerhalb der Register-Map | Prüfen Sie zuerst die Nummerierung, dann verringern Sie die Anzahl. Lesen Sie ein Register nach dem anderen, um die Grenze zu finden |
03 |
Illegal Data Value | Eine fehlerhaft aufgebaute Anfrage: ungültige Anzahl oder Byte-Anzahl | Bleiben Sie bei höchstens 125 Registern pro Lesezugriff und 123 pro Schreibzugriff |
04 |
Server Device Failure | Das Gerät ist beim Ausführen der Anfrage auf einen internen Fehler gestoßen | Sehen Sie am Gerät selbst nach. Manche Server verwenden den Code auch für eine Unit-ID, die sie nicht bedienen |
05 |
Acknowledge | Angenommen, die Ausführung dauert lange | Wird mit Programmierbefehlen verwendet. Im normalen Polling selten |
06 |
Server Device Busy | Mit einem langen Programmierbefehl beschäftigt | Später erneut versuchen und das Polling verlangsamen |
08 |
Memory Parity Error | Das Lesen eines File Records hat eine Konsistenzprüfung nicht bestanden | Nur bei den Function Codes 20 und 21. Lassen Sie das Gerät warten |
0A |
Gateway Path Unavailable | Das Gateway konnte keinen Pfad zum Ausgangsport zuweisen | Prüfen Sie Konfiguration und Auslastung des Gateways |
0B |
Gateway Target Device Failed to Respond | Das Gateway erhielt keine Antwort vom Gerät dahinter | Prüfen Sie Unit-ID, serielle Einstellungen und Verkabelung |
Code 07, Negative Acknowledge, steht in älteren Referenzen und in manchen Bibliotheken, aber nicht in der Tabelle der V1.1b3.
Exception 03 bedeutet nicht „ungültiger Wert“
Die Spezifikation ist eindeutig: 03 „specifically does NOT mean that a data item submitted for storage in a register has a value outside the expectation of the application program“ (sinngemäß: 03 bedeutet ausdrücklich nicht, dass ein zum Speichern übergebener Wert außerhalb der Erwartung des Anwendungsprogramms liegt). Der Code meldet ein strukturelles Problem der Anfrage. Schreiben Sie 9999 in ein Register, das 0 bis 100 akzeptiert, kann ein Gerät den Wert rechtmäßig annehmen, ihn mit eigener Herstellerlogik ablehnen oder ihn begrenzen. Lesen Sie das Register nach dem Schreiben zurück.
Was ein echter Server getan hat
Wir haben mit Raw-Sockets gezielt fehlerhafte Anfragen an pymodbus 3.16.1 gesendet. Einige Antworten weichen von der Spezifikation ab, prüfen Sie also auch Ihren eigenen Stack:
| Anfrage | Laut Spezifikation | pymodbus 3.16.1 antwortete |
|---|---|---|
| Adresse 100 lesen bei einer Map mit 100 Registern | 83 02 |
83 02 |
| 126 Register lesen | 83 03 |
80 01 |
Nicht definierter Function Code 63 |
E3 01 |
80 01 |
Write Single Coil mit dem Wert 0001 |
85 03 |
05 00 00 FF 00, als ON behandelt |
| Unit-ID, die der Server nicht hat | Keine Regel für direktes TCP | 83 04 |
Ein Client, der nur auf fc + 0x80 prüft, übersieht die Antworten 80 01. Eine Testsuite, die auf einem Simulator aufbaut, kann bestehen und an einem echten Gerät dennoch scheitern.
Gateways verändern das Bild
Hinter einem Gateway von TCP auf RS-485 sehen zwei verschiedene Fehler von Ihrem Laptop aus gleich aus: ein ausgefallenes serielles Gerät und eine falsche Unit-ID. Ein Gateway, das der Spezifikation folgt, antwortet in beiden Fällen mit 0B. Viele bleiben stattdessen stumm, und Ihr Client meldet einen Timeout. Siehe Modbus-TCP-Timeouts.
Quellen
- Modbus Application Protocol Specification V1.1b3, Abschnitt 7
- Frames aufgezeichnet am 30. Oktober 2026 von pymodbus 3.16.1 unter Linux
FAQ
Was bedeutet Exception 02?
Illegal Data Address. Die Adresse oder die Adresse plus Anzahl liegt außerhalb dessen, was das Gerät bereitstellt. Üblicher Grund ist ein Nummerierungsfehler, etwa 40001 statt 0 zu senden, oder ein Lesezugriff über das Ende eines Blocks hinaus.
Woran erkenne ich eine Exception-Antwort?
Der Function Code kommt mit gesetztem höchsten Bit zurück, aus 03 wird also 83, und das nächste Byte enthält den Exception-Code. Ein TCP-Frame, der mit 83 02 endet, ist Exception 02 auf eine Anfrage mit Function 03.
Was ist der Unterschied zwischen Exception 0A und 0B?
Beide kommen von einem Gateway. 0A bedeutet, dass das Gateway keinen Pfad zuweisen konnte, was auf seine Konfiguration oder Auslastung hindeutet. 0B bedeutet, dass das Gateway keine Antwort vom Zielgerät erhielt, was auf eine falsche Unit-ID oder eine tote serielle Leitung hindeutet.