Detaillierte Beschreibung des Modbus-TCP-Protokolls mit Befehlsbeispielen

26 April 2017 Wissenswertes
fd2d6cfb52a4e2cefc32f0b595c3eccc.jpg

In diesem Artikel erfahren Sie mehr über das Modbus TCP-Protokoll, das die Weiterentwicklung des Modbus RTU-Protokolls darstellt.

Inhalt:

Wohin wird ein Modbus TCP-Befehl gesendet?

In einem Ethernet-Netzwerk ist die Geräteadresse die IP-Adresse des Geräts. Typischerweise befinden sich die Geräte im selben Subnetz, wobei sich die IP-Adressen durch die letzte Ziffer unterscheiden, z. B. 192.168.1.20, wenn die gängigste Subnetzmaske 255.255.255.0 verwendet wird.

Die Schnittstelle ist ein Ethernet-Netzwerk, das Datenübertragungsprotokoll ist TCP/IP.

Der verwendete TCP-Port ist: 502.

Zurück zum Inhalt

Beschreibung des Modbus TCP-Protokolls

Der Modbus TCP-Befehl besteht aus einem Teil der Modbus RTU-Nachricht und einem speziellen Header.

Aus der Modbus RTU-Nachricht werden die SlaveID-Adresse am Anfang und die CRC-Prüfsumme am Ende entfernt, wodurch die PDU (Protocol Data Unit) entsteht.

Im Folgenden ist ein Beispiel für eine Modbus RTU-Anfrage zum Abrufen des AI-Werts der Halteregister von den Registern Nr. 40108 bis 40110 mit der Geräteadresse 17 dargestellt.

11 03 006B 0003 7687

11 Geräteadresse SlaveID (17 = 11 hex)
03 Funktionscode (Lesen der Halteregister des Analogausgangs)
006B Adresse des ersten Registers (40108-40001 = 107 = 6B hex)
0003 Anzahl der benötigten Register (Lesen von 3 Registern von 40108 bis 40110)
7687 CRC-Prüfsumme

Wir lassen die SlaveID-Geräteadresse und die CRC-Prüfsumme weg und erhalten die PDU: 03 006B 0003

03 006B 0003

An den Anfang der erhaltenen PDU-Nachricht wird ein neuer 7-Byte-Header hinzugefügt, der als MBAP-Header (Modbus Application Header) bezeichnet wird. Dieser Header enthält folgende Daten:

MBAP Header Diagramm

Transaktionskennung: 2 Bytes, die vom Master festgelegt werden, um jede Anfrage eindeutig zu identifizieren. Kann beliebig sein. Diese Bytes werden vom Slave-Gerät in der Antwort wiederholt, da die Antworten des Slave-Geräts nicht immer in der gleichen Reihenfolge wie die Anfragen empfangen werden.

Protokollkennung: 2 Bytes, die vom Master festgelegt werden, immer 00 00, was dem Modbus-Protokoll entspricht.

Länge: 2 Bytes, die vom Master festgelegt werden und die Anzahl der Bytes in der Nachricht angeben, die folgen. Sie wird vom Unit Identifier bis zum Ende der Nachricht gezählt.

Unit Identifier: 1 Byte, das vom Master festgelegt wird. Es wird vom Slave-Gerät wiederholt, um das Slave-Gerät eindeutig zu identifizieren.

Insgesamt erhalten wir:

Modbus RTU Slave ID Anfrage CRC
Modbus RTU 11 03 006B 0003 7687
Modbus TCP 0001 0000 0006 11 03 006B 0003
Modbus TCP MBAP Header PDU
Modbus TCP ADU, Application Data Unit

Wo:

0001 Transaktionskennung Transaction Identifier
0000 Protokollkennung Protocol Identifier
0006 Länge (6 Bytes folgen) Message Length
11 Geräteadresse (17 = 11 hex) Unit Identifier
03 Funktionscode (Lesen der Halteregister des Analogausgangs) Function Code
006B Adresse des ersten Registers (107 = 40108-40001 = 6B hex) Data Address of the first register
0003 Anzahl der benötigten Register (Lesen von 3 Registern von 40108 bis 40110) The total number of registers

In der Antwort vom Modbus TCP Slave-Gerät erhalten wir:

0001 0000 0009 11 03 06 022B 0064 007F

Wo:

0001 Transaktionskennung Transaction Identifier
0000 Protokollkennung Protocol Identifier
0009 Länge (9 Bytes folgen) Message Length
11 Geräteadresse (17 = 11 hex) Unit Identifier
03 Funktionscode (Lesen der Halteregister des Analogausgangs) Function Code
06 Anzahl der folgenden Bytes (6 Bytes folgen) Byte Count
02 Registerwert Hi (AO0) (02 hex) Register value Hi (AO0)
2B Registerwert Lo (AO0) (2B hex) Register value Lo (AO0)
00 Registerwert Hi (AO1) (00 hex) Register value Hi (AO1)
64 Registerwert Lo (AO1) (64 hex) Register value Lo (AO1)
00 Registerwert Hi (AO2) (00 hex) Register value Hi (AO2)
7F Registerwert Lo (AO2) (7F hex) Register value Lo (AO2)

Das Halteregister des Analogausgangs AO0 hat den Wert 02 2B HEX oder 555 im Dezimalsystem.

Das Halteregister des Analogausgangs AO1 hat den Wert 00 64 HEX oder 100 im Dezimalsystem.

Das Halteregister des Analogausgangs AO2 hat den Wert 00 7F HEX oder 127 im Dezimalsystem.

Zurück zum Inhalt

Modbus TCP-Anforderungsfehler

Wenn das Gerät die Anfrage nach Empfang nicht verarbeiten kann, wird die Antwort mit einem Fehlercode gesendet.

Die Antwort enthält den modifizierten Funktionscode, dessen höchstwertiges Bit auf 1 gesetzt ist.

Beispiel:

Vorher Nachher
Funktionscode in der Anfrage Funktionsfehlercode in der Antwort
01 (01 hex) 0000 0001 129 (81 hex) 1000 0001
02 (02 hex) 0000 0010 130 (82 hex) 1000 0010
03 (03 hex) 0000 0011 131 (83 hex) 1000 0011
04 (04 hex) 0000 0100 132 (84 hex) 1000 0100
05 (05 hex) 0000 0101 133 (85 hex) 1000 0101
06 (06 hex) 0000 0110 134 (86 hex) 1000 0110
15 (0F hex) 0000 1111 143 (8F hex) 1000 1111
16 (10 hex) 0001 0000 144 (90 hex) 1001 0000

Beispiel einer Anfrage und Antwort mit Fehler:

Byte Anfrage Byte Antwort
(Hex) Feldname (Hex) Feldname
01 Transaktionskennung 01 Transaktionskennung
02 02
00 Protokollkennung 00 Protokollkennung
00 00
00 Nachrichtenlänge 00 Nachrichtenlänge
06 03
0A Geräteadresse 0A Geräteadresse
01 Funktionscode 81 Funktionscode mit geändertem Bit
04 Adresse des ersten Bytes des Registers Hi 02 Fehlercode
A1 Adresse des ersten Bytes des Registers Lo
00 Anzahl der Register Hi Byte
01 Anzahl der Register Lo Byte

Erklärung der Fehlercodes

01 Der empfangene Funktionscode kann nicht verarbeitet werden.
02 Die in der Anfrage angegebene Datenadresse ist nicht verfügbar.
03 Der im Datenfeld der Anfrage enthaltene Wert ist ungültig.
04 Ein nicht behebbarer Fehler ist aufgetreten, während das Slave-Gerät versuchte, die angeforderte Aktion auszuführen.
05 Das Slave-Gerät hat die Anfrage akzeptiert und verarbeitet sie, aber es dauert lange. Diese Antwort verhindert, dass der Host einen Timeout-Fehler generiert.
06 Das Slave-Gerät ist mit der Verarbeitung des Befehls beschäftigt. Der Master muss die Nachricht später wiederholen, wenn das Slave-Gerät frei ist.
07 Das Slave-Gerät kann die in der Anfrage angegebene Programmfunktion nicht ausführen. Dieser Code wird für eine erfolglose Programmierungsanfrage mit Funktionen der Nummern 13 oder 14 zurückgegeben. Der Master muss Diagnose- oder Fehlerinformationen vom Slave anfordern.
08 Das Slave-Gerät hat einen Paritätsfehler beim Lesen des erweiterten Speichers festgestellt. Der Master kann die Anfrage wiederholen, aber in solchen Fällen sind normalerweise Reparaturen erforderlich.

Zurück zum Inhalt