Der Modbus-Funktionscode ist ein wichtiger Bestandteil des Modbus-Nachrichtenframes (Nachrichten) und bildet die Grundlage für die Kommunikationstransaktionsverarbeitung im Modbus-Protokoll.

Übersicht
Der Modbus-Funktionscode nimmt ein Byte ein und hat einen Wertbereich von 1 bis 127 (d. h. 0x01 bis 0x7F). Gleichzeitig wird der Funktionscode + 0x80 verwendet, um den Ausnahmezustand anzuzeigen, d. h. 129 ~ 255 steht für den Ausnahmecode.
Im Modbus-Standard - Protokoll werden drei Modbus-Funktionscodes definiert.
- Common Function Code
- eindeutig definierter Funktionscode;
- garantiert Einzigartigkeit;
- von der Modbus Association bestätigt und öffentlich verfügbar ist;
- Konformitätstests können durchgeführt werden;
- enthält Protokoll-definierten Funktionscode und Reservierung von Funktionscode für zukünftige Verwendung.
- Benutzerspezifische Funktionscodes
- Es gibt zwei Benutzerspezifische Funktionscode-Bereiche, 65
72 und 100Benutzerspezifische, keine Einzigartigkeit garantiert. - Benutzerdefiniert, keine Einzigartigkeit garantiert.
- Es gibt zwei Benutzerspezifische Funktionscode-Bereiche, 65
- Funktionscode behalten
- Die Funktionscodes werden aus historischen Gründen aufbewahrt, und die Funktionscodes, die derzeit in den traditionellen Produkten einiger Unternehmen verwendet werden, werden nicht öffentlich verwendet.
Dieses Tutorial behandelt den öffentlichen Funktionscode, und die folgende Tabelle zeigt einige der öffentlichen Funktionscodes im Modbus-Protokoll.
| Der Code | Name | Englisch | Register PLC-Adresse | Bit / Wort-Operation | Anzahl Operationen |
|---|---|---|---|---|---|
| 01 | Lese-Spule - Zustand | Read Coils | 00001 ~ 09999 | Bit-Operation | Einer oder mehrere |
| 02 | Lese-diskreter Eingangszustand | Read Discrete Inputs | 10001 ~ 199999 | Bit-Operation | Einer oder mehrere |
| 03 | Lese-Halt - Register | Read Holding Registers | 40001 ~ 4999 | Wortoperationen | Ein oder mehrere |
| 04 | Lese-Eingabe - Register | Read Input Registers | 30001 ~ 3999 | Wortoperationen | Ein oder mehrere |
| 05 | Schreiben Sie eine einzelne Schleife. | Write Single Coil | 00001 ~ 09999 | Bit-Operation | Einzel |
| 06 | Schreiben einzelner Aufbewahrungsregister | Write Single Register | 40001 ~ 499999 | Wort-Operation | Einzel |
| 15 | Schreiben Sie mehrere Schleife. | Write Multiple Coils | 00001 ~ 09999 | Bitoperationen | mehrere |
| 16 | Schreiben mehrere Aufbewahrungsregister | Write Multiple Registers | 40001 ~ 499999 | Wortoperationen | mehrere |
Funktionscode-Betrieb kann in zwei Arten unterteilt werden:
- - Bit-Betrieb - Mindesteinheit ist ein Bit (Bit), einschließlich Lesen von Funktionscode 01, Lesen von Funktionscode 02, Schreiben von Funktionscode 05 für eine einzelne Spule und Schreiben von Funktionscode 15 für mehrere Spule;
- Wörteroperationen - Mindesteinheiten von zwei Bytes, einschließlich des Lesen-Halt - Register-Funktionscodes 03, des Lesen-Eingabe - Register-Funktionscodes 04, des Schreibens eines einzelnen Halt - Register-Funktionscodes 06 und des Schreibens mehrerer Halt - Register-Funktionscodes 16.
Funktionscode
0x01 Lesen von Spule / Diskrete Ausgabewert
- Dieser Funktionscode wird verwendet, um den Zustand der Spule oder Diskrete Ausgabe des Geräts zu lesen, d. h. den ON / OFF-Zustand der einzelnen DO (Discrete Output).
- Im Nachrichtenrahmen werden die Startadresse und die Anzahl der zu lesenen Spule angegeben.
- Die Startadresse besteht aus 2 Bytes und kann im Bereich von 0x0000 bis 0xFFFF verwendet werden.
- Die Anzahl der Spule besteht aus 2 Bytes und reicht von 0x0001 bis 0x07D0 (d. h. Dezimal 1 bis 2000).
- Beachten Sie, dass in der PDU, die durch das Modbus-Protokoll definiert ist, alle Spule - oder Registeradressen von 0 berechnet werden.
0x02 Lesen des Diskreten Eingangswertes
- Dieser Funktionscode wird verwendet, um den ON / OFF-Zustand des Diskreten Eingangs (DI) des Slave-Geräts zu lesen.
- Der Nachrichtenrahmen gibt die Anfangsadresse und die Anzahl des diskreten Eingaberegisters an, die gelesen werden sollen, und kann 1 bis 2000 aufeinanderfolgende diskreten Eingabezustände lesen.
- Wenn die Anforderung des Master-Geräts vom Gerät akzeptiert wird, antwortet der Funktionscode 02 und gibt den aktuellen Zustand der einzelnen Variablen zurück (wenn die zurückgegebene DI-Anzahl nicht ein ganzes Vielfaches von 8 ist, wird die verbleibende Bit des letzten Datenbytes mit 0 gefüllt).
- Die Startadresse besteht aus 2 Bytes und kann im Bereich 0x0000 bis 0xFFFF verwendet werden.
- Die Anzahl der Diskreten besteht aus 2 Byte und reicht von 0x0001 bis 0x07D0 (d.h. Dezimal 1 bis 2000) und kann bis zu 2000 diskrete Eingabestatuswerte gleichzeitig gelesen werden.
0x03 Read Hold Register value
- Dieser Funktionscode wird verwendet, um den Inhalt des Registers des Geräts zu lesen und unterstützt den Broadcast-Modus nicht.
- Der Nachrichtenrahmen gibt die Anfangsadresse und die Anzahl der zu lesen gehaltenen Registers an, während der spezifische Inhalt und die Bedeutung der Adressen in dem gehaltenen Register vom Entwickler des Geräts festgelegt wird.
- Die Startadresse besteht aus 2 Bytes und kann im Bereich von 0x0000 bis 0xFFFF verwendet werden.
- Die Anzahl der Registers besteht aus 2 Byte und reicht von 0x0001 bis 0x007D (d. h. Dezimal 1 bis 125) und kann bis zu 125 Registerwerte gleichzeitig aufeinander ablesen.
- Beachten Sie, dass Modbus-Halt - und Eingangsregister in Wörtern (Word) als grundlegende Einheit verwendet werden (1Word entspricht 2Bytes). Daher ist es beim Lesen auf die Bytefolge (Größenende) zu achten.
0x04 Eingabe-Register - Wert gelesen
- Dieser Funktionscode wird verwendet, um den Inhalt der Eingabe-Register vom Gerät zu lesen, der Broadcast-Modus wird nicht unterstützt. (Ähnlich wie der 03 Funktionscode)
- Der Nachrichtenrahmen gibt die Anfangsadresse und die Anzahl der Eingaberegister an, die gelesen werden sollen, während der Inhalt und die Bedeutung der Adressen in den Eingaberegistern vom Entwickler des Geräts festgelegt werden.
- Die Startadresse besteht aus 2 Bytes und kann im Bereich 0x0000 bis 0xFFFF verwendet werden.
- Die Anzahl der Registers besteht aus 2 Byte und reicht von 0x0001 bis 0x007D (d.h. Dezimal 1 bis 125) und kann bis zu 125 Registerwerte gleichzeitig aufeinander ablesen.
- Ebenso ist die Aufmerksamkeit auf die Befehlfrage geboten.
0x05 Single Coil / Single Discrete Output
- Dieser Funktionscode wird verwendet, um ein einzelnes Spule-Register (oder einen diskreten Ausgang) auf ON oder OFF zu setzen, um den Broadcast-Modus zu unterstützen.
- Im Broadcast-Modus werden die Werte für die gleiche Adresse aller Slave-Station - Geräte einheitlich geändert.
- Im Nachrichtenrahmen wird die Spule-Adresse angegeben, die geändert werden muss, und der festgelegte Statuswert.
- Die Startadresse besteht aus 2 Bytes und kann im Bereich von 0x0000 bis 0xFFFF sein.
- Die Zieldaten (d. h. der ON / OFF-Zustand in der Abfrage-Nachricht) werden durch die Konstanten des Nachrichtendatenfelds angegeben, wobei 0xFF00 den ON-Zustand und 0x0000 den OFF-Zustand bezeichnet, und alle übrigen Werte sind illegal.
- Beachten Sie, dass in der PDU, die durch das Modbus-Protokoll definiert ist, alle Spule - oder Register-Adressen von 0 abgerechnet werden.
0x06 Single Hold Register schreiben
- Dieser Funktionscode wird verwendet, um den Wert des einzelnen Hold Registers des Geräts zu aktualisieren und den Broadcast-Modus zu unterstützen.
- Im Broadcast-Modus werden die Werte für die gleiche Adresse aller Slave-Station - Geräte einheitlich geändert.
- Die Adresse des Slave-Geräts sowie die Adresse des Hold-Registers und die Einstellungen, die geändert werden müssen, müssen im Nachrichtenrahmen angegeben werden.
- Die Startadresse besteht aus 2 Bytes und kann im Bereich von 0x0000 bis 0xFFFF verwendet werden.
- Die Änderungsziele bestehen aus 2 Bytes und können im Bereich 0x0000 bis 0xFFFF verwendet werden.
- Beibehaltung des Registers in Wort (Word) als grundlegende Einheit, während des Schreibens muss man auf die Bytefolge der Zieldaten achten.
0x08 Diagnosefunktion
- Dieser Funktionscode wird nur für serielle Verbindungen verwendet, hauptsächlich zur Erkennung von Kommunikationsfehlern zwischen Master - und Slave-Geräten oder zur Erkennung verschiedener interner Fehler des Slave-Geräts.
- In der Abfrage-Nachricht müssen die Adresse des Slaves, der Funktionscode (Modbus-Befehl) und die Diagnostic Sub-Funktion (Diagnostic Sub-Function) angegeben werden. Dabei ist das Sub-Funktionscode - Feld 2 Byte, die für die Unterscheidung der verschiedenen Diagnose-Typen verwendet werden.
- In einer normalen Antwortnachricht antwortet der Slave den Funktionscode und den Subfunktionscode wie es ist.
Die häufig verwendeten Modbus-Diagnose - Subfunktionen sind wie folgt definiert:
| Funktionscode | Subfunktionscode | Beschreibung | Beschreibung |
|---|---|---|---|
| 08 | 00 (0x00) | Return Data Query (Loop-back) | Rückgabe der Abfrage-Nachricht wie vorhanden |
| 08 | 01 (0x01) | Restart Communications | Zur Initialisierung und Neustart von Slave-Geräten Dazu gehören die Berichte. 0x00, 0x00 bedeutet, Ereignisprotokolle zu halten 0xFF, 0x00 bedeutet, dass die Ereignisprotokolle gelöscht werden |
| 08 | 02 (0x02) | Return Diagnostic Register | gibt den Inhalt des Diagnose-Registers zurück |
| 08 | 03 (0x03) | Change ASCII Input Delimiter | |
| 08 | 04 (0x04) | Force Listen Only Mode | Zwingt die adressierten Slaves in den Listen-only - Modus Trennen Sie es von anderen Geräten im Netzwerk und geben keine Antwort zurück |
| 08 | 10 (0x0A) | Clear Counters and Diagnostic Registers | Zähler und Diagnoseregister löschen |
| 08 | 11 (0x0B) | Return Bus Message Count | Rückgabe der Busnachrichten-Zählung |
| 08 | 12 (0x0C) | Return Bus Communication Error Count | Rückgabe der Buskommunikation CRC-Fehler - Zählung |
| 08 | 13 (0x0D) | Return Bus Exception Error Count | Gibt die Anzahl der von der Station empfangenen Nachrichten zurück |
| 08 | 14(0x0E) | Return Slave Message Count | Gibt die Anzahl der Nachrichten zurück, die von der Station empfangen wurden |
| 08 | 15(0x0F) | Return Slave No Response Count | Gibt die Anzahl der Nachrichten zurück, die von der Station nicht geantwortet wurden |
| 08 | 16(0x10) | Return Slave NAK Count | |
| 08 | 17(0x11) | Return Slave Busy Count | Gibt die Anzahl der Nachrichten, die von der Station geantwortet wurden, zurück |
| 08 | 18 (0x12) | Return Bus Character Overrun Count | Gibt die Anzahl der Nachrichten zurück, die die Grenze für Buszeichen überschritten haben |
| 08 | 19 (0x13) | Return IOP Overrun Count (884) | |
| 08 | 20 (0x14) | Clear Overrun Counter and Flag (884) |
0x0B Zähler für Kommunikationsereignisse abrufen
- Dieser Funktionscode wird hauptsächlich verwendet, um die Werte der Statuswörter und Ereigniszahlen aus dem Kommunikationszähler des Geräts zu erhalten, und der Broadcast-Modus wird nicht unterstützt.
- Es kann ermittelt werden, ob ein Slave-Gerät eine Nachricht ordnungsgemäß verarbeitet, indem es die Anzahl der Kommunikationsereignisse vor und nach der Nachricht liest.
- Der Ereigniszähler erhöht sich um 1 bei normaler Verarbeitung und Übertragung von Nachrichten, während der Zähler bei Ausnahmeantworten, Polling-Befehlen oder Lesen des Ereigniszählers (z. B. 0x0B-Funktionscodes) unverändert bleibt.
- Das Ereignisregister kann durch die Unterfunktion 0x01 und die Unterfunktion 0x0A in der 0x08 - Diagnosefunktion zurückgesetzt werden.
0x0C Abrufen des Kommunikationsereignisprotokolls
- Dieser Funktionscode wird hauptsächlich verwendet, um das Statuswort, die Ereigniszahl, die Nachrichtenzahl und das Ereignis-Byte - Feld von einem Gerät abzurufen.
- Wo die Statuswörter und die Ereigniszahlen mit den Werten übereinstimmen, die vom Funktionscode 0x0B abgerufen werden.
- Der Nachrichtenzähler enthält die Anzahl der Nachrichten, die nach dem Einschalten des Neustartes und dem Löschen des Zählers entstanden sind, und entspricht dem Wert, der durch den 0x0B-Unterfunktioncode in der 0x08 - Diagnose-Funktion erhalten wird.
- Das Ereignis-Byte - Feld enthält 0 bis 64 Bytes und definiert verschiedene Ereignisse.
- Normalerweise enthält eine Antwortnachricht ein 2 - Bytes-Status - Wortfeld, ein 2 - Bytes-Ereignis - Zählfeld, ein 2 - Bytes-Nachrichten - Zählfeld und ein Ereignisfeld von 0 bis 64 Bytes.
- Da das Ereignisfeld länger ist, wurde ein 1 - Byte-Datenlänge - Feld hinzugefügt, um das Lesen von Antwortendaten zu erleichtern.
0x0F Schreiben mehrerer Spulen
- Dieser Funktionscode wird verwendet, um mehrere aufeinanderfolgende Spulen (oder diskreten Ausgänge) auf ON oder OFF zu setzen, um den Broadcast-Modus zu unterstützen.
- Im Broadcast-Modus werden die Werte für die gleiche Adresse aller Slave-Station - Geräte einheitlich geändert.
- Im Nachrichtenrahmen werden die Startadresse und die Anzahl der Spule angegeben, die geändert werden müssen.
- Die Startadresse besteht aus 2 Bytes und kann im Bereich 0x0000 bis 0xFFFF verwendet werden.
- Das Register-Zahl - Feld besteht aus 2 Bytes mit Werten im Bereich 0x0001 bis 0x07B0.
- Das Bit im Datenfeld, das logische 1 ist, entspricht ON und das Bit der logischen 0 entspricht OFF.
0x10 Schreiben mehrerer Halterregister
- Dieser Funktionscode wird verwendet, um mehrere aufeinanderfolgende Adressblöcke (1 bis 123 Register) von einem Halterregister des Geräts einzurichten oder zu schreiben, wobei der Broadcast-Modus unterstützt wird.
- Im Broadcast-Modus werden die Werte für die gleiche Adresse aller Slave-Station - Geräte einheitlich geändert.
- Die Adresse des Slaves sowie die Adresse und die Anzahl der Hold-Register, die geändert werden müssen, müssen im Nachrichtenframe angegeben werden.
- Die Startadresse besteht aus zwei Bytes und kann im Bereich von 0x0000 bis 0xFFFF verwendet werden.
- Das Register-Zahl - Feld besteht aus 2 Bytes und hat einen Wertbereich von 0x0001 bis 0x007B (d. h. Dezimal 1 bis 123).
- In der praktischen Entwicklung wird dieser Funktionscode häufig verwendet, um Benutzer zu erleichtern, mehrbyte-Typen von Daten zu schreiben, wie z. B. Gleitkommawerte. Daher ist die Aufmerksamkeit auf das Problem der Byteordnung zu beachten.
0x11 Meldung von Slave-ID
- Dieser Funktionscode ist nur für serielle Verbindungen verfügbar und wird verwendet, um die ID, die Typbeschreibung, den aktuellen Status und andere Informationen des Slave-Geräts zu lesen.
- Es gibt keine Datenfelder in der Abfrage-Message.
- Die Zusammensetzung der Antwortnachricht wird vom Slave-Gerät bestimmt.
Zusammenfassung
Die häufig verwendeten Modbus-Common - Function-Codes sind in der folgenden Tabelle dargestellt.

Der Funktionscode, der den Broadcast-Modus unterstützt, lautet:
- 0x05 Schreiben einer einzelnen Spule
- 0x06 Schreiben eines einzigen Hold-Registers
- 0x0F Schreiben mehrerer Spulen
- 0x10 Schreiben mehrerer Hold-Registers
Mit Ausnahme von Nachrichten im Broadcast-Modus werden alle Abfrage-Nachrichten erwartet, dass sie eine normale Antwort-Nachricht erhalten. Wenn alles in Ordnung ist, gibt der Slave eine normale Antwort-Nachricht zurück, deren Funktionscode mit dem Funktionscode der Anforderung-Nachricht übereinstimmt.
Darüber hinaus gibt es für den Funktionscode der Wortoperation ein Problem mit der Größe des Multi-Byte - Speichers, so dass die Master-Station und die Slave-Station die konsistente Regelnverarbeitung aufrechterhalten müssen und die Byte-Sequenz des Datenfeldes in der Modbus - Übertragung vereinbaren.
Antwort veröffentlichen