PLCBytes
Modbus-Werkzeuge

Modbus Funktions- und Exception-Codes

Geben Sie einen Funktionscode, einen Exception-Code oder eine ganze Antwort ein und sehen Sie, was er bedeutet und was ihn meist verursacht. Die vollständige Liste folgt darunter.

Code nachschlagen

Beispiel

Dezimal oder hex: 3, 16, 0x10, 0B. Eine Exception-Antwort wie 83 02 oder ein ganzer Frame wie 01 83 02 C0 F1.

Bedeutung

Läuft komplett in Ihrem Browser. Ihre Eingaben werden an keinen Server gesendet.

Modbus-Funktionscodes

Funktionscodes werden dezimal (FC 16) und hex (0x10) geschrieben, beides bedeutet dasselbe. Die Codes 65–72 und 100–110 sind Herstellern für eigene Funktionen überlassen.

01 Coils lesen (Read Coils)

0x01 · Coils (0x)

Liest 1 bis 2000 Ausgangsbits (Coils). Die Anfrage enthält Startadresse und Anzahl, die Antwort eine Byteanzahl und die Bits zu je 8 pro Byte, die erste Adresse im niedrigsten Bit.

Coils sind Relaisausgänge oder schaltbare Merker. Viele Zähler und Wechselrichter haben gar keine Coils und legen Statusbits in Holding-Register. Antwortet 01 mit Exception 01, suchen Sie das Register, das das Bit enthält.

02 diskrete Eingänge lesen (Read Discrete Inputs)

0x02 · Diskrete Eingänge (1x)

Liest 1 bis 2000 schreibgeschützte Eingangsbits (diskrete Eingänge), gepackt zu je 8 pro Byte wie Coils.

Typisch für digitale Eingänge von I/O-Modulen und SPS. Zähler und Wechselrichter nutzen sie selten, sie melden Zustände in Registern.

03 Holding-Register lesen (Read Holding Registers)

0x03 · Holding-Register (4x)

Liest 1 bis 125 aufeinanderfolgende 16-Bit-Holding-Register. Die Anfrage enthält Startadresse und Anzahl, die Antwort eine Byteanzahl und zwei Bytes pro Register, höherwertiges Byte zuerst.

Die mit Abstand meistgenutzte Funktion. Die meisten Zähler, Wechselrichter und Umrichter legen alles in Holding-Register, auch schreibgeschützte Messwerte. Exception 02 bedeutet meist eine um eins verschobene Adresse oder ein Lesen über eine Lücke in der Registerkarte.

04 Input-Register lesen (Read Input Registers)

0x04 · Input-Register (3x)

Liest 1 bis 125 schreibgeschützte 16-Bit-Input-Register. Die Frames sehen genau aus wie bei Funktion 03.

Manche Geräte legen Messwerte in Input-Register und Einstellungen in Holding-Register. Liefert 03 Exception 02 oder nur Nullen, versuchen Sie 04 an derselben Adresse, und umgekehrt.

05 einzelne Coil schreiben (Write Single Coil)

0x05 · Coils (0x)

Schaltet eine Coil. Der Wert ist FF 00 für EIN und 00 00 für AUS, alles andere ist ungültig. Die Antwort ist eine exakte Kopie der Anfrage.

00 01 für EIN zu senden ist ein häufiger Fehler und endet mit Exception 03. Manche Geräte nutzen eine Coil für einmalige Aktionen, etwa das Zurücksetzen von Energiezählern.

06 einzelnes Register schreiben (Write Single Register)

0x06 · Holding-Register (4x)

Schreibt einen 16-Bit-Wert in ein Holding-Register. Die Antwort ist eine exakte Kopie der Anfrage.

Ungeeignet für 32-Bit-Werte, weil die beiden Hälften zu verschiedenen Zeitpunkten geschrieben würden. Manche Geräte akzeptieren 06 nur für bestimmte Register und verlangen sonst 16.

07 Exception-Status lesen (Read Exception Status)

0x07 · nur serielle Leitung

Liest acht Statusbits, deren Bedeutung jedes Gerät selbst festlegt.

Heute selten genutzt. Ob das Gerät sie überhaupt unterstützt, steht im Handbuch.

08 Diagnose (Diagnostics)

0x08 · nur serielle Leitung

Diagnose, ausgewählt über eine Unterfunktion. Unterfunktion 0000 schickt die Daten direkt zurück (Schleife), andere lesen oder löschen die Buszähler.

Unterfunktion 0000 ist ein schneller Leitungstest, ohne ein Register anzufassen, sofern das Gerät sie unterstützt.

11 Ereigniszähler lesen (Get Comm Event Counter)

0x0B · nur serielle Leitung

Liefert ein Statuswort und einen Zähler erfolgreich verarbeiteter Nachrichten.

Zweimaliges Lesen des Zählers zeigt, ob das Gerät Ihre Anfragen überhaupt empfängt und verarbeitet.

12 Ereignisprotokoll lesen (Get Comm Event Log)

0x0C · nur serielle Leitung

Liefert ein Statuswort, Ereignis- und Nachrichtenzähler und die letzten 64 Kommunikationsereignisse.

Von wenigen Geräten unterstützt. Vor allem bei sporadischen Fehlern nützlich.

15 mehrere Coils schreiben (Write Multiple Coils)

0x0F · Coils (0x)

Schreibt 1 bis 1968 aufeinanderfolgende Coils. Die Werte sind zu je 8 pro Byte gepackt wie bei Funktion 01, die Antwort wiederholt Startadresse und Anzahl.

Die Byteanzahl muss zur Anzahl passen: 10 Coils brauchen 2 Bytes. Eine Abweichung endet mit Exception 03.

16 mehrere Register schreiben (Write Multiple Registers)

0x10 · Holding-Register (4x)

Schreibt 1 bis 123 aufeinanderfolgende Holding-Register. Die Anfrage enthält Startadresse, Anzahl, Byteanzahl und Werte, die Antwort wiederholt Startadresse und Anzahl.

Der richtige Weg für 32-Bit-Werte wie Floats, weil sich beide Hälften gleichzeitig ändern. Manche Geräte lehnen 16 für ein einzelnes Register ab und wollen 06, andere lehnen 06 ab.

17 Server-ID melden (Report Server ID)

0x11 · nur serielle Leitung

Liefert einen herstellerspezifischen Identifikationsblock und eine Run/Stop-Anzeige.

Der Inhalt unterscheidet sich je nach Hersteller. Funktion 43/14 ist der strukturierte Ersatz.

20 Dateieintrag lesen (Read File Record)

0x14

Liest Dateieinträge: nummerierte Registergruppen, adressiert über Datei- und Eintragsnummer.

Manche Geräte stellen so Logs oder Konfigurationsbereiche bereit. In der Praxis selten.

21 Dateieintrag schreiben (Write File Record)

0x15

Schreibt Dateieinträge: nummerierte Registergruppen, adressiert über Datei- und Eintragsnummer.

In der Praxis selten. Den Aufbau der Dateien beschreibt das Gerätehandbuch.

22 Register maskiert schreiben (Mask Write Register)

0x16 · Holding-Register (4x)

Ändert einzelne Bits eines Holding-Registers: Ergebnis = (Inhalt AND and_mask) OR (or_mask AND NOT and_mask).

Setzt ein Bit eines Steuerworts, ohne es vorher zu lesen. Viele Geräte unterstützen sie nicht; dann mit 03 lesen, das Bit ändern und mit 06 zurückschreiben.

23 mehrere Register lesen und schreiben (Read/Write Multiple Registers)

0x17 · Holding-Register (4x)

Schreibt und liest Register in einer Transaktion, das Schreiben erfolgt zuerst. Bis zu 121 Register werden geschrieben und bis zu 125 gelesen.

Vor allem von SPS unterstützt. Antwortet ein Gerät mit Exception 01, verwenden Sie 16 und 03 nacheinander.

24 FIFO-Warteschlange lesen (Read FIFO Queue)

0x18

Liest bis zu 31 Register aus einer FIFO-Warteschlange, davor ihre Anzahl.

Selten unterstützt.

43 gekapselte Schnittstelle (Encapsulated Interface Transport)

0x2B

Ein Container für Unterprotokolle, ausgewählt über den MEI-Typ. MEI-Typ 0E, Geräteidentifikation lesen, liefert Textobjekte wie Herstellername, Produktcode und Firmwareversion.

Praktisch, um ohne Handbuch herauszufinden, was am Bus hängt. Die Unterstützung ist optional, viele einfache Geräte antworten mit Exception 01.

Modbus-Exception-Codes

In einer Exception-Antwort schickt das Gerät den Funktionscode plus 0x80 zurück (aus 03 wird 83), gefolgt von einem dieser Codes. 09 ist nicht definiert.

01 unzulässige Funktion (Illegal Function)

Das Gerät unterstützt diese Funktion nicht. Typisch: Input-Register (04) von einem Gerät lesen, das nur Holding-Register (03) hat, oder umgekehrt.

02 unzulässige Datenadresse (Illegal Data Address)

Die Adresse oder ein Teil des Bereichs existiert im Gerät nicht. Meist ist die Adresse um eins verschoben (Register 40001 ist Adresse 0) oder das Lesen reicht in eine Lücke der Registerkarte. Lesen Sie weniger Register oder beginnen Sie genau dort, wo das Handbuch es angibt.

03 unzulässiger Datenwert (Illegal Data Value)

Ein Wert in der Anfrage ist nicht erlaubt. Meist die Anzahl: mehr als 125 Register oder eine Anzahl, die einen 32-Bit-Wert halbiert. Beim Schreiben liegt der Wert eventuell außerhalb des erlaubten Bereichs.

04 Gerätefehler (Server Device Failure)

Das Gerät ist bei der Bearbeitung der Anfrage gescheitert. Manche Geräte antworten auch bei vorübergehend nicht verfügbaren Registern mit 04.

05 angenommen, in Bearbeitung (Acknowledge)

Das Gerät hat einen lang laufenden Befehl angenommen und arbeitet noch daran. Fragen Sie später erneut.

06 Gerät beschäftigt (Server Device Busy)

Das Gerät ist mit einem lang laufenden Befehl beschäftigt. Wiederholen Sie die Anfrage später.

07 negative Bestätigung (Negative Acknowledge)

Ein alter Code für Programmierbefehle. Aktuelle Geräte verwenden ihn nicht.

08 Speicherparitätsfehler (Memory Parity Error)

Ein Paritätsfehler im Dateispeicher. Kommt nur bei den Funktionen 20 und 21 vor.

0A Gateway-Pfad nicht verfügbar (Gateway Path Unavailable)

Das Gateway weiß nicht, wohin es die Anfrage schicken soll. Meist eine Unit-ID ohne Route im Gateway oder ein nicht eingerichteter Gateway-Port.

0B Zielgerät hinter dem Gateway antwortet nicht (Gateway Target Device Failed to Respond)

Das Gateway hat die Anfrage weitergeleitet, aber das Gerät dahinter hat nicht rechtzeitig geantwortet. Prüfen Sie Unit-ID, Baudrate, Parität, Verdrahtung und Busabschluss auf der seriellen Seite.

So funktionieren Funktions- und Exception-Codes

Das zweite Byte eines Modbus-RTU-Frames und das erste Byte jeder PDU ist der Funktionscode. Er sagt dem Gerät, was zu tun ist: Coils lesen, Register lesen, einen Wert schreiben. Kann das Gerät die Anfrage ausführen, beginnt seine Antwort mit demselben Funktionscode. Kann es das nicht, setzt es das höchste Bit des Codes (aus 03 wird 83) und hängt ein Byte an, den Exception-Code, der den Grund nennt.

Eine Exception ist in einer Hinsicht eine gute Nachricht: Das Gerät hat den Frame empfangen, die CRC stimmte und die Adresse passte. Ein Gerät, das gar nicht antwortet, hat ein anderes Problem: falsche Adresse, Baudrate oder Parität, Verdrahtung oder Abschluss. Ausnahme sind Gateways, die ein stummes Gerät dahinter mit Code 0B melden.

Häufige Fehler

Der Frame-Decoder zeigt Funktions- und Exception-Code eines ganzen mitgeschnittenen Frames zusammen mit Adresse und Daten.

Fragen aus der Praxis

Was bedeutet Modbus-Exception-Code 02?

Illegal Data Address, unzulässige Datenadresse: Mindestens eines der angefragten Register existiert im Gerät nicht. In der Praxis ist die Adresse meist um eins verschoben (40001 ist Adresse 0), die Funktion liest die falsche Tabelle (03 statt 04) oder das Lesen reicht in eine Lücke der Registerkarte. Lesen Sie zuerst ein einzelnes Register an der genauen Adresse aus dem Handbuch.

Warum antwortet das Gerät mit 83 statt 03?

83 ist 03 plus 0x80, das Kennzeichen einer Exception-Antwort: Das Gerät hat die Anfrage zum Lesen von Holding-Registern verstanden, aber abgelehnt. Das Byte nach 83 ist der Exception-Code mit dem Grund, zum Beispiel 02 für eine Adresse, die nicht existiert.

Was ist der Unterschied zwischen Funktion 03 und 04?

Funktion 03 liest Holding-Register (4xxxx), Funktion 04 liest Input-Register (3xxxx). Input-Register sind schreibgeschützt, Holding-Register lassen sich meist auch schreiben. In welcher Tabelle ein Wert liegt, bestimmt allein das Gerät; die Registerkarte sagt, welche Funktion zu verwenden ist.

Ist FC 16 dasselbe wie Funktionscode 0x10?

Ja. FC 16 ist dezimal geschrieben, 0x10 hex, beides bedeutet mehrere Register schreiben (Write Multiple Registers). Vorsicht bei 0x16: Das ist dezimal 22, Register maskiert schreiben, also eine andere Funktion.

Das Gerät antwortet gar nicht. Welche Exception ist das?

Keine. Mit einer Exception antwortet ein Gerät nur, wenn es einen gültigen, an sich adressierten Frame empfangen hat. Keine Antwort heißt, dass der Frame nicht ankam oder ungültig war: Prüfen Sie Geräteadresse, Baudrate, Parität, Stoppbits, A/B-Verdrahtung und Busabschluss. Hinter einem Modbus-TCP-Gateway meldet das Gateway diese Situation mit Exception 0B.

Verwandte Werkzeuge