Industrielle Protokoll-Gateways bieten Gerätekompatibilität verschiedener Hersteller in einer Automatisierungslösung. Die Gateways unterstützen MODBUS, CAN, HART und andere Protokolle.
Ihre Cookie-EinstellungenDatenschutz-Bestimmungen
Wir haben die Datenerfassung auf unserer Website auf ein Minimum reduziert. Neben den für das Funktionieren der Website notwendigen Cookies verwenden wir Performance Cookies, Funktionale Cookies und Marketing Cookies. Diese helfen uns dabei, die Seite schneller, schöner und nutzerfreundlicher zu machen. Ist das für Sie ok?
Wir verwenden Ihre Daten zu folgenden Zwecken:
In diesem Artikel lernen Sie das Modbus-TCP-Protokoll kennen, das im Prozessleitsystem weit verbreitet ist.
Inhalt:
In einem Ethernet-Netzwerk ist die Geräteadresse seine IP-Adresse. In der Regel befinden sich die Geräte im gleichen Subnetz, wobei sich die IP-Adressen bei Verwendung der gebräuchlichsten Subnetzmaske 255.255.255.0 um die letzten beiden Ziffern 192.168.1.20 unterscheiden.
Die Schnittstelle ist ein Ethernet-Netzwerk, das Datenübertragungsprotokoll ist TCP / IP.
Der verwendete TCP-Port lautet: 502.
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 nur die PDU, die Protocol Data Unit, übrig bleibt.
Nachfolgend ist ein Beispiel für eine Modbus-RTU-Anforderung zum Abrufen des AI-Werts (Analog Input) der Holding-Register an den Adressen 40108 bis 40110 des Geräts mit der ID 17 dargestellt. (Vergleiche: “Modbus RTU einfach gemacht mit detaillierten Beschreibungen und Beispielen”)
11 | Geräteadresse SlaveID (17 = 11 hex) |
03 | Funktionscode (Lesen: der Analogausgangs-Halteregister) |
006B | Adresse des ersten Registers (40108-40001 = 107 = 6B hex, Offset 40000 vorgegeben durch Funktionscode, Registeradressen werden ab 0 gezählt) |
0003 | Die Anzahl der erforderlichen Register (Lesen von 3 Registern von 40108 bis 40110) |
7687 | Prüfsumme CRC |
Die Adresse des SlaveID-Geräts und die CRC-Prüfsumme werden abgeschnitten, so erhält man die PDU:
03 006B 0003
Um die PDU nun in einem MODBUS TCP-Netz zu senden, wird ihr ein neuer 7-Byte-Header hinzugefügt, der MBAP-Header (Modbus Application Header) genannt wird. Dieser Header enthält die folgenden Daten:
Transaction Identifier: 2 Bytes werden vom Master gesetzt, um jede Anfrage eindeutig zu identifizieren. Kann beliebigen Wert annehmen (nicht sequenziell). Diese Bytes werden vom Slave-Gerät in der Antwort wiederholt, da die Antworten des Slave-Geräts möglicherweise nicht immer in der gleichen Reihenfolge wie die Anfragen empfangen werden. So können Antwort und Anfrage eindeutig zugeordnet werden.
Protokoll-Kennung: 2 Bytes werden vom Master gesetzt, wird immer 00 00 sein, was dem Modbus-Protokoll entspricht.
Länge: 2 Bytes werden vom Master festgelegt, die die Anzahl der Bytes in der folgenden Nachricht vorgibt. Sie wird vom Unit Identifier bis zum Ende der Nachricht gezählt.
Kennung der Einheit: 1 Byte wird vom Master gesetzt (Adresse des Slave-Gerätes). Es wird vom angesprochenen Slave-Gerät wiederholt, um die Antwort dem Slave zuordnen zu können.
Modbus RTU | Slave ID | PDU | 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 |
0001 | Bezeichner der Transaktion (Transaction ID) (identisch mit der der Anfrage) | Transaction Identifier |
0000 | Protokoll-Bezeichner (Protocol ID, immer 0000) | Protocol Identifier |
0006 | Die Nachrichtenlänge (6 Bytes bis zum Ende der Anfrage) | Message Length |
11 | Die Geräteadresse des Slaves (Absender der Antwort: 17 = 11 hex) | Unit Identifier |
03 | Funktionscode (Lesen des Analog Output Holding Registers) | Function Code |
006B | Adresse des ersten zu bearbeitenden Registers (107 = 40108-40001 = 6B hex) | Data Address of the first register |
0003 | Anzahl der zu bearbeitenden Register (hier: Auslesen von drei Registern 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
0001 | Bezeichner der Transaktion (Transaction ID) (identisch mit der der Anfrage) | Transaction Identifier |
0000 | Protokoll-Bezeichner (Protocol ID, immer 0000) | Protocol Identifier |
0009 | Die Nachrichtenlänge (9 Bytes bis zum Ende der Antwort) | Message Length |
11 | Die Geräteadresse des Slaves (Absender der Antwort: 17 = 11 hex) | Unit Identifier |
03 | Funktionscode (Lesen des Analog Output Holding Registers) | Function Code |
06 | Die Anzahl der folgenden Antwort-Bytes bis zum Ende der Nachricht (drei Register sollten ausgelesen werden, jedes Register fasst 16bit,es folgen also 6 Bytes) | Byte Count |
02 | Wert des Most Significant Bytes (MSB) des 1. Registers (02 hex) | Registerwert Hi (AO0) |
2B | Wert des Least Significant Bytes (LSB) des 1. Registers (2B hex) | Registerwert Lo (AO0) |
00 | Wert des Most Significant Bytes (MSB) des 2. Registers (00 hex) | Registerwert Hi (AO1) |
64 | Wert des Least Significant Bytes (LSB) des 2. Register (64 hex) | Registerwert Lo (AO1) |
00 | Wert des Most Significant Bytes (MSB) des 3. Registers (00 hex) | Register value Hi (AO2) |
7F | Wert des Least Significant Bytes (LSB) des 3. Register (7F hex) | Register value Lo (AO2) |
Das analoge Ausgangsregister mit der Adresse 40108 hat den Wert 02 2B HEX oder 555 im Dezimalsystem.
Das analoge Ausgaberegister mit der Adresse 40109 hat den Wert 00 64 HEX oder 100 im Dezimalsystem.
Das analoge Ausgaberegister mit der Adresse 40110 hat den Wert 00 7F HEX oder 127 im Dezimalsystem.
Funktionscode | Was die Funktion tut | Wertetyp | Zugriffstyp | |
---|---|---|---|---|
01 (0x01) | Read DO | Lesen des digitalen Ausgangs | Diskret | Lesen |
02 (0x02) | Read DI | Lesen des digitalen Eingangs | Diskret | Lesen |
03 (0x03) | Read AO | Lesen des analogen Ausgangs | 16 bit | Lesen |
04 (0x04) | Read AI | Lesen des analogen Eingangs | 16 bit | Lesen |
05 (0x05) | Write DO | Setzen eines digitalen Ausgangs | Diskret | Schreiben |
06 (0x06) | Write AO | Setzen eines analogen Ausgangs | 16 bit | Schreiben |
15 (0x0F) | Write multiple DO | Setzen mehrerer digitaler Ausgänge | Diskret | Schreiben |
16 (0x10) | Write multiple AO | Setzen mehrerer analoger Ausgänge | 16 bit | Schreiben |
Dieser Befehl dient zum Lesen der Werte der Digitalausgänge (DO).
Die PDU-Anforderung gibt die Startadresse des ersten DO-Registers und die nachfolgende Anzahl der erforderlichen DO-Werte an. In der PDU werden die DO-Werte von Null beginnend adressiert.
Die DO-Werte in der Antwort sind in einem Byte und entsprechen dem Wert der Bits.
Die Bitwerte sind als 1 = EIN und 0 = AUS definiert.
Das untere Bit des ersten Datenbytes enthält den DO-Wert, dessen Adresse in der Anforderung angegeben wurde. Die restlichen Werte von DO folgen dem aufsteigenden Wert bis zum höchsten Wert des Bytes. Diese. von rechts nach links.
Byte | Anfrage | Byte | Antwort |
---|---|---|---|
(Hex) | Fieldname | (Hex) | Fieldname |
01 | Transaktions-Bezeichner | 01 | Transaktions-Bezeichner |
02 | 02 | ||
00 | Protokoll-Bezeichner | 00 | Protokoll-Bezeichner |
00 | 00 | ||
00 | Nachrichtenlänge | 00 | Nachrichtenlänge |
06 | 04 | ||
01 | Geräteadresse | 01 | Geräteadresse |
01 | Funktionaler Code | 01 | Funktionaler Code |
00 | Adresse des ersten Bytes des Registers Hi | 01 | Anzahl der noch folgenden Bytes bis zum Ende der Antwort |
00 | Adresse des ersten Bytes des Registers Lo | 02 | Die Werte der digitalen Ausgänge DO0 und DO1 |
00 | Anzahl der Register Hi Byte | ||
02 | Anzahl der Register Lo Byte |
Die Ausgangszustände DO0-1 werden als 02 im Hexadezimalsystem dargestellt und entsprechen im Binärsystem 0000 0010.
Der Wert DO1 ist der zweite von rechts, und DO0 ist der erste von rechts (niederwertiges Bit).
Kanäle | - | - | - | - | - | - | DO 1 | DO 0 |
Bits | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Hex | 02 |
Dieser Befehl wird zum Lesen der Werte der digitalen Eingänge DI verwendet.
Byte | Anfrage | Byte | Antwort |
---|---|---|---|
(Hex) | Fieldname | (Hex) | Fieldname |
01 | Transaktions-Bezeichner | 01 | Transaktions-Bezeichner |
02 | 02 | ||
00 | Protokoll-Bezeichner | 00 | Protokoll-Bezeichner |
00 | 00 | ||
00 | Nachrichtenlänge | 00 | Nachrichtenlänge |
06 | 04 | ||
01 | Geräteadresse | 01 | Geräteadresse |
02 | Funktionaler Code | 02 | Funktionaler Code |
00 | Adresse des ersten Bytes des Registers Hi | 01 | Anzahl der noch folgenden Bytes bis zum Ende der Antwort |
00 | Adresse des ersten Bytes des Registers Lo | 03 | Die Werte der digitalen Eingänge DI0 und DI1 |
00 | Anzahl der Register Hi Byte | ||
02 | Anzahl der Register Lo Byte |
Die Ausgangszustände von DI 0-1 werden als 03 Hex-Werte oder im Binärsystem 0000 0011 angezeigt.
Der DI1-Wert ist der zweite von rechts, und der Wert von DI0 ist der erste von rechts (niederwertiges Bit).
Die anderen sechs Bits werden mit Nullen aufgefüllt.
Byte | Anfrage | Byte | Antwort |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
01 | Transaktions-Bezeichner | 01 | Transaktions-Bezeichner |
02 | 02 | ||
00 | Protokoll-Bezeichner | 00 | Protokoll-Bezeichner |
00 | 00 | ||
00 | Nachrichtenlänge | 00 | Nachrichtenlänge |
06 | 07 | ||
01 | Geräteadresse | 01 | Geräteadresse |
03 | Funktionaler Code | 03 | Funktionaler Code |
00 | Adresse des ersten Bytes des Registers Hi | 04 | Anzahl der noch folgenden Bytes bis zum Ende der Antwort |
00 | Adresse des ersten Bytes des Registers Lo | 02 | Registerwert Hi (AO0) |
00 | Anzahl der Register Hi Byte | 2B | Registerwert Lo (AO0) |
02 | Anzahl der Register Lo Byte | 00 | Registerwert Hi (AO1) |
64 | Registerwert Lo (AO1) |
Der Wert des analogen Ausgangs AO0 wird als 02 2B hex angegeben, was im Dezimalsystem dem Wert 555 entspricht.
Der Wert des analogen Ausgangs AO1 wird hexidezimal als 00 64 hexadezimal angegeben, was im Dezimalsystem dem Wert 100 entspricht.
Byte | Anfrage | Byte | Antwort |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
01 | Transaktions-Bezeichner | 01 | Transaktions-Bezeichner |
02 | 02 | ||
00 | Protokoll-Bezeichner | 00 | Protokoll-Bezeichner |
00 | 00 | ||
00 | Nachrichtenlänge | 00 | Nachrichtenlänge |
06 | 07 | ||
01 | Geräteadresse | 01 | Geräteadresse |
04 | Funktionaler Code | 04 | Funktionaler Code |
00 | Adresse des ersten Bytes des Registers Hi | 04 | Anzahl der noch folgenden Bytes bis zum Ende der Antwort |
00 | Adresse des ersten Bytes des Registers Lo | 00 | Register value Hi (AI0) |
00 | Anzahl der Register Hi Byte | 0A | Registerwert Lo (AI0) |
02 | Anzahl der Register Lo Byte | 00 | Registerwert Hi (AI1) |
64 | Registerwert Lo (AI1) |
Der Wert des analogen Eingangs AI0 wird als 00 0A hex- angegeben, was im Dezimalsystem dem Wert 10 entspricht.
Der Wert des analogen Eingangs AI1 wird alse 00 64 hex angegeben, was im Dezimalsystem dem Wert 100 entsprichtt.
Mit diesem Befehl wird ein Wert eines digitalen Ausgangs (DO) gesetzt.
Der Wert von FF 00 hex setzt den Ausgang auf ON.
Der Wert 00 00 hex setzt den Ausgang auf OFF.
Alle anderen Werte sind ungültig und haben keinen Einfluss auf den Ausgangsstatus.
Byte | Anfrage | Byte | Antwort |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
01 | Transaktions-Bezeichner | 01 | Transaktions-Bezeichner |
02 | 02 | ||
00 | Protokoll-Bezeichner | 00 | Protokoll-Bezeichner |
00 | 00 | ||
00 | Nachrichtenlänge | 00 | Nachrichtenlänge |
06 | 06 | ||
01 | Geräteadresse | 01 | Geräteadresse |
05 | Funktionaler Code | 05 | Funktionaler Code |
00 | Adresse des ersten Bytes des Registers Hi | 00 | Adresse des ersten Bytes des Registers Hi |
01 | Adresse des ersten Bytes des Registers Lo | 01 | Adresse des ersten Bytes des Registers Lo |
FF | zu setzender Wert im Hi Byte | FF | gesetzter Wert im Hi Byte |
00 | zu setzender Wert im Lo Byte | 00 | gesetzter Wert im Lo Byte |
Der Wert von DO1 wurde unabhängig vom urstprünglichen Zustand auf ON gesetzt.
Mit diesem Befehl wird ein Wert eines analogen Ausgangs (AO) gesetzt.
Byte | Anfrage | Byte | Antwort |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
01 | Transaktions-Bezeichner | 01 | Transaktions-Bezeichner |
02 | 02 | ||
00 | Protokoll-Bezeichner | 00 | Protokoll-Bezeichner |
00 | 00 | ||
00 | Nachrichtenlänge | 00 | Nachrichtenlänge |
06 | 06 | ||
01 | Geräteadresse | 01 | Geräteadresse |
06 | Funktionaler Code | 06 | Funktionaler Code |
00 | Adresse des ersten Bytes des Registers Hi | 00 | Adresse des ersten Bytes des Registers Hi |
01 | Adresse des ersten Bytes des Registers Lo | 01 | Adresse des ersten Bytes des Registers Lo |
55 | zu setzender Wert im Hi Byte | 55 | gesetzter Wert im Hi Byte |
FF | zu setzender Wert im Lo Byte | FF | gesetzter Wert im Lo Byte |
Der Ausgabestatus von AO0 wurde auf 55 FF hex oder im Dezimalsystem 22015 gesetzt.
Byte | Anfrage | Byte | Antwort |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
01 | Transaktions-Bezeichner | 01 | Transaktions-Bezeichner |
02 | 02 | ||
00 | Protokoll-Bezeichner | 00 | Protokoll-Bezeichner |
00 | 00 | ||
00 | Nachrichtenlänge | 00 | Nachrichtenlänge |
08 | 06 | ||
01 | Geräteadresse | 01 | Geräteadresse |
0F | Funktionaler Code | 0F | Funktionaler Code |
00 | Adresse des ersten Bytes des Registers Hi | 00 | Adresse des ersten Bytes des Registers Hi |
00 | Adresse des ersten Bytes des Registers Lo | 00 | Adresse des ersten Bytes des Registers Lo |
00 | Anzahl der Register Hi Byte | 00 | Anzahl der gesetzten Register Hi Byte |
02 | Anzahl der Register Lo Byte | 02 | Anzahl der gesetzten Register Lo Byte |
01 | Anzahl der noch folgenden Bytes bis zum Ende der Anfrage | ||
02 | zu setzende Werte im Hexadezimalsystem (hier 02 hex, was binär der Bitfolge 00000010 entspricht, lies; DO0 (ganz rechts) auf OFF setzen, DO1 auf ON setzen, da nur zwei Ausgänge gesetzt werden sollen, haben die anderen Nullen keine Bedeutung) |
Der Status von Digitalausgang DO1 wurde auf ON gesetzt.
Der Status von Digitalausgang DO0 wurde auf OFF gesetzt.
Byte | Anfrage | Byte | Antwort |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
01 | Transaktions-Bezeichner | 01 | Transaktions-Bezeichner |
02 | 02 | ||
00 | Protokoll-Bezeichner | 00 | Protokoll-Bezeichner |
00 | 00 | ||
00 | Nachrichtenlänge | 00 | Nachrichtenlänge |
0B | 06 | ||
01 | Geräteadresse | 01 | Geräteadresse |
10 | Funktionaler Code | 10 | Funktionaler Code |
00 | Adresse des ersten Bytes des Registers Hi | 00 | Adresse des ersten Bytes des Registers Hi |
00 | Adresse des ersten Bytes des Registers Lo | 00 | Adresse des ersten Bytes des Registers Lo |
00 | Anzahl der Register Hi Byte | 00 | Anzahl der gesetzten Register Hi Byte |
02 | Anzahl der Register Lo Byte | 02 | Anzahl der gesetzten Register Lo Byte |
04 | Anzahl der noch folgenden Bytes bis zum Ende der Antwort | ||
00 | zu setzender Wertt im Hi Byte des analogen Ausgangs AO0 | ||
0A | zu setzender Wertt im Hi Byte des analogen Ausgangs AL0 | ||
01 | zu setzender Wertt im Hi Byte des analogen Ausgangs AO1 | ||
02 | zu setzender Wertt im Hi Byte des analogen Ausgangs AL0 |
Der Ausgangsstatus von AO0 wurde auf 00 0A hex oder im Dezimalsystem 10 gesetzt.
Der Ausgabestatus von AO1 wurde auf 01 02 hexadezimal oder im Dezimalsystem 258 gesetzt.
Wenn das Gerät nach dem Empfang der Anfrage diese nicht verarbeiten kann, wird die Antwort mit einem Fehlercode gesendet.
Die Antwort enthält den modifizierten Funktionscode,bei dem das most significant Bit (MSB) auf 1 gesetzt ist.
Es war | Es wird |
---|---|
Funktionscode in der Abfrage | Funktionaler Fehlercode als 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 |
Byte | Anfrage | Byte | Antwort |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
01 | Transaktions-Bezeichner | 01 | Transaktions-Bezeichner |
02 | 02 | ||
00 | Protokoll-Bezeichner | 00 | Protokoll-Bezeichner |
00 | 00 | ||
00 | Nachrichtenlänge | 00 | Nachrichtenlänge |
06 | 03 | ||
0A | Geräteadresse | 0A | Geräteadresse |
01 | Funktionaler Code | 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 |
01 | Der empfangene Funktionscode kann nicht verarbeitet werden. |
02 | Die in der Anfrage angegebene Datenadresse ist nicht verfügbar. |
03 | Der im Abfragedatenfeld enthaltene Wert ist ein ungültiger Wert. |
04 | Ein nicht behebbarer Fehler trat auf, während der Slave versuchte, die angeforderte Aktion auszuführen. |
05 | Der Slave hat die Anfrage angenommen und bearbeitet sie, aber es dauert lange. Diese Antwort verhindert, dass der Host einen Zeitüberschreitungsfehler erzeugt. |
06 | Der Slave ist mit der Verarbeitung des Befehls beschäftigt. Der Master muss die Nachricht später wiederholen, wenn der Slave freigegeben wird. |
07 | Der Slave kann die in der Anforderung angegebene Programmfunktion nicht ausführen. Dieser Code wird bei einer erfolglosen Programmanforderung mit Funktionen mit den Nummern 13 oder 14 zurückgegeben. Der Master muss Diagnoseinformationen oder Fehlerinformationen vom Slave anfordern. |
08 | Der Slave hat beim Lesen des Erweiterungsspeichers einen Paritätsfehler festgestellt. Der Master kann die Anforderung wiederholen, aber normalerweise sind in solchen Fällen Reparaturen erforderlich. |
Im Folgenden finden Sie Programme, die Ihnen helfen, auf einfache Weise mit Modbus-TCP-Geräten zu interagieren.
Modbus Master Tool mit Unterstützung für Modbus RTU, ASCII, TCP. Download
Modbus TCP client mit Unterstützung für Modbus-TCP. Download