
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?
- Beschreibung des Modbus TCP-Protokolls
- Modbus TCP-Befehlstypen
- Wie sende ich einen Modbus TCP-Befehl zum Lesen diskreter Ausgänge? Befehl 0x01
- Wie sende ich einen Modbus TCP-Befehl zum Lesen eines digitalen Eingangs? Befehl 0x02
- Wie sende ich einen Modbus TCP-Befehl zum Lesen des Analogausgangs? Befehl 0x03
- Wie sende ich einen Modbus TCP-Befehl zum Lesen eines Analogeingangs? Befehl 0x04
- Wie sende ich einen Modbus TCP-Befehl zum Schreiben eines diskreten Ausgangs? Befehl 0x05
- Wie sende ich einen Modbus TCP-Befehl zum Schreiben eines Analogausgangs? Befehl 0x06
- Wie sende ich einen Modbus TCP-Befehl zum Schreiben mehrerer diskreter Ausgänge? Befehl 0x0F
- Wie sende ich einen Modbus TCP-Befehl zum Schreiben mehrerer Analogausgänge? Befehl 0x10
- Modbus TCP-Anforderungsfehler
- Programme zur Arbeit mit dem Modbus TCP-Protokoll
- Geräte mit Modbus TCP-Unterstützung
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.
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:

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