https://ipc2u.de/artikel/wissenswertes/detaillierte-beschreibung-des-modbus-tcp-protokolls-mit-befehlsbeispielen/
17:00 20.04.2024
. .
Anmeldung
Login:
Passwort:


Passwort vergessen? Registrierung
Haben Sie Ihr Passwort vergessen?
e-Mail::
Haben Sie Ihr Passwort vergessen?
Es gibt keine Elemente in den Favoriten
Top-Artikel
Preis auf Anfrage
.
.
Warenkorb
Preis auf Anfrage
Rabatt -
Gesamtsumme:

Detaillierte Beschreibung des Modbus-TCP-Protokolls mit Befehlsbeispielen

main.jpg

In diesem Artikel lernen Sie das Modbus-TCP-Protokoll kennen, das im Prozessleitsystem weit verbreitet ist.

Inhalt:

Wohin soll ein Modbus-TCP-Befehl gesendet werden?

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.

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 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 03 006B 0003 7687

11Geräteadresse SlaveID (17 = 11 hex)
03Funktionscode (Lesen: der Analogausgangs-Halteregister)
006BAdresse des ersten Registers (40108-40001 = 107 = 6B hex, Offset 40000 vorgegeben durch Funktionscode, Registeradressen werden ab 0 gezählt)
0003Die Anzahl der erforderlichen Register (Lesen von 3 Registern von 40108 bis 40110)
7687Prü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:

01.png

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.

Beispiel für einen Modbus-TCP Anfrage- und einen Antwort-Rahmen.:

Modbus RTUSlave IDPDUCRC
Modbus RTU1103 006B 00037687
Modbus TCP0001 0000 0006 1103 006B 0003
Modbus TCPMBAP HeaderPDU
Modbus TCPADU, Application Data Unit

mit:

0001Bezeichner der Transaktion (Transaction ID) (identisch mit der der Anfrage)Transaction Identifier
0000Protokoll-Bezeichner (Protocol ID, immer 0000)Protocol Identifier
0006Die Nachrichtenlänge (6 Bytes bis zum Ende der Anfrage)Message Length
11Die Geräteadresse des Slaves (Absender der Antwort: 17 = 11 hex)Unit Identifier
03Funktionscode (Lesen des Analog Output Holding Registers)Function Code
006BAdresse des ersten zu bearbeitenden Registers (107 = 40108-40001 = 6B hex)Data Address of the first register
0003Anzahl 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

mit:

0001Bezeichner der Transaktion (Transaction ID) (identisch mit der der Anfrage)Transaction Identifier
0000Protokoll-Bezeichner (Protocol ID, immer 0000)Protocol Identifier
0009Die Nachrichtenlänge (9 Bytes bis zum Ende der Antwort)Message Length
11Die Geräteadresse des Slaves (Absender der Antwort: 17 = 11 hex)Unit Identifier
03Funktionscode (Lesen des Analog Output Holding Registers)Function Code
06Die 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
02Wert des Most Significant Bytes (MSB) des 1. Registers (02 hex)Registerwert Hi (AO0)
2BWert des Least Significant Bytes (LSB) des 1. Registers (2B hex)Registerwert Lo (AO0)
00Wert des Most Significant Bytes (MSB) des 2. Registers (00 hex)Registerwert Hi (AO1)
64Wert des Least Significant Bytes (LSB) des 2. Register (64 hex)Registerwert Lo (AO1)
00Wert des Most Significant Bytes (MSB) des 3. Registers (00 hex)Register value Hi (AO2)
7FWert 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.

Zurück zum Inhalt

Modbus-TCP Befehlstypen

Hier ist eine Tabelle mit den Modbus-TCP-Codes zum Lesen und Setzen der Werte in den Ein- und Ausgabe-Registern.

FunktionscodeWas die Funktion tutWertetypZugriffstyp
01 (0x01)Read DOLesen des digitalen AusgangsDiskretLesen
02 (0x02)Read DILesen des digitalen EingangsDiskretLesen
03 (0x03)Read AOLesen des analogen Ausgangs16 bitLesen
04 (0x04)Read AILesen des analogen Eingangs16 bitLesen
05 (0x05)Write DOSetzen eines digitalen AusgangsDiskretSchreiben
06 (0x06)Write AOSetzen eines analogen Ausgangs16 bitSchreiben
15 (0x0F)Write multiple DOSetzen mehrerer digitaler AusgängeDiskretSchreiben
16 (0x10)Write multiple AOSetzen mehrerer analoger Ausgänge16 bitSchreiben

Zurück zum Inhalt

Wie sende ich einen Modbus-TCP-Befehl zum Lesen der diskreten Ausgabe? Befehl 0x01

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.

Wenn weniger als acht DO-Werte angefordert wurden, werden die verbleibenden Bits in der Antwort mit Nullen aufgefüllt (in der Richtung vom Low- zum High-Byte). Der Field Byte Count (“Anzahl der noch folgenden Bytes bis zum Ende der Antwort”) gibt die Anzahl der vollen Datenbytes in der Antwort an.

ByteAnfrageByteAntwort
(Hex)Fieldname(Hex)Fieldname
01Transaktions-Bezeichner01Transaktions-Bezeichner
0202
00Protokoll-Bezeichner00Protokoll-Bezeichner
0000
00Nachrichtenlänge00Nachrichtenlänge
0604
01Geräteadresse01Geräteadresse
01Funktionaler Code01Funktionaler Code
00Adresse des ersten Bytes des Registers Hi01Anzahl der noch folgenden Bytes bis zum Ende der Antwort
00Adresse des ersten Bytes des Registers Lo02Die Werte der digitalen Ausgänge DO0 und DO1
00Anzahl der Register Hi Byte
02Anzahl 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).

Die anderen sechs Bits werden bis zum vollen Byte mit Nullen aufgefüllt, da sie nicht angefordert wurden.

Kanäle------DO 1DO 0
Bits00000010
Hex02

Zurück zum Inhalt

Wie sendet man einen Modbus-TCP-Befehl, um einen digitalen Eingang zu lesen? Befehl 0x02

Dieser Befehl wird zum Lesen der Werte der digitalen Eingänge DI verwendet.

Die Abfrage und Antwort für DI ist ähnlich wie die Abfrage für DO.

ByteAnfrageByteAntwort
(Hex)Fieldname(Hex)Fieldname
01Transaktions-Bezeichner01Transaktions-Bezeichner
0202
00Protokoll-Bezeichner00Protokoll-Bezeichner
0000
00Nachrichtenlänge00Nachrichtenlänge
0604
01Geräteadresse01Geräteadresse
02Funktionaler Code02Funktionaler Code
00Adresse des ersten Bytes des Registers Hi01Anzahl der noch folgenden Bytes bis zum Ende der Antwort
00Adresse des ersten Bytes des Registers Lo03Die Werte der digitalen Eingänge DI0 und DI1
00Anzahl der Register Hi Byte
02Anzahl 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.

Zurück zum Inhalt

Wie sendet man einen Modbus-TCP-Befehl zum Lesen des Analogausgangs? Befehl 0x03

Dieser Befehl dient zum Lesen der Werte der Analogausgänge AO.

ByteAnfrageByteAntwort
(Hex)Feldname(Hex)Feldname
01Transaktions-Bezeichner01Transaktions-Bezeichner
0202
00Protokoll-Bezeichner00Protokoll-Bezeichner
0000
00Nachrichtenlänge00Nachrichtenlänge
0607
01Geräteadresse01Geräteadresse
03Funktionaler Code03Funktionaler Code
00Adresse des ersten Bytes des Registers Hi04Anzahl der noch folgenden Bytes bis zum Ende der Antwort
00Adresse des ersten Bytes des Registers Lo02Registerwert Hi (AO0)
00Anzahl der Register Hi Byte2BRegisterwert Lo (AO0)
02Anzahl der Register Lo Byte00Registerwert Hi (AO1)
64Registerwert 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.

Zurück zum Inhalt

Wie sendet man einen Modbus-TCP-Befehl zum Lesen eines analogen Eingangs? Befehl 0x04

Dieser Befehl wird zum Lesen der Werte der Analogeingänge AI verwendet.

ByteAnfrageByteAntwort
(Hex)Feldname(Hex)Feldname
01Transaktions-Bezeichner01Transaktions-Bezeichner
0202
00Protokoll-Bezeichner00Protokoll-Bezeichner
0000
00Nachrichtenlänge00Nachrichtenlänge
0607
01Geräteadresse01Geräteadresse
04Funktionaler Code04Funktionaler Code
00Adresse des ersten Bytes des Registers Hi04Anzahl der noch folgenden Bytes bis zum Ende der Antwort
00Adresse des ersten Bytes des Registers Lo00Register value Hi (AI0)
00Anzahl der Register Hi Byte0ARegisterwert Lo (AI0)
02Anzahl der Register Lo Byte00Registerwert Hi (AI1)
64Registerwert 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.

Zurück zum Inhalt

Wie sende ich einen Modbus-TCP-Befehl, um einen diskreten Ausgang zu setzen? Befehl 0x05

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.

Die normale Antwort auf eine solche Anforderung ist ein Echo (eine Wiederholung der Anforderung in der Antwort), das nach Änderung des DO-Zustands zurückgegeben wird.

ByteAnfrageByteAntwort
(Hex)Feldname(Hex)Feldname
01Transaktions-Bezeichner01Transaktions-Bezeichner
0202
00Protokoll-Bezeichner00Protokoll-Bezeichner
0000
00Nachrichtenlänge00Nachrichtenlänge
0606
01Geräteadresse01Geräteadresse
05Funktionaler Code05Funktionaler Code
00Adresse des ersten Bytes des Registers Hi00Adresse des ersten Bytes des Registers Hi
01Adresse des ersten Bytes des Registers Lo01Adresse des ersten Bytes des Registers Lo
FFzu setzender Wert im Hi Byte FFgesetzter Wert im Hi Byte
00zu setzender Wert im Lo Byte 00gesetzter Wert im Lo Byte

Der Wert von DO1 wurde unabhängig vom urstprünglichen Zustand auf ON gesetzt.

Zurück zum Inhalt

Wie sende ich einen Modbus-TCP-Befehl, um einen analogen Ausgang zu setzen? Befehl 0x06

Mit diesem Befehl wird ein Wert eines analogen Ausgangs (AO) gesetzt.

Die normale Antwort auf eine solche Anforderung ist ebenfalls ein Echo (eine Wiederholung der Anforderung in der Antwort), das nach Änderung des AO-Zustands zurückgegeben wird.

ByteAnfrageByteAntwort
(Hex)Feldname(Hex)Feldname
01Transaktions-Bezeichner01Transaktions-Bezeichner
0202
00Protokoll-Bezeichner00Protokoll-Bezeichner
0000
00Nachrichtenlänge00Nachrichtenlänge
0606
01Geräteadresse01Geräteadresse
06Funktionaler Code06Funktionaler Code
00Adresse des ersten Bytes des Registers Hi00Adresse des ersten Bytes des Registers Hi
01Adresse des ersten Bytes des Registers Lo01Adresse des ersten Bytes des Registers Lo
55zu setzender Wert im Hi Byte55gesetzter Wert im Hi Byte
FFzu setzender Wert im Lo ByteFFgesetzter Wert im Lo Byte

Der Ausgabestatus von AO0 wurde auf 55 FF hex oder im Dezimalsystem 22015 gesetzt.

Zurück zum Inhalt

Wie sende ich einen Modbus-TCP-Befehl, um mehrere diskrete (digitale) Ausgänge gleichzeitig zu setzen? Befehl 0x0F

Dieser Befehl wird verwendet, um gleichzeitig mehrere Werte der Digitalausgänge (DO) zu setzen.

ByteAnfrageByteAntwort
(Hex)Feldname(Hex)Feldname
01Transaktions-Bezeichner01Transaktions-Bezeichner
0202
00Protokoll-Bezeichner00Protokoll-Bezeichner
0000
00Nachrichtenlänge00Nachrichtenlänge
0806
01Geräteadresse01Geräteadresse
0FFunktionaler Code0FFunktionaler Code
00Adresse des ersten Bytes des Registers Hi00Adresse des ersten Bytes des Registers Hi
00Adresse des ersten Bytes des Registers Lo00Adresse des ersten Bytes des Registers Lo
00Anzahl der Register Hi Byte00Anzahl der gesetzten Register Hi Byte
02Anzahl der Register Lo Byte02Anzahl der gesetzten Register Lo Byte
01Anzahl der noch folgenden Bytes bis zum Ende der Anfrage
02zu 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.

Zurück zum Inhalt

Wie sende ich einen Modbus-TCP-Befehl, um mehrere analoge Ausgänge gleichzeitig zu setzen? Befehl 0x10

Dieser Befehl wird verwendet, um gleichzeitig mehrere Werte der Analogausgänge (AO) zu setzen.

ByteAnfrageByteAntwort
(Hex)Feldname(Hex)Feldname
01Transaktions-Bezeichner01Transaktions-Bezeichner
0202
00Protokoll-Bezeichner00Protokoll-Bezeichner
0000
00Nachrichtenlänge00Nachrichtenlänge
0B06
01Geräteadresse01Geräteadresse
10Funktionaler Code10Funktionaler Code
00Adresse des ersten Bytes des Registers Hi00Adresse des ersten Bytes des Registers Hi
00Adresse des ersten Bytes des Registers Lo00Adresse des ersten Bytes des Registers Lo
00Anzahl der Register Hi Byte00Anzahl der gesetzten Register Hi Byte
02Anzahl der Register Lo Byte02Anzahl der gesetzten Register Lo Byte
04Anzahl der noch folgenden Bytes bis zum Ende der Antwort
00zu setzender Wertt im Hi Byte des analogen Ausgangs AO0
0Azu setzender Wertt im Hi Byte des analogen Ausgangs AL0
01zu setzender Wertt im Hi Byte des analogen Ausgangs AO1
02zu 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.

Zurück zum Inhalt

Modbus-TCP-Anforderungsfehler

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.

Zudem wird ein Fehlercode übergeben, der die Art des Fehlers angibt.

Es warEs wird
Funktionscode in der AbfrageFunktionaler Fehlercode als Antwort
01 (01 hex) 0000 0001129 (81 hex) 1000 0001
02 (02 hex) 0000 0010130 (82 hex) 1000 0010
03 (03 hex) 0000 0011131 (83 hex) 1000 0011
04 (04 hex) 0000 0100132 (84 hex) 1000 0100
05 (05 hex) 0000 0101133 (85 hex) 1000 0101
06 (06 hex) 0000 0110134 (86 hex) 1000 0110
15 (0F hex) 0000 1111143 (8F hex) 1000 1111
16 (10 hex) 0001 0000144 (90 hex) 1001 0000

Beispiel für eine Anfrage und Antwort mit Fehlermeldung:

ByteAnfrageByteAntwort
(Hex)Feldname(Hex)Feldname
01Transaktions-Bezeichner01Transaktions-Bezeichner
0202
00Protokoll-Bezeichner00Protokoll-Bezeichner
0000
00Nachrichtenlänge00Nachrichtenlänge
0603
0AGeräteadresse0AGeräteadresse
01Funktionaler Code81Funktionscode mit geändertem Bit
04Adresse des ersten Bytes des Registers Hi02Fehlercode
A1Adresse des ersten Bytes des Registers Lo
00Anzahl der Register Hi Byte
01Anzahl der Register Lo Byte

Erklärung der Fehlercodes

01Der empfangene Funktionscode kann nicht verarbeitet werden.
02Die in der Anfrage angegebene Datenadresse ist nicht verfügbar.
03Der im Abfragedatenfeld enthaltene Wert ist ein ungültiger Wert.
04Ein nicht behebbarer Fehler trat auf, während der Slave versuchte, die angeforderte Aktion auszuführen.
05Der Slave hat die Anfrage angenommen und bearbeitet sie, aber es dauert lange. Diese Antwort verhindert, dass der Host einen Zeitüberschreitungsfehler erzeugt.
06Der Slave ist mit der Verarbeitung des Befehls beschäftigt. Der Master muss die Nachricht später wiederholen, wenn der Slave freigegeben wird.
07Der 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.
08Der 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.

Zurück zum Inhalt

Programme für die Arbeit mit dem Modbus-TCP-Protokoll

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

02.png

Modbus TCP client mit Unterstützung für Modbus-TCP. Download

03.png

Zurück zum Inhalt

Geräte mit Modbus-TCP-Unterstützung

Zurück zum Inhalt

https://ipc2u.de/artikel/wissenswertes/detaillierte-beschreibung-des-modbus-tcp-protokolls-mit-befehlsbeispielen/
17:00 20.04.2024