Eine Modbus-Registertabelle listet die Werte auf, die ein Gerät bereitstellt, und zeigt, wo sie zu finden sind. Für jeden Wert sollte sie Registertabelle, 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.
Die vier Registertabellen
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 |
| Halteregister | 16 Bit | Lesen und Schreiben | 03 | 06, 16 | 4xxxx |
Energiezähler stellen Messwerte meist in Eingangs- oder Halteregistern und Einstellungen in Halteregistern 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 Karte | 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 in der Karte genannten Tabelle | 0 |
| 0 oder 0x0000 (bei null beginnend) | Protokolladresse | 0 |
Wenn eine Karte 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 Karte 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 Karte, nicht dem angezeigten Wert.
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 Karte 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 Karte erklärt die Bedeutung jedes Bits und ob 1 „aktiv“ oder „in Ordnung“ bedeutet.
Zwei Regeln verhindern Fehler mit Bitfeldern:
- Bedeutung aus der Karte ü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 Karte 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 Karte 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 bis zu 30 Register lesen und die Werte über das Zigbee-Mesh senden.
Häufige Fragen
Was ist der Unterschied zwischen Halteregistern und Eingangsregistern?
Beide enthalten 16-Bit-Werte. Eingangsregister sind nur lesbar und werden mit Funktion 04 gelesen. Halteregister 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 Halteregister; manche verwenden für alles Halteregister.
Was bedeutet Modbus-Adresse 40001?
Sie bezeichnet das erste Halteregister in klassischer Referenzschreibweise; die führende 4 kennzeichnet die Halteregistertabelle. 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.
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.