
In diesem Artikel erfahren Sie mehr über das Modbus RTU-Protokoll, das in Prozessleitsystemen weit verbreitet ist.
Inhalte:
- Beschreibung des Modbus RTU-Protokolls
- Was sind Modbus RTU-Befehle?
- Wie kann ich einen Modbus RTU-Befehl senden, um einen diskreten Ausgang zu lesen? Befehl 0x01
- Wie kann ich einen Modbus RTU-Befehl senden, um einen digitalen Eingang zu lesen? Befehl 0x02
- Wie kann ich einen Modbus RTU-Befehl senden, um einen analogen Ausgang zu lesen? Befehl 0x03
- Wie kann ich den Modbus RTU-Befehl senden, um den analogen Eingang zu lesen? Befehl 0x04
- Wie kann ich einen Modbus RTU-Befehl senden, um einen diskreten Ausgang zu schreiben? Befehl 0x05
- Wie kann ich einen Modbus RTU-Befehl senden, um einen analogen Ausgang zu speichern? Befehl 0x06
- Wie kann ich einen Modbus RTU-Befehl senden, um mehrere diskrete Pins zu schreiben? Befehl 0x0F
- Wie kann ich einen Modbus RTU-Befehl senden, um mehrere analoge Ausgänge zu speichern? Befehl 0x10
- Was sind die Fehler der Modbus-Anfrage?
- Programme zur Arbeit mit dem Modbus RTU-Protokoll
- Ausrüstung mit Modbus RTU-Unterstützung
Beschreibung des Modbus RTU-Protokolls
Modbus ist ein Kommunikationsprotokoll, das auf der Master-Slave-Architektur basiert. Es verwendet RS-485-, RS-422-, RS-232-Schnittstellen sowie Ethernet TCP/IP-Netzwerke (Modbus TCP-Protokoll) für die Datenübertragung.
Die Modbus RTU-Nachricht besteht aus der Adresse des SlaveID-Geräts, dem Funktionscode, den speziellen Daten, abhängig vom Funktionscode, und dem CRC-Prüfsummenwert.
SlaveID | Funktionscode | Spezielle Daten | CRC |
Wenn Sie die SlaveID-Adresse und die CRC-Prüfsumme entfernen, erhalten Sie die PDU, die Protocol Data Unit.
SlaveID ist die Adresse des Geräts, sie kann einen Wert von 0 bis 247 annehmen, die Adressen von 248 bis 255 sind reserviert.
Daten im Modul werden in 4 Tabellen gespeichert.
Zwei Tabellen sind schreibgeschützt und zwei sind Lese-Schreib.
9999 Werte werden in jeder Tabelle platziert. Lese-Schreib
REGISTERNUMMER | REGISTERADRESSE HEX | TYP | NAME | TYP |
---|---|---|---|---|
1-9999 | 0000 bis 270E | Lese-Schreib | Diskrete Ausgangsspulen | DO |
10001-19999 | 0000 bis 270E | Lesen | Diskrete Eingangs Kontakte | DI |
30001-39999 | 0000 bis 270E | Lesen | Analoge Eingangsregister | AI |
40001-49999 | 0000 bis 270E | Lese-Schreib | Analoge Ausgangshalte Register | AO |
Die Modbus-Nachricht verwendet die Registeradresse.
Zum Beispiel hat das erste Register des AO-Halte Registers die Nummer 40001, aber seine Adresse ist 0000.
Der Unterschied zwischen diesen beiden Größen ist der „Offset“.
Jede Tabelle hat ihren eigenen Offset, nämlich: 1, 10001, 30001 und 40001.
Im Folgenden ist ein Beispiel für eine Modbus RTU-Anfrage zur Ermittlung des AI-Werts der Halte Register von den Registern # 40108 bis 40110 mit der Adresse des Geräts 17.
11 03 006B 0003 7687
11 | DIE ADRESSE DES SLAVEID-GERÄTS (17 = 11 HEX) |
03 | Funktionscode |
006B | Die Adresse des ersten Registers (40108-40001 = 107 = 6B hex) |
0003 | Die Anzahl der benötigten Register (Lesen von 3 Registern von 40108 bis 40110) |
7687 | CRC-Prüfsumme |
Als Antwort auf das Modbus RTU Slave-Gerät erhalten wir:
11 03 06 AE41 5652 4340 49AD
Wo: Der Wert des oberen Registerbits
11 | GERÄTEADRESSE (17 = 11 hex) | SlaveID |
03 | Funktionscode | Funktionscode |
06 | Die Anzahl der weiteren Bytes (6 Bytes folgen) | Byte-Anzahl |
AE | Der Wert des oberen Registerbits (AE hex) | Registerwert Hi (AO0) |
41 | Das niederwertige Bit des Registers (41 hex) | Registerwert Lo (AO0) |
56 | Der Wert des oberen Registerbits (56 hex) | Registerwert Hi (AO1) |
52 | Das niederwertige Bit des Registers (52 hex) | Registerwert Lo (AO1) |
43 | Der Wert des oberen Registerbits (43 hex) | Registerwert Hi (AO2) |
40 | Das niederwertige Bit des Registers (40 hex) | Registerwert Lo (AO2) |
49 | Prüfsumme | CRC-Wert Hi |
AD | Prüfsumme | CRC-Wert Lo |
Das analoge Ausgangsregister AO0 hat den Wert AE 41 HEX oder 44609 im Dezimalsystem.
Das analoge Ausgangsregister AO1 hat den Wert 56 52 HEX oder 22098 im Dezimalsystem.
Das analoge Ausgangsregister AO2 hat den Wert 43 40 HEX oder 17216 im Dezimalsystem.
Der AE 41 HEX-Wert ist 16 Bit 1010 1110 0100 0001 und kann je nach Darstellungsart einen anderen Wert annehmen.
Der Wert des Registers 40108 ergibt in Kombination mit dem Register 40109 einen 32-Bit-Wert.
Ein Beispiel für eine Darstellung.
Anzeigetyp | Wertbereich | Beispiel in HEX | In dezimaler Form |
---|---|---|---|
16-Bit vorzeichenlose Ganzzahl | 0 bis 65535 | AE41 | 44.609 |
16-Bit vorzeichenbehaftete Ganzzahl | -32768 bis 32767 | AE41 | -20.927 |
Zwei Zeichen ASCII-Zeichenkette | 2 Zeichen | AE41 | ® A |
Diskreter Ein/Aus-Wert | 0 und 1 | 0001 | 0001 |
32-Bit vorzeichenlose Ganzzahl | 0 bis 4.294.967.295 | AE41 5652 | 2.923.517.522 |
32-Bit vorzeichenbehaftete Ganzzahl | -2.147.483.648 bis 2.147.483.647 | AE41 5652 | -1.371.449.774 |
32-Bit Fließkommazahl mit einfacher Genauigkeit nach IEEE | 1,2·10−38 bis 3,4×10+38 | AE41 5652 | -4.395978 E-11 |
Vier Zeichen ASCII-Zeichenkette | 4 Zeichen | AE41 5652 | ® A V R |
Was sind Modbus RTU-Befehle?
Hier ist eine Tabelle mit den Codes zum Lesen und Schreiben der Modbus RTU-Register.
FUNKTIONSCODE | WAS DIE FUNKTION MACHT | WERTTYP | ZUGRIFFSTYP | |
---|---|---|---|---|
01 (0x01) | Read DO | Lesen des Spulenstatus | Diskret | Lesen |
02 (0x02) | Read DI | Lesen des Eingangstatus | Diskret | Lesen |
03 (0x03) | Read AO | Lesen der Halteregister | 16 Bit | Lesen |
04 (0x04) | Read AI | Lesen der Eingangsregister | 16 Bit | Lesen |
05 (0x05) | Schreiben eines DO | Einzelne Spule zwingen | Diskret | Schreiben |
06 (0x06) | Schreiben eines AO | Einzelnes Register vorgeben | 16 Bit | Schreiben |
15 (0x0F) | Mehrfaches Schreiben von DO | Mehrere Spulen zwingen | Diskret | Schreiben |
16 (0x10) | Mehrfaches Schreiben von AO | Mehrere Register vorgeben | 16 Bit | Schreiben |
Wie kann ich einen Modbus RTU-Befehl senden, um einen diskreten Ausgang zu lesen? Befehl 0x01
Dieser Befehl wird verwendet, um die Werte der DO-Digitalausgänge zu lesen.
Die PDU-Anfrage gibt die Startadresse des ersten DO-Registers und die anschließende Anzahl der benötigten DO-Werte an. In der PDU werden die DO-Werte ab null adressiert.
Die DO-Werte in der Antwort sind in einem Byte und entsprechen dem Wert der Bits.
Die Bitwerte sind definiert als 1 = EIN und 0 = AUS.
Das niederwertige Bit des ersten Datenbytes enthält den DO-Wert, dessen Adresse in der Anfrage angegeben wurde. Die verbleibenden DO-Werte folgen mit zunehmendem Wert zum höchsten Wert des Bytes, also von rechts nach links.
Wenn weniger als acht DO-Werte angefordert wurden, werden die verbleibenden Bits in der Antwort mit Nullen gefüllt (in Richtung vom niederwertigen zum höherwertigen Byte). Byte Count Die Anzahl der weiteren Bytes gibt die Anzahl der vollen Datenbytes in der Antwort an.
Beispiel einer DO-Anfrage von 20 bis 56 für die SlaveID-Adresse des Geräts 17. Die Adresse des ersten Registers ist 0013 hex = 19, da die Zählung ab Adresse 0 erfolgt (0014 hex = 20, -1 Null-Offset ergibt 0013 hex = 19).
BYTE | ANFRAGE | BYTE | ANTWORT |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
11 | Geräteadresse | 11 | Geräteadresse |
01 | Funktionscode | 01 | Funktionscode |
00 | Adresse des ersten Registers Hi-Bytes | 05 | Anzahl der weiteren Bytes |
13 | Adresse des ersten Registers Lo-Bytes | CD | Registerwert DO 27-20 (1100 1101) |
00 | Anzahl der Register Hi-Bytes | 6B | Registerwert DO 35-28 (0110 1011) |
25 | Anzahl der Register Lo-Bytes | B2 | Registerwert DO 43-36 (1011 0010) |
0E | Prüfsumme CRC | 0E | Registerwert DO 51-44 (0000 1110) |
84 | Prüfsumme CRC | 1B | Registerwert DO 56-52 (0001 1011) |
45 | Prüfsumme CRC | ||
E6 | Prüfsumme CRC |
Die Ausgangszustände von DO 27-20 werden als die Werte des Bytes CD hex oder im Binärsystem 1100 1101 angezeigt.
Im Register DO 56-52 wurden 5 Bits rechts angefordert, und die verbleibenden Bits werden mit Nullen auf das volle Byte gefüllt (0001 1011).
Kanäle | - | - | - | DO 56 | DO 55 | DO 54 | DO 53 | DO 52 |
---|---|---|---|---|---|---|---|---|
Bits | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
Hex | 1B |
Wie kann ich einen Modbus RTU-Befehl senden, um einen digitalen Eingang zu lesen? Befehl 0x02
Dieser Befehl wird verwendet, um die Werte der digitalen Eingänge DI zu lesen.
Beispiel einer DI-Anfrage von den Registern # 10197 bis 10218 für die SlaveID-Adresse des Geräts 17. Die Adresse des ersten Registers ist 00C4 hex = 196, da die Zählung ab Adresse 0 erfolgt.
BYTE | ANFRAGE | BYTE | ANTWORT |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
11 | Geräteadresse | 11 | Geräteadresse |
02 | Funktionscode | 02 | Funktionscode |
00 | Adresse des ersten Registers Hi-Bytes | 03 | Anzahl der weiteren Bytes |
C4 | Adresse des ersten Registers Lo-Bytes | AC | Registerwert DI 10204-10197 (1010 1100) |
00 | Anzahl der Register Hi-Bytes | DB | Registerwert DI 10212-10205 (1101 1011) |
16 | Anzahl der Register Lo-Bytes | 35 | Registerwert DI 10218-10213 (0011 0101) |
BA | Prüfsumme CRC | 20 | Prüfsumme CRC |
A9 | Prüfsumme CRC | 18 | Prüfsumme CRC |
Wie kann ich einen Modbus RTU-Befehl senden, um einen analogen Ausgang zu lesen? Befehl 0x03
Dieser Befehl wird verwendet, um die Werte der analogen Ausgänge AO zu lesen.
Beispiel einer AO-Anfrage von den Registern # 40108 bis 40110 für die SlaveID des Geräteadresse 17. Die Adresse des ersten Registers ist 006B hex = 107, da die Zählung ab Adresse 0 erfolgt.
BYTE | ANFRAGE | BYTE | ANTWORT |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
11 | Geräteadresse | 11 | Geräteadresse |
03 | Funktionscode | 03 | Funktionscode |
00 | Adresse des ersten Registers Hi-Bytes | 06 | Anzahl der weiteren Bytes |
6B | Adresse des ersten Registers Lo-Bytes | AE | Registerwert Hi #40108 |
00 | Anzahl der Register Hi-Bytes | 41 | Registerwert Lo #40108 |
03 | Anzahl der Register Lo-Bytes | 56 | Registerwert Hi #40109 |
76 | Prüfsumme CRC | 52 | Registerwert Lo #40109 |
87 | Prüfsumme CRC | 43 | Registerwert Hi #40110 |
40 | Registerwert Lo #40110 | ||
49 | Prüfsumme CRC | ||
AD | Prüfsumme CRC |
Wie kann ich den Modbus RTU-Befehl senden, um den analogen Eingang zu lesen? Befehl 0x04
Dieser Befehl wird verwendet, um die Werte der analogen Eingänge AI zu lesen.
Beispiel einer AI-Anfrage von dem Register # 30009 für die SlaveID des Geräteadresse 17. Die Adresse des ersten Registers ist 0008 hex = 8, da die Zählung ab Adresse 0 erfolgt.
BYTE | ANFRAGE | BYTE | ANTWORT |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
11 | Geräteadresse | 11 | Geräteadresse |
04 | Funktionscode | 04 | Funktionscode |
00 | Adresse des ersten Registers Hi-Bytes | 02 | Anzahl der weiteren Bytes |
08 | Adresse des ersten Registers Lo-Bytes | 00 | Registerwert Hi #30009 |
00 | Anzahl der Register Hi-Bytes | 0A | Registerwert Lo #30009 |
01 | Anzahl der Register Lo-Bytes | F8 | Prüfsumme CRC |
B2 | Prüfsumme CRC | F4 | Prüfsumme CRC |
98 | Prüfsumme CRC |
Wie kann ich einen Modbus RTU-Befehl senden, um einen diskreten Ausgang zu schreiben? Befehl 0x05
Dieser Befehl wird verwendet, um einen Wert des DO-Digitalausgangs zu speichern.
Der Wert FF 00 hex setzt den Ausgang auf EIN.
Der Wert 00 00 hex setzt den Ausgang auf AUS.
Alle anderen Werte sind ungültig und werden nicht durch den Ausgangswert beeinflusst.
Die normale Antwort auf eine solche Anfrage ist ein Echo (eine Wiederholungsanfrage in der Antwort), das zurückgegeben wird, nachdem sich der DO-Zustand geändert hat.
Ein Beispiel für eine DO-Aufzeichnung mit Register # 173 für die SlaveID-Adresse des Geräts 17. Die Registeradresse wird 00AC hex = 172 sein, da die Zählung ab Adresse 0 erfolgt.
BYTE | ANFRAGE | BYTE | ANTWORT |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
11 | Geräteadresse | 11 | Geräteadresse |
05 | Funktionscode | 05 | Funktionscode |
00 | Adresse des ersten Registers Hi-Bytes | 00 | Adresse des ersten Registers Hi-Bytes |
AC | Adresse des ersten Registers Lo-Bytes | AC | Adresse des ersten Registers Lo-Bytes |
FF | Wert der Hi-Bytes | FF | Wert der Hi-Bytes |
00 | Wert der Lo-Bytes | 00 | Wert der Lo-Bytes |
4E | Prüfsumme CRC | 4E | Prüfsumme CRC |
8B | Prüfsumme CRC | 8B | Prüfsumme CRC |
Der DO173-Ausgangszustand hat sich von AUS zu EIN geändert.
Wie kann ich einen Modbus RTU-Befehl senden, um einen analogen Ausgang zu speichern? Befehl 0x06
Dieser Befehl wird verwendet, um einen Wert des analogen Ausgangs AO zu speichern.
Beispiel einer Speicherung im AO mit Register # 40002 für die SlaveID-Adresse des Geräts 17. Die Adresse des ersten Registers ist 0001 hex = 1, da die Zählung ab Adresse 0 erfolgt.
BYTE | ANFRAGE | BYTE | ANTWORT |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
11 | Geräteadresse | 11 | Geräteadresse |
06 | Funktionscode | 06 | Funktionscode |
00 | Adresse des ersten Registers Hi-Bytes | 00 | Adresse des ersten Registers Hi-Bytes |
01 | Adresse des ersten Registers Lo-Bytes | 01 | Adresse des ersten Registers Lo-Bytes |
00 | Wert der Hi-Bytes | 00 | Wert der Hi-Bytes |
03 | Wert der Lo-Bytes | 03 | Wert der Lo-Bytes |
9A | Prüfsumme CRC | 9A | Prüfsumme CRC |
9B | Prüfsumme CRC | 9B | Prüfsumme CRC |
Wie kann ich einen Modbus RTU-Befehl senden, um mehrere diskrete Pins zu schreiben? Befehl 0x0F
Dieser Befehl wird verwendet, um mehrere Werte der DO-Digitalausgänge zu speichern.
Ein Beispiel für das Schreiben in mehrere DOs mit den Registern von # 20 bis # 29 für die SlaveID-Adresse des Geräts 17. Die Registeradresse wird 0013 hex = 19 sein, da die Zählung ab Adresse 0 erfolgt.
BYTE | ANFRAGE | BYTE | ANTWORT |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
11 | Geräteadresse | 11 | Geräteadresse |
0F | Funktionscode | 0F | Funktionscode |
00 | Adresse des ersten Registers Hi-Bytes | 00 | Adresse des ersten Registers Hi-Bytes |
13 | Adresse des ersten Registers Lo-Bytes | 13 | Adresse des ersten Registers Lo-Bytes |
00 | Anzahl der Register Hi-Bytes | 00 | Anzahl der aufgezeichneten Register Hi-Bytes |
0A | Anzahl der Register Lo-Bytes | 0A | Anzahl der aufgezeichneten Register Lo-Bytes |
02 | Anzahl der weiteren Bytes | 26 | Prüfsumme CRC |
CD | Byte-Wert DO 27-20 (1100 1101) | 99 | Prüfsumme CRC |
01 | Byte-Wert DO 29-28 (0000 0001) | ||
BF | Prüfsumme CRC | ||
0B | Prüfsumme CRC |
Die Antwort gibt die Anzahl der aufgezeichneten Register zurück.
Wie kann ich einen Modbus RTU-Befehl senden, um mehrere analoge Ausgänge zu speichern? Befehl 0x10
Dieser Befehl wird verwendet, um mehrere Werte der analogen Ausgänge AO zu speichern.
Ein Beispiel für die Speicherung in mehrere AO mit den Registern # 40002 und # 40003 für die SlaveID-Adresse des Geräts 17. Die Adresse des ersten Registers ist 0001 hex = 1, da die Zählung ab Adresse 0 erfolgt.
BYTE | ANFRAGE | BYTE | ANTWORT |
---|---|---|---|
(Hex) | Feldname | (Hex) | Feldname |
11 | Geräteadresse | 11 | Geräteadresse |
10 | Funktionscode | 10 | Funktionscode |
00 | Adresse des ersten Registers Hi-Bytes | 00 | Adresse des ersten Registers Hi-Bytes |
01 | Adresse des ersten Registers Lo-Bytes | 01 | Adresse des ersten Registers Lo-Bytes |
00 | Anzahl der Register Hi-Bytes | 00 | Anzahl der aufgezeichneten Register Hi-Bytes |
02 | Anzahl der Register Lo-Bytes | 02 | Anzahl der aufgezeichneten Register Lo-Bytes |
04 | Anzahl der weiteren Bytes | 12 | Prüfsumme CRC |
00 | Wert Hi 40002 | 98 | Prüfsumme CRC |
0A | Wert Lo 40002 | ||
01 | Wert Hi 40003 | ||
02 | Wert Lo 40003 | ||
C6 | Prüfsumme CRC | ||
F0 | Prüfsumme CRC |
Was sind die Fehler der Modbus-Anfrage?
Wenn das Gerät eine Anfrage erhält, die nicht verarbeitet werden kann, antwortet das Gerät mit einem Fehlercode.
Die Antwort enthält den modifizierten Funktionscode, wobei das höchstwertige Bit 1 sein wird.
Beispiel:
ES WAR | ES WIRD |
---|---|
FUNKTIONSCODE IN DER ANFRAGE | Funktionaler Fehlercode 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 |
0A | Geräteadresse | 0A | Geräteadresse |
01 | Funktionscode | 81 | Funktionscode mit geändertem Bit |
04 | Adresse des ersten Registers Hi-Bytes | 02 | Fehlercode |
A1 | Adresse des ersten Registers Lo-Bytes | B0 | Prüfsumme CRC |
00 | Anzahl der Register Hi-Bytes | 53 | Prüfsumme CRC |
01 | Anzahl der Register Lo-Bytes | ||
AC | Prüfsumme CRC | ||
63 | Prüfsumme CRC |
Erklärung der Fehlercodes
01 | FUNKTIONSCODE AKZEPTIERT KANN NICHT VERARBEITET WERDEN. |
02 | Die in der Anfrage angegebene Datenadresse ist nicht verfügbar. |
03 | Der im Abfrage-Datenfeld enthaltene Wert ist ein ungültiger Wert. |
04 | Ein nicht wiederherstellbarer Fehler ist aufgetreten, während der Slave versucht hat, die angeforderte Aktion auszuführen. |
05 | Der Slave hat die Anfrage akzeptiert und verarbeitet sie, aber es dauert lange. Diese Antwort verhindert, dass der Host einen Timeout-Fehler generiert. |
06 | Der Slave ist mit der Verarbeitung des Befehls beschäftigt. Der Master muss die Nachricht später erneut senden, wenn der Slave frei ist. |
07 | Der Slave kann die im Anfrage spezifizierte Programmfunktion nicht ausführen. Dieser Code wird für eine fehlgeschlagene Programm-Anfrage mit Funktionen Nummer 13 oder 14 zurückgegeben. Der Master muss diagnostische Informationen oder Fehlerinformationen vom Slave anfordern. |
08 | Der Slave hat einen Paritätsfehler beim Lesen des erweiterten Speichers erkannt. Der Master kann die Anfrage wiederholen, aber in der Regel sind in solchen Fällen Reparaturen erforderlich. |
Programme zur Arbeit mit dem Modbus RTU-Protokoll
Die folgenden Programme erleichtern die Arbeit mit Modbus.
DCON Utility Pro mit Unterstützung für Modbus RTU, ASCII, DCON. Download

Modbus Master Tool mit Unterstützung für Modbus RTU, ASCII, TCP. Download

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