Modbus Funktionscode

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

Modbus Funktionscode

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

Modbus Funktionscode插图

Ü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.

  1. 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.
  2. Benutzerspezifische Funktionscodes
    • Es gibt zwei Benutzerspezifische Funktionscode-Bereiche, 6572 und 100Benutzerspezifische, keine Einzigartigkeit garantiert.
    • Benutzerdefiniert, keine Einzigartigkeit garantiert.
  3. 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 CodeNameEnglischRegister PLC-AdresseBit / Wort-OperationAnzahl Operationen
01Lese-Spule - ZustandRead Coils00001 ~ 09999Bit-OperationEiner oder mehrere
02Lese-diskreter EingangszustandRead Discrete Inputs10001 ~ 199999Bit-OperationEiner oder mehrere
03Lese-Halt - RegisterRead Holding Registers40001 ~ 4999WortoperationenEin oder mehrere
04Lese-Eingabe - RegisterRead Input Registers30001 ~ 3999WortoperationenEin oder mehrere
05Schreiben Sie eine einzelne Schleife.Write Single Coil00001 ~ 09999Bit-OperationEinzel
06Schreiben einzelner AufbewahrungsregisterWrite Single Register40001 ~ 499999Wort-OperationEinzel
15Schreiben Sie mehrere Schleife.Write Multiple Coils00001 ~ 09999Bitoperationenmehrere
16Schreiben mehrere AufbewahrungsregisterWrite Multiple Registers40001 ~ 499999Wortoperationenmehrere

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:

FunktionscodeSubfunktionscodeBeschreibungBeschreibung
0800 (0x00)Return Data Query (Loop-back)Rückgabe der Abfrage-Nachricht wie vorhanden
0801 (0x01)Restart CommunicationsZur 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
0802 (0x02)Return Diagnostic Registergibt den Inhalt des Diagnose-Registers zurück
0803 (0x03)Change ASCII Input Delimiter
0804 (0x04)Force Listen Only ModeZwingt die adressierten Slaves in den Listen-only - Modus
Trennen Sie es von anderen Geräten im Netzwerk und geben keine Antwort zurück
0810 (0x0A)Clear Counters and Diagnostic RegistersZähler und Diagnoseregister löschen
0811 (0x0B)Return Bus Message CountRückgabe der Busnachrichten-Zählung
0812 (0x0C)Return Bus Communication Error CountRückgabe der Buskommunikation CRC-Fehler - Zählung
0813 (0x0D)Return Bus Exception Error CountGibt die Anzahl der von der Station empfangenen Nachrichten zurück
0814(0x0E)Return Slave Message CountGibt die Anzahl der Nachrichten zurück, die von der Station empfangen wurden
0815(0x0F)Return Slave No Response CountGibt die Anzahl der Nachrichten zurück, die von der Station nicht geantwortet wurden
0816(0x10)Return Slave NAK Count
0817(0x11)Return Slave Busy CountGibt die Anzahl der Nachrichten, die von der Station geantwortet wurden, zurück
0818 (0x12)Return Bus Character Overrun CountGibt die Anzahl der Nachrichten zurück, die die Grenze für Buszeichen überschritten haben
0819 (0x13)Return IOP Overrun Count (884)
0820 (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.

Modbus Funktionscode插图1

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.

Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.