Zählerschnittstellen

Was ist Modbus? So funktioniert das Modbus-Protokoll

Modbus ist ein Anfrage-Antwort-Protokoll: Ein Client liest und schreibt Register eines Servers. Datenmodell, Funktionscodes, RTU- und TCP-Frames.

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

TeilWas es istBeispiel
Client (Master)Das Gerät, das jede Anfrage sendet und zyklisch abfragtEin Gateway, eine SPS oder ein SCADA-Server
Server (Slave)Das Gerät, das die Daten hält und antwortet, wenn es adressiert wirdEin Energiezähler oder ein Wechselrichter
AdresseFür welchen Server die Anfrage bestimmt ist1 bis 247 auf einer seriellen Leitung; IP-Adresse und Unit-ID bei TCP
FunktionscodeWas die Anfrage tut04, Eingangsregister lesen
Datenadresse und AnzahlWelche Einträge der Tabelle, und wie vieleAb 0, 2 Register lesen
RegistertabelleDie Liste des Herstellers, was jede Adresse bedeutetEingangsregister 0: Spannung L1, 32-Bit-Float, Volt
FehlerprüfungNachweis, dass der Frame unverändert angekommen istEine 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:

TabelleGröße eines EintragsZugriffLesen mitSchreiben mit
Coils1 BitLesen und Schreiben0105, 15
Diskrete Eingänge1 BitNur lesen02Keiner
Eingangsregister16 BitNur lesen04Keiner
Holding-Register16 BitLesen und Schreiben0306, 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:

CodeNameTypische Verwendung
01 (0x01)Coils lesenZustände von Relais und Ausgängen
02 (0x02)Diskrete Eingänge lesenKontakt- und Alarmzustände
03 (0x03)Holding-Register lesenEinstellungen, bei vielen Zählern auch Messwerte
04 (0x04)Eingangsregister lesenMesswerte bei vielen Zählern
05 (0x05)Eine Coil schreibenEin Relais ein- oder ausschalten
06 (0x06)Ein Register schreibenEinen Sollwert ändern
15 (0x0F)Mehrere Coils schreibenMehrere Ausgänge auf einmal setzen
16 (0x10)Mehrere Register schreibenEinen 32-Bit-Sollwert oder einen Block Einstellungen schreiben
23 (0x17)Mehrere Register lesen/schreibenSchreiben und zurücklesen in einer Transaktion
43/14 (0x2B/0x0E)Geräteidentifikation lesenHersteller, 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.

AusnahmeBedeutungÜbliche Ursache vor Ort
01 Unzulässige FunktionDer Server unterstützt diesen Funktionscode nichtFunktion 03 an einen Zähler, der 04 verwendet
02 Unzulässige DatenadresseAdresse oder Block liegt außerhalb der TabelleEine um eins verschobene Adresse oder ein Block über eine Lücke
03 Unzulässiger DatenwertAnzahl oder Wert ist nicht erlaubtZu viele Register in einer Anfrage
04 Fehler im ServergerätDer Server ist bei der Ausführung gescheitertEin Gerätefehler
0A, 0B Gateway-Pfad oder Ziel gescheitertEin Gateway hat das serielle Gerät nicht erreichtFalsche 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 RTUModbus ASCIIModbus TCP
ÜbertragungSerielle Leitung, meist RS-485Serielle LeitungEthernet oder ein beliebiges IP-Netz
KodierungBinärHexadezimale ZeichenBinär
Anfang und Ende des Frames3,5 Zeichenzeiten RuheEin Doppelpunkt, dann CR LFLängenfeld im MBAP-Header
FehlerprüfungCRC-16LRCKeine in Modbus; TCP und Ethernet prüfen die Daten
AdressierungServeradresse 1 bis 247Serveradresse 1 bis 247IP-Adresse plus Unit-ID
ClientsEiner pro BusEiner pro BusMehrere, wenn der Server sie annimmt
Standardeinstellungen19.200 Baud, gerade Parität, 1 Stoppbit19.200 Baud, 7 Datenbits, gerade ParitätTCP-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:

ByteWertBedeutung
101Serveradresse 1
204Funktion 04, Eingangsregister lesen
3 und 400 02Startadresse 2 (Register 30003)
5 und 600 02Anzahl: 2 Register
7 und 8D0 0BCRC-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.