Modbus RTU einfach gemacht - mit detaillierten Beschreibungen und Beispielen

26 April 2017 Wissenswertes
ec217411deecb69bda56fce7f42a5af6.jpg

In diesem Artikel erfahren Sie mehr über das Modbus RTU-Protokoll, das in Prozessleitsystemen weit verbreitet ist.

Inhalte:

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.

SlaveIDFunktionscodeSpezielle DatenCRC

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

REGISTERNUMMERREGISTERADRESSE HEXTYPNAMETYP
1-99990000 bis 270ELese-SchreibDiskrete AusgangsspulenDO
10001-199990000 bis 270ELesenDiskrete Eingangs KontakteDI
30001-399990000 bis 270ELesenAnaloge EingangsregisterAI
40001-499990000 bis 270ELese-SchreibAnaloge Ausgangshalte RegisterAO

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

11DIE ADRESSE DES SLAVEID-GERÄTS (17 = 11 HEX)
03Funktionscode
006BDie Adresse des ersten Registers (40108-40001 = 107 = 6B hex)
0003Die Anzahl der benötigten Register (Lesen von 3 Registern von 40108 bis 40110)
7687CRC-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

11GERÄTEADRESSE (17 = 11 hex)SlaveID
03FunktionscodeFunktionscode
06Die Anzahl der weiteren Bytes (6 Bytes folgen)Byte-Anzahl
AEDer Wert des oberen Registerbits (AE hex)Registerwert Hi (AO0)
41Das niederwertige Bit des Registers (41 hex)Registerwert Lo (AO0)
56Der Wert des oberen Registerbits (56 hex)Registerwert Hi (AO1)
52Das niederwertige Bit des Registers (52 hex)Registerwert Lo (AO1)
43Der Wert des oberen Registerbits (43 hex)Registerwert Hi (AO2)
40Das niederwertige Bit des Registers (40 hex)Registerwert Lo (AO2)
49PrüfsummeCRC-Wert Hi
ADPrüfsummeCRC-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.

AnzeigetypWertbereichBeispiel in HEXIn dezimaler Form
16-Bit vorzeichenlose Ganzzahl0 bis 65535AE4144.609
16-Bit vorzeichenbehaftete Ganzzahl-32768 bis 32767AE41-20.927
Zwei Zeichen ASCII-Zeichenkette2 ZeichenAE41® A
Diskreter Ein/Aus-Wert0 und 100010001
32-Bit vorzeichenlose Ganzzahl0 bis 4.294.967.295AE41 56522.923.517.522
32-Bit vorzeichenbehaftete Ganzzahl-2.147.483.648 bis 2.147.483.647AE41 5652-1.371.449.774
32-Bit Fließkommazahl mit einfacher Genauigkeit nach IEEE1,2·10−38 bis 3,4×10+38AE41 5652-4.395978 E-11
Vier Zeichen ASCII-Zeichenkette4 ZeichenAE41 5652® A V R

Zurück zum Inhalt

Was sind Modbus RTU-Befehle?

Hier ist eine Tabelle mit den Codes zum Lesen und Schreiben der Modbus RTU-Register.

FUNKTIONSCODEWAS DIE FUNKTION MACHTWERTTYPZUGRIFFSTYP
01 (0x01)Read DOLesen des SpulenstatusDiskretLesen
02 (0x02)Read DILesen des EingangstatusDiskretLesen
03 (0x03)Read AOLesen der Halteregister16 BitLesen
04 (0x04)Read AILesen der Eingangsregister16 BitLesen
05 (0x05)Schreiben eines DOEinzelne Spule zwingenDiskretSchreiben
06 (0x06)Schreiben eines AOEinzelnes Register vorgeben16 BitSchreiben
15 (0x0F)Mehrfaches Schreiben von DOMehrere Spulen zwingenDiskretSchreiben
16 (0x10)Mehrfaches Schreiben von AOMehrere Register vorgeben16 BitSchreiben

Zurück zum Inhalt

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

BYTEANFRAGEBYTEANTWORT
(Hex)Feldname(Hex)Feldname
11Geräteadresse11Geräteadresse
01Funktionscode01Funktionscode
00Adresse des ersten Registers Hi-Bytes05Anzahl der weiteren Bytes
13Adresse des ersten Registers Lo-BytesCDRegisterwert DO 27-20 (1100 1101)
00Anzahl der Register Hi-Bytes6BRegisterwert DO 35-28 (0110 1011)
25Anzahl der Register Lo-BytesB2Registerwert DO 43-36 (1011 0010)
0EPrüfsumme CRC0ERegisterwert DO 51-44 (0000 1110)
84Prüfsumme CRC1BRegisterwert DO 56-52 (0001 1011)
45Prüfsumme CRC
E6Prü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 56DO 55DO 54DO 53DO 52
Bits00011011
Hex1B

Zurück zum Inhalt

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.

BYTEANFRAGEBYTEANTWORT
(Hex)Feldname(Hex)Feldname
11Geräteadresse11Geräteadresse
02Funktionscode02Funktionscode
00Adresse des ersten Registers Hi-Bytes03Anzahl der weiteren Bytes
C4Adresse des ersten Registers Lo-BytesACRegisterwert DI 10204-10197 (1010 1100)
00Anzahl der Register Hi-BytesDBRegisterwert DI 10212-10205 (1101 1011)
16Anzahl der Register Lo-Bytes35Registerwert DI 10218-10213 (0011 0101)
BAPrüfsumme CRC20Prüfsumme CRC
A9Prüfsumme CRC18Prüfsumme CRC

Zurück zum Inhalt

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.

BYTEANFRAGEBYTEANTWORT
(Hex)Feldname(Hex)Feldname
11Geräteadresse11Geräteadresse
03Funktionscode03Funktionscode
00Adresse des ersten Registers Hi-Bytes06Anzahl der weiteren Bytes
6BAdresse des ersten Registers Lo-BytesAERegisterwert Hi #40108
00Anzahl der Register Hi-Bytes41Registerwert Lo #40108
03Anzahl der Register Lo-Bytes56Registerwert Hi #40109
76Prüfsumme CRC52Registerwert Lo #40109
87Prüfsumme CRC43Registerwert Hi #40110
40Registerwert Lo #40110
49Prüfsumme CRC
ADPrüfsumme CRC

Zurück zum Inhalt

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.

BYTEANFRAGEBYTEANTWORT
(Hex)Feldname(Hex)Feldname
11Geräteadresse11Geräteadresse
04Funktionscode04Funktionscode
00Adresse des ersten Registers Hi-Bytes02Anzahl der weiteren Bytes
08Adresse des ersten Registers Lo-Bytes00Registerwert Hi #30009
00Anzahl der Register Hi-Bytes0ARegisterwert Lo #30009
01Anzahl der Register Lo-BytesF8Prüfsumme CRC
B2Prüfsumme CRCF4Prüfsumme CRC
98Prüfsumme CRC

Zurück zum Inhalt

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.

BYTEANFRAGEBYTEANTWORT
(Hex)Feldname(Hex)Feldname
11Geräteadresse11Geräteadresse
05Funktionscode05Funktionscode
00Adresse des ersten Registers Hi-Bytes00Adresse des ersten Registers Hi-Bytes
ACAdresse des ersten Registers Lo-BytesACAdresse des ersten Registers Lo-Bytes
FFWert der Hi-BytesFFWert der Hi-Bytes
00Wert der Lo-Bytes00Wert der Lo-Bytes
4EPrüfsumme CRC4EPrüfsumme CRC
8BPrüfsumme CRC8BPrüfsumme CRC

Der DO173-Ausgangszustand hat sich von AUS zu EIN geändert.

Zurück zum Inhalt

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.

BYTEANFRAGEBYTEANTWORT
(Hex)Feldname(Hex)Feldname
11Geräteadresse11Geräteadresse
06Funktionscode06Funktionscode
00Adresse des ersten Registers Hi-Bytes00Adresse des ersten Registers Hi-Bytes
01Adresse des ersten Registers Lo-Bytes01Adresse des ersten Registers Lo-Bytes
00Wert der Hi-Bytes00Wert der Hi-Bytes
03Wert der Lo-Bytes03Wert der Lo-Bytes
9APrüfsumme CRC9APrüfsumme CRC
9BPrüfsumme CRC9BPrüfsumme CRC

Zurück zum Inhalt

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.

BYTEANFRAGEBYTEANTWORT
(Hex)Feldname(Hex)Feldname
11Geräteadresse11Geräteadresse
0FFunktionscode0FFunktionscode
00Adresse des ersten Registers Hi-Bytes00Adresse des ersten Registers Hi-Bytes
13Adresse des ersten Registers Lo-Bytes13Adresse des ersten Registers Lo-Bytes
00Anzahl der Register Hi-Bytes00Anzahl der aufgezeichneten Register Hi-Bytes
0AAnzahl der Register Lo-Bytes0AAnzahl der aufgezeichneten Register Lo-Bytes
02Anzahl der weiteren Bytes26Prüfsumme CRC
CDByte-Wert DO 27-20 (1100 1101)99Prüfsumme CRC
01Byte-Wert DO 29-28 (0000 0001)
BFPrüfsumme CRC
0BPrüfsumme CRC

Die Antwort gibt die Anzahl der aufgezeichneten Register zurück.

Zurück zum Inhalt

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.

BYTEANFRAGEBYTEANTWORT
(Hex)Feldname(Hex)Feldname
11Geräteadresse11Geräteadresse
10Funktionscode10Funktionscode
00Adresse des ersten Registers Hi-Bytes00Adresse des ersten Registers Hi-Bytes
01Adresse des ersten Registers Lo-Bytes01Adresse des ersten Registers Lo-Bytes
00Anzahl der Register Hi-Bytes00Anzahl der aufgezeichneten Register Hi-Bytes
02Anzahl der Register Lo-Bytes02Anzahl der aufgezeichneten Register Lo-Bytes
04Anzahl der weiteren Bytes12Prüfsumme CRC
00Wert Hi 4000298Prüfsumme CRC
0AWert Lo 40002
01Wert Hi 40003
02Wert Lo 40003
C6Prüfsumme CRC
F0Prüfsumme CRC

Zurück zum Inhalt

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 WARES WIRD
FUNKTIONSCODE IN DER ANFRAGEFunktionaler Fehlercode in der 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 einer Anfrage und Antwort mit Fehler:

BYTEANFRAGEBYTEANTWORT
(Hex)Feldname(Hex)Feldname
0AGeräteadresse0AGeräteadresse
01Funktionscode81Funktionscode mit geändertem Bit
04Adresse des ersten Registers Hi-Bytes02Fehlercode
A1Adresse des ersten Registers Lo-BytesB0Prüfsumme CRC
00Anzahl der Register Hi-Bytes53Prüfsumme CRC
01Anzahl der Register Lo-Bytes
ACPrüfsumme CRC
63Prüfsumme CRC

Erklärung der Fehlercodes

01FUNKTIONSCODE AKZEPTIERT KANN NICHT VERARBEITET WERDEN.
02Die in der Anfrage angegebene Datenadresse ist nicht verfügbar.
03Der im Abfrage-Datenfeld enthaltene Wert ist ein ungültiger Wert.
04Ein nicht wiederherstellbarer Fehler ist aufgetreten, während der Slave versucht hat, die angeforderte Aktion auszuführen.
05Der Slave hat die Anfrage akzeptiert und verarbeitet sie, aber es dauert lange. Diese Antwort verhindert, dass der Host einen Timeout-Fehler generiert.
06Der Slave ist mit der Verarbeitung des Befehls beschäftigt. Der Master muss die Nachricht später erneut senden, wenn der Slave frei ist.
07Der 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.
08Der 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.

Zurück zum Inhalt

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

c56fd3305f1bcc96bca667f3f0b76516.jpg

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

a718857547d9d8981b3e94b94293f129.jpg

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

77b0fb43b46161eddf2a933770aaac6f.jpg

Zurück zum Inhalt

Ausrüstung mit Modbus RTU-Unterstützung

Zurück zum Inhalt