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
- Modbus Application Protocol Specification V1.1b3, Abschnitte 5 und 6
- Frames aufgezeichnet am 30. Oktober 2026 von pymodbus 3.16.1 unter Linux
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.