Modbus ist ein offenes Kommunikationsprotokoll für Zähler, Steuerungen und Sensoren: Ein Master (bei Modbus TCP der Client) fragt Werte ab, die jedes Gerät in nummerierten Registern bereitstellt. Eine Modbus-Registertabelle ist die Tabelle in der Gerätedokumentation, die jeden bereitgestellten Wert auflistet und zeigt, wo er zu lesen ist. Für jeden Wert sollte sie Registertyp, Adresse, Datentyp, Wortreihenfolge, Skalierung und Einheit angeben. Die meisten falschen Modbus-Messwerte entstehen durch eines dieser sechs Felder, nicht durch die Verbindung. Dieser Leitfaden erklärt die Felder und zeigt, wie Sie einen ausgelesenen Wert prüfen.
Dieser Leitfaden gehört zur Reihe über Modbus und RS-485. Dieselben Regeln gelten für Modbus RTU und Modbus TCP.
Das Protokoll rund um die Tabelle, mit Anfragen, Funktionscodes und Ausnahmen, erklärt Was ist Modbus?.
So lesen Sie eine Registertabelle: eine Beispielzeile
Das Protokolldokument von Eastron für den Drehstromzähler SDM630 beginnt seine Tabelle der Eingangsregister mit der Spannung Phase 1 gegen Neutralleiter unter der Referenz 30001, Startadresse 00 00 hexadezimal, in Volt, und gibt an, dass jeder Wert ein IEEE-754-Float in zwei Registern ist. Feld für Feld ausgeschrieben lautet die Zeile:
| Feld | In der Zeile | Was es bedeutet |
|---|---|---|
| Name | Spannung Phase 1 gegen Neutralleiter | Die Messgröße |
| Referenz | 30001 | Tabelle 3, Eingangsregister, Register 1 |
| Funktionscode | 04, Eingangsregister lesen | Die Funktion, die diese Tabelle liest |
| Adresse in der Anfrage | 0 (0x0000) | Die nullbasierte Protokolladresse |
| Datentyp und Länge | float32, 2 Register | Beide Register lesen und gemeinsam dekodieren |
| Wortreihenfolge | Normal oder vertauscht, am Zähler eingestellt | An einem Live-Wert prüfen, nicht aus der Voreinstellung ableiten |
| Einheit und Skalierung | V, kein Skalierungsfaktor | Der dekodierte Float ist bereits in Volt |
Die Anfrage lautet also Funktion 04, Adresse 0, Anzahl 2. Eine Antwort 4366 0000 ergibt mit dem höherwertigen Wort zuerst 230,0 V. Vergleichen Sie den Wert mit der Anzeige des Zählers, bevor Sie den Rest der Tabelle lesen. Die Geräteseite des SDM630-Modbus zeigt mehr aus dieser Tabelle und eine Edge-Vorlage für den Zähler.
Die vier Modbus-Registertypen
Das Modbus-Anwendungsprotokoll definiert vier Tabellen mit jeweils eigenen Funktionscodes:
| Tabelle | Größe | Zugriff | Lesen mit | Schreiben mit | Klassische Referenz |
|---|---|---|---|---|---|
| Coils | 1 Bit | Lesen und Schreiben | 01 | 05, 15 | 0xxxx |
| Diskrete Eingänge | 1 Bit | Nur lesen | 02 | Keiner | 1xxxx |
| Eingangsregister | 16 Bit | Nur lesen | 04 | Keiner | 3xxxx |
| Holding-Register | 16 Bit | Lesen und Schreiben | 03 | 06, 16 | 4xxxx |
Jedes Register hat 16 Bit, zwei Bytes mit dem höherwertigen Byte zuerst; Coils und diskrete Eingänge sind einzelne Bits. Jede Tabelle hat in der Anfrage Adressen von 0 bis 65.535. Energiezähler stellen Messwerte meist in Eingangs- oder Holding-Registern und Einstellungen in Holding-Registern bereit. Verwenden Sie den Funktionscode aus der Registertabelle. Ein Eingangsregister mit Funktion 03 zu lesen liefert einen anderen Wert oder eine Ausnahmeantwort.
Adresskonventionen
Registertabellen schreiben dasselbe Register auf verschiedene Arten. Die Anfrage auf der Leitung enthält immer eine bei null beginnende Adresse:
| Schreibweise in der Registertabelle | Bedeutung | Adresse in der Anfrage |
|---|---|---|
| 40001 | Klassische fünfstellige Referenz: Tabelle 4, Register 1 | 0 |
| 400001 | Erweiterte sechsstellige Referenz | 0 |
| 1 (bei eins beginnend) | Register 1 der angegebenen Tabelle | 0 |
| 0 oder 0x0000 (bei null beginnend) | Protokolladresse | 0 |
Wenn eine Registertabelle Konventionen mischt oder das Konfigurationswerkzeug eine andere erwartet, entsteht ein Versatz um eins: Jeder Wert stammt aus dem benachbarten Register. Bestätigen Sie die Konvention zuerst anhand eines bekannten Werts. Der Modbus-Adressrechner wandelt zwischen den Schreibweisen um:
Datentypen
Ein Register enthält 16 Bit. Die Registertabelle legt fest, wie diese Bits interpretiert werden:
| Typ | Register | Wertebereich oder Genauigkeit |
|---|---|---|
| uint16 | 1 | 0 bis 65.535 |
| int16 | 1 | −32.768 bis 32.767 |
| uint32, int32 | 2 | Etwa ±2,1 Milliarden (mit Vorzeichen) oder 0 bis 4,29 Milliarden |
| float32 (IEEE 754) | 2 | Etwa 7 signifikante Stellen |
| uint64, int64 | 4 | Exakte ganze Zahlen mit mindestens 18 Stellen |
| float64 | 4 | Etwa 15 bis 16 signifikante Stellen |
Dieselben Bits ergeben je nach Typ unterschiedliche Zahlen. Der Registerwert 0xFFF6 entspricht als uint16 der Zahl 65.526, als int16 aber −10. Entnehmen Sie das Vorzeichen dem Datentyp in der Registertabelle, nicht dem angezeigten Wert. Kälteregler sind ein häufiger Fall: Ein Tiefkühlgerät bei −18,0 °C sendet −180 Zehntel, was als 65.356 erscheint, wenn das Register ohne Vorzeichen dekodiert wird. Der Leitfaden zu Kältereglern listet die vorzeichenbehafteten Temperaturregister von Danfoss-, Carel- und Dixell-Reglern auf.
float32 hat etwa sieben signifikante Stellen. Ein als float32 gespeicherter Energiezählerstand von 12.345.678,9 kWh kann eine Änderung um 0,1 kWh nicht mehr darstellen. Deshalb bieten viele Zähler Energie zusätzlich als 32- oder 64-Bit-Ganzzahl an.
Wortreihenfolge bei 32- und 64-Bit-Werten
Die Modbus-Spezifikation legt die Bytereihenfolge innerhalb eines Registers fest: Das höherwertige Byte steht zuerst. Die Reihenfolge der Register innerhalb eines Werts aus mehreren Registern legt sie nicht fest; Hersteller verwenden unterschiedliche Varianten. Benennen Sie die Reihenfolge anhand der Bytes des Werts, wobei A das höchstwertige Byte ist:
| Reihenfolge | Register beim Lesen | Übliche Beschreibung |
|---|---|---|
| ABCD | Höherwertiges Wort, dann niederwertiges Wort | Big-Endian, höherwertiges Wort zuerst |
| CDAB | Niederwertiges Wort, dann höherwertiges Wort | Wörter vertauscht |
| BADC | Höherwertiges Wort zuerst, Bytes vertauscht | Bytes vertauscht |
| DCBA | Niederwertiges Wort zuerst, Bytes vertauscht | Little-Endian |
Eine falsche Reihenfolge liefert einen scheinbar zufälligen, nicht nur leicht abweichenden Wert. Ein uint32-Zählerstand von 100.000 liegt in ABCD-Reihenfolge als 0x0001 und danach 0x86A0 vor. Falsch interpretiert ergeben dieselben Wörter 2.258.632.705:
Der Modbus-Registerdecoder zeigt alle vier Reihenfolgen nebeneinander. Der IEEE-754-Float-Rechner zeigt die Kodierung einer Gleitkommazahl.
Skalierung und Einheiten
Viele Zähler senden eine Ganzzahl und einen Skalierungsfaktor. In der Registertabelle kann der Faktor auf drei Arten angegeben sein:
- Fester Faktor. „Spannung, uint16, 0,1 V“: Der Rohwert 2.305 entspricht 230,5 V.
- Zehnerpotenz. „Energie, int32, 10−2 kWh“: Der Rohwert 1.234.567 entspricht 12.345,67 kWh.
- Eigenes Skalierungsregister. Die von vielen Wechselrichtern genutzten SunSpec-Modelle stellen für eine Wertegruppe ein separates Register mit dem Zehnerexponenten bereit. Lesen Sie Faktor und Wert in derselben Anfrage, weil sich der Faktor ändern kann.
Halten Sie die Reihenfolge ein: zuerst den Typ dekodieren, dann skalieren, dann die Einheit anwenden. Dokumentieren Sie, wo skaliert wird. Wenn Gerät, Gateway und empfangende Plattform jeweils einen Faktor anwenden, wird der Wert mehrfach skaliert. Ein um Faktor 10 oder 1.000 zu großer Wert ist ein typisches Anzeichen.
Bei Energiezählwerken dokumentieren Sie auch den Überlaufwert und das Verhalten des Geräts bei Überlauf oder Rücksetzung. Der Leitfaden zu Impulszählern behandelt dasselbe Problem für Impulszähler.
Statuswörter und Bitfelder
Ein Statusregister packt Flags in die 16 Bit eines Registers. Bit 0 ist das niederwertigste Bit. Der Statuswert 0x0025 ist binär 0000 0000 0010 0101; gesetzt sind damit die Bits 0, 2 und 5. Die Registertabelle erklärt die Bedeutung jedes Bits und ob 1 „aktiv“ oder „in Ordnung“ bedeutet.
Zwei Regeln verhindern Fehler mit Bitfeldern:
- Bedeutung aus der Registertabelle übernehmen. Eine Bitposition allein definiert keinen Alarm. Dokumentieren Sie für jedes verwendete Bit die Bedeutung von 0 und 1.
- Kein ganzes Status- oder Steuerwort schreiben, um ein einziges Bit zu ändern. Dabei überschreiben Sie die übrigen Bits mit dem zuletzt von Ihrer Software gelesenen Zustand. Nutzen Sie das dokumentierte Verfahren des Geräts: ein separates Befehlsregister, Funktion 22 (mask write), wenn unterstützt, oder einen vom Anlagenverantwortlichen genehmigten Ablauf aus Lesen, Ändern und Schreiben.
Nicht verfügbare und ungültige Werte
Viele Geräte senden einen festen Code, wenn ein Wert nicht verfügbar ist, etwa 0xFFFF, 0x8000 oder einen float-NaN. SunSpec definiert solche Codes für seine Modelle; andere Registertabellen nennen eigene. Wenn die Registertabelle sie aufführt, erkennen Sie sie vor der Skalierung und speichern den Messwert als fehlend, nicht als Zahl. −32.768 V ist ein Code, keine Messung.
Jeden Punkt prüfen
Eine fehlerfreie Antwort belegt die Verbindung, nicht die Bedeutung des Werts. Für jeden Punkt:
- Dokumentieren Sie die rohen Registerwörter sowie den dekodierten und den skalierten Wert.
- Vergleichen Sie zur selben Zeit mit der Anzeige am Gerät oder einem Referenzinstrument.
- Wiederholen Sie die Prüfung in einem zweiten Betriebszustand: Last ein und aus oder geänderter Sollwert.
- Prüfen Sie einen negativen Wert, wenn der Punkt negativ werden kann, etwa bei Einspeiseleistung.
- Bewahren Sie alles im Abnahmeprotokoll auf.
Der Leitfaden zur Modbus-RS-485-Inbetriebnahme beschreibt die vollständige Folge. Der Leitfaden zur Modbus-Fehlersuche behandelt Ausnahmeantworten und plausibel wirkende, aber falsche Werte.
Registertabellen im Device Directory und in Edge
Das Geräteverzeichnis sammelt Registertabellen gängiger Modbus-Zähler mit Datentyp und Wortreihenfolge für jeden Punkt. Edge liest Modbus-TCP- und Modbus-RTU-Geräte über das Gateway. Für jeden Punkt konfigurieren Sie Funktionscode, bei null beginnende Adresse, einen 16- oder 32-Bit-Datentyp, Byte- und Wortreihenfolge sowie Multiplikator und Offset. Edge behandelt float-NaN als nicht verfügbar. Ein Integer-Code wie 0xFFFF bleibt eine Zahl; wenn die Registertabelle ihn als Sonderwert definiert, behandeln Sie ihn mit einem berechneten Punkt. Bei einem Zähler weit vom Gateway entfernt kann ein ZMB Modbus Interface vor Ort viele Register lesen, 8 oder mehr und je nach Modell bis zu 16 oder mehr, und die Werte über das Zigbee-Mesh senden.
Häufige Fragen
Was ist eine Modbus-Registertabelle?
Die Tabelle in der Modbus-Dokumentation eines Geräts, die jeden Wert auflistet, den das Gerät bereitstellt. Jede Zeile nennt den Wert, den Registertyp, die Adresse, den Datentyp mit der Zahl der Register und die Einheit oder Skalierung. Manche Tabellen nennen auch Wortreihenfolge, Zugriff (Lesen oder Schreiben) und den Code für einen nicht verfügbaren Wert. Jeder Hersteller schreibt seine eigene Tabelle, und sie kann sich zwischen Modellen und Firmware-Versionen ändern.
Welche Modbus-Registertypen gibt es?
Modbus hat vier Datentabellen. Coils sind einzelne Bits zum Lesen und Schreiben, diskrete Eingänge einzelne Bits nur zum Lesen. Eingangsregister sind 16-Bit-Wörter nur zum Lesen, gelesen mit Funktion 04. Holding-Register sind 16-Bit-Wörter, gelesen mit Funktion 03 und, wenn das Gerät es erlaubt, geschrieben mit den Funktionen 06 und 16. Zählerwerte liegen meist in Eingangs- oder Holding-Registern.
Was ist der Unterschied zwischen Holding-Registern und Eingangsregistern?
Beide enthalten 16-Bit-Werte. Eingangsregister sind nur lesbar und werden mit Funktion 04 gelesen. Holding-Register lassen sich mit Funktion 03 lesen und, wenn das Gerät es erlaubt, mit Funktionen 06 und 16 schreiben. Viele Zähler legen Messwerte in Eingangsregister und Einstellungen in Holding-Register; manche verwenden für alles Holding-Register.
Was bedeutet Modbus-Adresse 40001?
Sie bezeichnet das erste Holding-Register in klassischer Referenzschreibweise; die führende 4 kennzeichnet die Holding-Registertabelle. Auf der Leitung wird mit Funktion 03 die Adresse 0 gesendet. Manche Registertabellen nutzen die sechsstellige Form 400001 oder einfache Zahlen ab 0 beziehungsweise 1.
Wie groß ist ein Modbus-Register?
16 Bit, also zwei Bytes, gesendet mit dem höherwertigen Byte zuerst. Ein 32-Bit-Integer oder -Float belegt zwei aufeinanderfolgende Register, ein 64-Bit-Wert vier. Jede der vier Tabellen hat in der Anfrage Adressen von 0 bis 65.535, ein Gerät stellt aber nur die Adressen seiner eigenen Registertabelle bereit.
Was ist die Modbus-Wortreihenfolge?
Ein 32-Bit-Wert belegt zwei 16-Bit-Register. Die Modbus-Spezifikation legt nicht fest, welches Register die höherwertige Hälfte enthält; Hersteller unterscheiden sich. Wenn ein Wert unsinnig erscheint, prüfen Sie die vertauschte Reihenfolge der zwei Wörter (ABCD zu CDAB).
Wie viele Register kann ich in einer Anfrage lesen?
Nach der Modbus-Anwendungsprotokollspezifikation höchstens 125 Register mit Funktion 03 oder 04. Viele Geräte akzeptieren weniger; einige antworten mit einer Ausnahme, wenn ein Block eine Lücke in ihrer Registertabelle überquert.