Zählerschnittstellen

Modbus-Registertabellen: Adressen, Datentypen und Skalierung

Modbus-Registertabellen lesen: Halte- und Eingangsregister, 40001- und Nullbasis-Adressen, 32/64 Bit, Wortreihenfolge, Skalierung, Statusbits, ungültige Werte.

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:

TabelleGrößeZugriffLesen mitSchreiben mitKlassische Referenz
Coils1 BitLesen und Schreiben0105, 150xxxx
Diskrete Eingänge1 BitNur lesen02Keiner1xxxx
Eingangsregister16 BitNur lesen04Keiner3xxxx
Halteregister16 BitLesen und Schreiben0306, 164xxxx

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 KarteBedeutungAdresse in der Anfrage
40001Klassische fünfstellige Referenz: Tabelle 4, Register 10
400001Erweiterte sechsstellige Referenz0
1 (bei eins beginnend)Register 1 der in der Karte genannten Tabelle0
0 oder 0x0000 (bei null beginnend)Protokolladresse0

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:

TypRegisterWertebereich oder Genauigkeit
uint1610 bis 65.535
int161−32.768 bis 32.767
uint32, int322Etwa ±2,1 Milliarden (mit Vorzeichen) oder 0 bis 4,29 Milliarden
float32 (IEEE 754)2Etwa 7 signifikante Stellen
uint64, int644Exakte ganze Zahlen mit mindestens 18 Stellen
float644Etwa 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:

ReihenfolgeRegister beim LesenÜbliche Beschreibung
ABCDHöherwertiges Wort, dann niederwertiges WortBig-Endian, höherwertiges Wort zuerst
CDABNiederwertiges Wort, dann höherwertiges WortWörter vertauscht
BADCHöherwertiges Wort zuerst, Bytes vertauschtBytes vertauscht
DCBANiederwertiges Wort zuerst, Bytes vertauschtLittle-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:

  1. Dokumentieren Sie die rohen Registerwörter sowie den dekodierten und den skalierten Wert.
  2. Vergleichen Sie zur selben Zeit mit der Anzeige am Gerät oder einem Referenzinstrument.
  3. Wiederholen Sie die Prüfung in einem zweiten Betriebszustand: Last ein und aus oder geänderter Sollwert.
  4. Prüfen Sie einen negativen Wert, wenn der Punkt negativ werden kann, etwa bei Einspeiseleistung.
  5. 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.