Modbus Function Codes: Referenz mit Limits und Beispiel-Frames

· Von Vladimir Chemeris, Entwickler von Modbus TCP FieldKit

Kurzantwort: Acht Function Codes decken fast die gesamte Modbus-Arbeit ab: 01 bis 04 lesen, 05 und 06 schreiben ein einzelnes Element, 15 und 16 schreiben mehrere. Die Tabelle nennt die Limits, und jeder Frame unten ist ein echter Austausch mit einem Testserver.

Die acht, die Sie brauchen

Code Hex Name Bereich Limit
01 0x01 Read Coils Coils 2000 Bit
02 0x02 Read Discrete Inputs Diskrete Eingänge 2000 Bit
03 0x03 Read Holding Registers Holding-Register 125 Register
04 0x04 Read Input Registers Eingangsregister 125 Register
05 0x05 Write Single Coil Coils 1 Coil
06 0x06 Write Single Register Holding-Register 1 Register
15 0x0F Write Multiple Coils Coils 1968 Bit
16 0x10 Write Multiple Registers Holding-Register 123 Register

Achten Sie auf Dezimal und Hex: Handbücher mischen beide, und 15 dezimal ist 0F auf der Leitung. Wer versehentlich 0x15 schreibt, sendet Write File Record.

Lesezugriffe

03, Read Holding Registers, von einem Server mit pymodbus 3.16.1, Adresse 0, Anzahl 3:

TX 00 01 00 00 00 06 01 03 00 00 00 03
RX 00 01 00 00 00 09 01 03 06 00 64 00 FA 04 00

Die Antwort enthält zuerst die Byte-Anzahl 06, dann zwei Bytes pro Register.

01, Read Coils, Adresse 0, Anzahl 8:

TX 00 0C 00 00 00 06 01 01 00 00 00 08
RX 00 0C 00 00 00 04 01 01 01 01

Das Datenbyte 01 enthält acht Coils, die niedrigste Adresse im niedrigsten Bit. Hier ist Coil 0 an und die Coils 1 bis 7 sind aus.

Einzelne Schreibzugriffe

06, Write Single Register, Adresse 2, Wert 2048. Eine normale Antwort wiederholt die Anfrage:

TX 00 08 00 00 00 06 01 06 00 02 08 00
RX 00 08 00 00 00 06 01 06 00 02 08 00

05, Write Single Coil akzeptiert nur FF 00 für an oder 00 00 für aus:

TX 00 0A 00 00 00 06 01 05 00 00 FF 00
RX 00 0A 00 00 00 06 01 05 00 00 FF 00

Das Echo bestätigt, dass das Gerät die Anfrage empfangen hat. Lesen Sie das Register zurück, wenn es darauf ankommt: Die eigene Logik des Geräts kann den Wert trotzdem ignorieren oder begrenzen.

Mehrfache Schreibzugriffe

16, Write Multiple Registers, Adresse 20, zwei Register. Die Antwort enthält Adresse und Anzahl, aber nicht die Daten:

TX 00 0D 00 00 00 0B 01 10 00 14 00 02 04 12 34 56 78
RX 00 0D 00 00 00 06 01 10 00 14 00 02

Verwenden Sie das für 32-Bit-Werte, damit beide Hälften in einer Anfrage ankommen. Bei zwei getrennten 06-Schreibzugriffen gibt es einen Moment, in dem der Wert halb alt und halb neu ist.

Seltenere Codes

Code Hex Name Hinweis
07 0x07 Read Exception Status Nur serielle Leitung
08 0x08 Diagnostics Nur serielle Leitung, mit Sub-Functions
20 0x14 Read File Record
21 0x15 Write File Record
22 0x16 Mask Write Register AND- und OR-Maske auf ein Register
23 0x17 Read/Write Multiple Registers Eine Transaktion, Schreiben zuerst
24 0x18 Read FIFO Queue
43 0x2B Encapsulated Interface Transport Sub-Code 14 liest die Geräteidentifikation

Die Unterstützung schwankt stark. Eine nicht unterstützte Function sollte Exception 01 zurückgeben. FieldKit implementiert die acht Hauptcodes und zeigt die empfangene Exception mit Namen an.

Was an den Grenzen passiert

Eine Anfrage über 126 Register sollte 83 03 erhalten. pymodbus 3.16.1 antwortete stattdessen mit 80 01. Weitere Fälle dieser Art finden Sie unter Was ein echter Server getan hat.

Quellen

FAQ

Was ist der Unterschied zwischen Function 03 und 04?

03 liest Holding-Register, die lesbar und beschreibbar sind. 04 liest Eingangsregister, die nur lesbar sind. Auf vielen Geräten sind das getrennte Bereiche, einige Geräte legen aber beide auf denselben Speicher.

Wie viele Register kann ich auf einmal lesen?

125 mit Function 03 oder 04. Write Multiple Registers nimmt bis zu 123, und Read Coils bis zu 2000 Bit.

Welcher Wert schaltet eine Coil mit Function 05 ein?

FF 00 schaltet sie ein, 00 00 schaltet sie aus. Die Spezifikation erklärt alle anderen Werte für unzulässig.