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

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.