Modbus ist ein Anfrage-Antwort-Protokoll zum Lesen und Schreiben von Zahlen in Feldgeräten. Ein Client, etwa ein Gateway, eine SPS oder ein SCADA-System, sendet eine Anfrage an genau einen Server, etwa einen Energiezähler. Die Anfrage nennt eine Tabelle, eine Startadresse und eine Anzahl, und der Server antwortet mit den Werten oder einem Fehler. Modicon hat Modbus 1979 für seine SPS veröffentlicht; heute pflegt die Modbus Organization die Spezifikationen und stellt sie kostenlos bereit. Modbus läuft als Modbus RTU auf einer seriellen Leitung und als Modbus TCP über Ethernet und ist noch immer der gängigste Weg, Zähler, Wechselrichter, Frequenzumrichter und Anlagenregler auszulesen.
So funktioniert Modbus im Überblick
| Teil | Was es ist | Beispiel |
|---|---|---|
| Client (Master) | Das Gerät, das jede Anfrage sendet und zyklisch abfragt | Ein Gateway, eine SPS oder ein SCADA-Server |
| Server (Slave) | Das Gerät, das die Daten hält und antwortet, wenn es adressiert wird | Ein Energiezähler oder ein Wechselrichter |
| Adresse | Für welchen Server die Anfrage bestimmt ist | 1 bis 247 auf einer seriellen Leitung; IP-Adresse und Unit-ID bei TCP |
| Funktionscode | Was die Anfrage tut | 04, Eingangsregister lesen |
| Datenadresse und Anzahl | Welche Einträge der Tabelle, und wie viele | Ab 0, 2 Register lesen |
| Registertabelle | Die Liste des Herstellers, was jede Adresse bedeutet | Eingangsregister 0: Spannung L1, 32-Bit-Float, Volt |
| Fehlerprüfung | Nachweis, dass der Frame unverändert angekommen ist | Eine 16-Bit-CRC bei RTU; die TCP-Prüfungen bei Modbus TCP |
Die Spezifikation trennt die Protokolldateneinheit (PDU), also Funktionscode und Daten, von der Anwendungsdateneinheit (ADU), die für ein Übertragungsmedium Adresse und Fehlerprüfung ergänzt. Die PDU ist auf jedem Medium gleich; deshalb kann ein Gateway eine Anfrage von Modbus TCP an Modbus RTU weitergeben, ohne ihre Bedeutung zu ändern. Der Vergleich Modbus TCP und RTU stellt die beiden Varianten im Detail gegenüber.
Das Modbus-Datenmodell: vier Tabellen
Ein Modbus-Server stellt vier Tabellen bereit. Jeder Eintrag hat eine Adresse von 0 bis 65.535, und jede Tabelle hat eigene Funktionscodes:
| Tabelle | Größe eines Eintrags | Zugriff | Lesen mit | Schreiben mit |
|---|---|---|---|---|
| Coils | 1 Bit | Lesen und Schreiben | 01 | 05, 15 |
| Diskrete Eingänge | 1 Bit | Nur lesen | 02 | Keiner |
| Eingangsregister | 16 Bit | Nur lesen | 04 | Keiner |
| Holding-Register | 16 Bit | Lesen und Schreiben | 03 | 06, 16 |
Ein Register enthält ein 16-Bit-Wort. Alles Größere verteilt sich auf aufeinanderfolgende Register: Ein 32-Bit-Float oder -Integer belegt zwei, ein 64-Bit-Energiezähler vier. Das Protokoll legt nicht fest, welches Wort zuerst kommt, und Zählerhersteller verwenden beide Reihenfolgen. Werte sind außerdem oft skalierte Ganzzahlen, sodass ein Register mit 2302 für 230,2 V stehen kann. Der Leitfaden zu Registertabellen erklärt, wie man eine Tabellenzeile liest, die Konventionen 30001 und 40001 und die Wortreihenfolge.
Welche Tabelle verwendet wird, entscheidet der Hersteller. Viele Zähler legen Messwerte in Eingangsregister und Einstellungen in Holding-Register. Andere legen alles in Holding-Register, sodass Funktion 03 auch die Messwerte liest. Verlässlich ist nur die Registertabelle für das genaue Modell und die Firmware.
Modbus-Funktionscodes
Der Funktionscode ist das erste Byte jeder PDU. Diese begegnen Ihnen an Zählern und Reglern:
| Code | Name | Typische Verwendung |
|---|---|---|
| 01 (0x01) | Coils lesen | Zustände von Relais und Ausgängen |
| 02 (0x02) | Diskrete Eingänge lesen | Kontakt- und Alarmzustände |
| 03 (0x03) | Holding-Register lesen | Einstellungen, bei vielen Zählern auch Messwerte |
| 04 (0x04) | Eingangsregister lesen | Messwerte bei vielen Zählern |
| 05 (0x05) | Eine Coil schreiben | Ein Relais ein- oder ausschalten |
| 06 (0x06) | Ein Register schreiben | Einen Sollwert ändern |
| 15 (0x0F) | Mehrere Coils schreiben | Mehrere Ausgänge auf einmal setzen |
| 16 (0x10) | Mehrere Register schreiben | Einen 32-Bit-Sollwert oder einen Block Einstellungen schreiben |
| 23 (0x17) | Mehrere Register lesen/schreiben | Schreiben und zurücklesen in einer Transaktion |
| 43/14 (0x2B/0x0E) | Geräteidentifikation lesen | Hersteller, Produktcode und Firmwarestand |
Ein Lesezugriff liefert bis zu 125 Register oder 2.000 Coils, ein Schreibzugriff trägt bis zu 123 Register. Diese Grenzen ergeben sich aus der PDU von 253 Byte. Einen Block benachbarter Register in einer Anfrage zu lesen ist viel schneller, als sie einzeln zu lesen, doch viele Zähler lehnen einen Block ab, der eine Lücke in ihrer Tabelle überspannt.
Empfängt ein Server einen gültigen Frame, den er nicht ausführen kann, antwortet er mit einer Ausnahme: dem Funktionscode mit gesetztem höchstem Bit (0x83 für eine fehlgeschlagene Funktion 03) und einem Ausnahmecode. Das Werkzeug Modbus-Funktions- und Ausnahmecodes führt alle auf.
| Ausnahme | Bedeutung | Übliche Ursache vor Ort |
|---|---|---|
| 01 Unzulässige Funktion | Der Server unterstützt diesen Funktionscode nicht | Funktion 03 an einen Zähler, der 04 verwendet |
| 02 Unzulässige Datenadresse | Adresse oder Block liegt außerhalb der Tabelle | Eine um eins verschobene Adresse oder ein Block über eine Lücke |
| 03 Unzulässiger Datenwert | Anzahl oder Wert ist nicht erlaubt | Zu viele Register in einer Anfrage |
| 04 Fehler im Servergerät | Der Server ist bei der Ausführung gescheitert | Ein Gerätefehler |
| 0A, 0B Gateway-Pfad oder Ziel gescheitert | Ein Gateway hat das serielle Gerät nicht erreicht | Falsche Unit-ID oder ein toter serieller Bus |
Gar keine Antwort ist etwas anderes als eine Ausnahme. Ein Timeout bedeutet, dass die Anfrage den Server nie erreicht hat oder die Antwort nie zurückkam: Verdrahtung, serielle Einstellungen, Adresse oder ein Netzwerkproblem. Der Leitfaden zur Modbus-Fehlersuche geht beide Fälle durch.
Modbus RTU, ASCII und TCP
| Modbus RTU | Modbus ASCII | Modbus TCP | |
|---|---|---|---|
| Übertragung | Serielle Leitung, meist RS-485 | Serielle Leitung | Ethernet oder ein beliebiges IP-Netz |
| Kodierung | Binär | Hexadezimale Zeichen | Binär |
| Anfang und Ende des Frames | 3,5 Zeichenzeiten Ruhe | Ein Doppelpunkt, dann CR LF | Längenfeld im MBAP-Header |
| Fehlerprüfung | CRC-16 | LRC | Keine in Modbus; TCP und Ethernet prüfen die Daten |
| Adressierung | Serveradresse 1 bis 247 | Serveradresse 1 bis 247 | IP-Adresse plus Unit-ID |
| Clients | Einer pro Bus | Einer pro Bus | Mehrere, wenn der Server sie annimmt |
| Standardeinstellungen | 19.200 Baud, gerade Parität, 1 Stoppbit | 19.200 Baud, 7 Datenbits, gerade Parität | TCP-Port 502 |
Modbus RTU ist an Zählern mit Abstand am häufigsten. Modbus ASCII findet man in neuen Geräten kaum noch. Modbus TCP packt dieselbe PDU in einen 7-Byte-MBAP-Header: eine Transaktionskennung, eine Protokollkennung 0, eine Länge und die Unit-ID. Bei einem Gerät, das selbst am Ethernet hängt, wird die Unit-ID meist ignoriert oder auf 1 oder 255 gesetzt. Bei einem Gateway von TCP auf RTU wählt sie das serielle Gerät aus. Der Leitfaden RS-485 und Modbus erklärt, warum RTU und RS-485 zwei Schichten sind und nicht zwei Namen für dasselbe.
Rechenbeispiel: Spannung aus einem Zähler lesen
Die Registertabelle des Eastron SDM630 legt die Spannung Phase 2 gegen Neutralleiter in Eingangsregister 30003 ab, als 32-Bit-Float in Volt. 30003 ist das dritte Eingangsregister; die Anfrage trägt also Adresse 2 und fordert zwei Register an (einen Float). Für einen Zähler mit Adresse 1 ist die Modbus-RTU-Anfrage acht Byte lang:
| Byte | Wert | Bedeutung |
|---|---|---|
| 1 | 01 | Serveradresse 1 |
| 2 | 04 | Funktion 04, Eingangsregister lesen |
| 3 und 4 | 00 02 | Startadresse 2 (Register 30003) |
| 5 und 6 | 00 02 | Anzahl: 2 Register |
| 7 und 8 | D0 0B | CRC-16, niederwertiges Byte zuerst |
Der Zähler antwortet 01 04 04 43 67 99 9A B5 E4: Adresse 1, Funktion 04, 4 Datenbytes, die beiden Register 0x4367 und 0x999A und die CRC. Als IEEE-754-Float mit dem höherwertigen Wort zuerst dekodiert, ergibt 0x4367999A 231,6 V. Die CRC jedes Frames prüfen Sie mit dem CRC-Rechner:
Dieselbe Abfrage über Modbus TCP hat keine CRC. Der Client sendet 00 01 00 00 00 06 01 04 00 02 00 02: Transaktion 1, Protokoll 0, 6 folgende Bytes, Unit-ID 1 und dieselbe PDU. Der Zähler antwortet 00 01 00 00 00 07 01 04 04 43 67 99 9A: dieselbe Transaktion, 7 folgende Bytes (die Unit-ID und die 6 Byte lange PDU) und dieselben Daten. Hätte der Zähler stattdessen 01 84 02 geantwortet, wäre das Ausnahme 02: Die Adresse steht nicht in seiner Tabelle.
Was Modbus nicht leistet
Modbus überträgt Zahlen. Nicht übertragen werden:
- Einheiten und Skalierung. 2302 bedeutet nichts ohne die Angabe „V × 0,1“ aus der Registertabelle.
- Zeitstempel. Ein Messwert ist so alt wie die Abfrage, die ihn geholt hat. Der Client muss für jeden Wert die Empfangszeit festhalten.
- Qualität. Ein Zähler, dessen Spannungseingang ausgefallen ist, liefert womöglich 0 V ohne Fehler. Manche Tabellen bieten Statuswörter oder „nicht verfügbar“-Werte wie 0xFFFF oder NaN; der Client muss sie prüfen.
- Ereignisse. Ein Server kann nichts von sich aus senden. Eine Änderung wird erst bei der nächsten Abfrage sichtbar; das Abfrageintervall bestimmt also die Latenz.
- Sicherheit. Einfaches Modbus hat keine Anmeldung und keine Verschlüsselung. Betreiben Sie es nur in einem Netz, in dem jedes angeschlossene Gerät vertrauenswürdig ist, und trennen Sie es vom Büro- und Internetverkehr.
Wegen dieser Lücken ergänzt ein Gateway, das Modbus liest, meist Zeit, Einheit und ein Qualitätskennzeichen, bevor es den Messwert weitergibt, zum Beispiel über MQTT oder OPC UA. Sie erklären auch, warum dieselben Geräte oft im Vergleich BACnet und Modbus auftauchen: BACnet-Objekte tragen Einheiten und Statusflags, die Modbus-Register nicht haben.
Abfrage und Zeitverhalten
Auf einem seriellen Bus kann immer nur eine Transaktion laufen. Bei 9.600 Baud dauert jedes 11-Bit-Zeichen etwa 1,15 ms. Eine Anfrage von 8 Byte und eine Antwort mit 40 Registern von 85 Byte brauchen auf der Leitung etwa 106,6 ms, mit den beiden Ruhepausen von 3,5 Zeichen 114,6 ms. Dazu kommt die Antwortzeit des Zählers, typisch 20 bis 50 ms; jede Transaktion dauert also 135 bis 165 ms. Zehn Zähler mit je drei Blöcken brauchen etwa 4 bis 5 Sekunden pro Zyklus. Höhere Baudraten und weniger, größere Blöcke verkürzen den Zyklus. Der Rechner für Modbus-RTU-Zeiten liefert die Werte für jede Einstellung, und der Inbetriebnahme-Leitfaden rechnet ein Abfragebudget für einen realen Bus durch.
Modbus TCP ist pro Transaktion schneller, doch ein Gateway vor einem seriellen Bus sendet auf der seriellen Seite trotzdem eine Anfrage nach der anderen. Mehrere TCP-Clients, die dasselbe Gateway abfragen, teilen sich dessen seriellen Zyklus.
Modbus mit EpiSensor
Edge auf dem ZGW-20 Gateway ist ein Modbus-Client. Es liest Modbus-TCP-Geräte im Standortnetz und Modbus-RTU-Geräte am RS-485-Eingang der I/O-Platine der Industrial-Version des Gateways oder über einen USB-Seriell-Adapter. Es speichert jeden Wert mit Zeit, Einheit und Status und kann ausgewählte Werte als Modbus-TCP-Register an ein BMS oder SCADA-System bereitstellen. Ist ein Zähler weit vom Gateway entfernt, liest die ZMB Modbus Interface ihn an einem kurzen lokalen RS-485-Bus und sendet die Register über das Zigbee-Mesh. Das Geräteverzeichnis listet Zähler und Regler mit Registertabellen und Edge-Vorlagen, und der Leitfaden zu Modbus- und BACnet-Gateways vergleicht das Gateway mit Protokollkonvertern.
Häufige Fragen
Wofür wird Modbus verwendet?
Modbus verbindet eine Steuerung, ein Gateway oder ein SCADA-System mit Feldgeräten wie Energiezählern, Wechselrichtern, Frequenzumrichtern, SPS und Wärmepumpenreglern. Das abfragende System liest Werte wie Spannung, Leistung und Gesamtenergie aus den Registern des Geräts und kann Sollwerte oder Befehle schreiben, wo das Gerät es zulässt.
Ist Modbus ein serielles oder ein Ethernet-Protokoll?
Beides. Modbus RTU und Modbus ASCII laufen auf einer seriellen Leitung, meist RS-485. Modbus TCP läuft über Ethernet- und IP-Netze auf TCP-Port 502. Funktionscodes und Datenmodell sind bei allen dreien gleich; nur Rahmen und Adressierung ändern sich.
Was sind Modbus-Funktionscodes?
Der Funktionscode ist das Byte, das angibt, was die Anfrage tut. Die üblichen sind 01 Coils lesen, 02 diskrete Eingänge lesen, 03 Holding-Register lesen, 04 Eingangsregister lesen, 05 eine Coil schreiben, 06 ein Register schreiben, 15 mehrere Coils schreiben und 16 mehrere Register schreiben. Kann ein Server die Anfrage nicht ausführen, antwortet er mit dem Funktionscode plus 0x80 und einem Ausnahmecode.
Was ist der Unterschied zwischen Modbus-Master und -Slave?
Das sind die alten Namen für Client und Server. Der Master (Client) sendet jede Anfrage, ein Slave (Server) antwortet nur. Die Modbus Organization spricht heute von Client und Server, viele Datenblätter und Konfigurationsprogramme verwenden aber weiter Master und Slave.
Wie viele Geräte können in einem Modbus-Netz sein?
Auf einer seriellen Leitung kann ein Client die Server 1 bis 247 adressieren. Ein RS-485-Segment trägt ohne Repeater 32 Lasteinheiten, mit Transceivern geringerer Last mehr. Bei Modbus TCP hat jedes Gerät eine eigene IP-Adresse, und ein Gateway kann über die Unit-ID bis zu 247 serielle Geräte hinter einer IP-Adresse erreichen.
Ist Modbus sicher?
Einfaches Modbus hat weder Authentifizierung noch Verschlüsselung: Jeder Client, der ein Gerät erreicht, kann es lesen und, wo das Gerät Schreibzugriffe erlaubt, verändern. Betreiben Sie Modbus TCP in einem getrennten Netz oder hinter einem Gateway. Die Modbus Organization veröffentlicht außerdem Modbus/TCP Security mit TLS auf Port 802, das aber nur wenige Feldgeräte unterstützen.