Alle Lektionen anzeigen
Teil 1
Grundlagen
Teil 2
Modbus RTU
- Lektion 5RS485 erklärt: A, B, Common und Terminierung20 Min.
- Lektion 6Baudrate und Parität: warum 8E1 Standard ist16 Min.
- Lektion 7Das Modbus RTU Frame Byte für Byte, plus CRC18 Min.
- Lektion 8Mehrere Modbus Geräte an einem RS485-Bus16 Min.
- Lektion 9Ihr erstes Modbus Gerät mit mbpoll auslesen22 Min.
- Lektion 10Modbus RTU Fehlersuche: vom Symptom zur Ursache20 Min.
Teil 3
Modbus TCP
Teil 4
Fortgeschritten
- Lektion 16Sicher auf ein Modbus Gerät schreiben18 Min.
- Lektion 17Word Order und Float: gleiche Bytes, anderer Wert22 Min.
- Lektion 18Poll-Intervall und Buslast selbst berechnen18 Min.
- Lektion 19Modbus Sicherheit: das Protokoll hilft nicht16 Min.
- Lektion 20Modbus integrieren: SPS, Home Assistant, Cloud20 Min.
- Lektion 21Modbus Inbetriebnahme: Checkliste und Spickzettel18 Min.
Eine Modbus Registertabelle richtig lesen
Eine Modbus Registertabelle lesen ist eine Fertigkeit. In einer Zeile wie 30001 float 2 Register stecken vier Entscheidungen, die Sie bewusst treffen.
Was diese Lektion behandelt
- Die vier Entscheidungen in einer Zeile wie 30001 float 2 Register
- Vom Rohwert zur Spannung, mit Skalierungsfaktor und Vorzeichen
- Zahlen, die keine Messung sind, sondern ein Sentinel
Vorher lesen: Modbus Adressierung: von 40001 zur Adresse, Exception-Codes lesen und den Funktionscode wählen
Eine Modbus Registertabelle zu lesen heißt, vier Entscheidungen bewusst zu treffen, statt drei davon stillschweigend anzunehmen. In einer einzigen Zeile wie 30001, float, 2 Register, V stecken der Block, die Zählweise, die Breite und die Skalierung. Nach dieser Lektion haben Sie ein Leseverfahren, das Sie auf jedes Datenblatt anwenden, vom Energiezähler im Zählerschrank bis zur Wärmepumpe im Keller.
Vier Entscheidungen in einer Zeile
Nehmen Sie eine echte Zeile. Im Protokolldokument des Eastron SDM630 steht die Phasenspannung L1 gegen N als 30001, FLOAT32, 2 Register, Volt. Genau diese Zeile fragen wir jetzt ab. Die PDU der Anfrage, Byte für Byte:
| Byte | Wert | Bedeutung |
|---|---|---|
| 1 | 04 | Funktionscode FC04, Input-Register lesen |
| 2 bis 3 | 00 00 | Startadresse, PDU-Adresse 0 |
| 4 bis 5 | 00 02 | Anzahl Register: 2 |
Das Gerät antwortet mit derselben Struktur in die andere Richtung:
| Byte | Wert | Bedeutung |
|---|---|---|
| 1 | 04 | derselbe Funktionscode, also keine Exception |
| 2 | 04 | Byte Count: es folgen 4 Bytes |
| 3 bis 4 | 43 66 | erstes Register, höherwertiges Wort |
| 5 bis 6 | 80 00 | zweites Register, niederwertiges Wort |
Zusammengesetzt ergibt das 0x43668000, und das ist als IEEE 754 float32 genau 230,5. Also 230,5 V, eine plausible Netzspannung. Erst jetzt die Regel: eine Zeile im Datenblatt ist kein Adresseintrag, sondern ein Bündel aus vier Entscheidungen, und drei davon trifft man meistens unbewusst.
Zum Vergleich eine Zeile, die sich an genau einem Punkt unterscheidet: NIBE liefert die Außentemperatur BT1 als s16 in einem einzigen Input-Register und teilt durch 10. Roh minus 47 bedeutet also minus 4,7 Grad Celsius. Gleicher Block, gleiche Zählweise, aber ein Register statt zwei und ein fester Teiler statt eines Floats. Was sonst noch in einer Registertabelle stehen kann, steht kompakt im Nachschlagewerk zu Modbus Registern und Registertabellen.
Welcher Block, und damit welcher Funktionscode?
Die Blockziffer ganz vorn in der Datenblattnummer nennt Ihnen den Funktionscode: 3xxxx sind Input-Register und werden mit FC04 gelesen, 4xxxx sind Holding-Register und werden mit FC03 gelesen. Diese Ziffer geht nie über die Leitung. Die Modicon-Referenz sagt es ausdrücklich: der Funktionscode legt den Block bereits fest, deshalb ist die Angabe 4xxxx implizit. Dieselbe PDU-Adresse 0 bedeutet je nach Funktionscode vier verschiedene Dinge.
Steht in der Tabelle keine Blockziffer, sondern nur "Register 12", dann probieren Sie FC03. Antwortet das Gerät mit Exception 01, illegal function, dann kennt es diesen Funktionscode nicht, und Sie nehmen FC04. Mehr Möglichkeiten gibt es bei Registern nicht. Kommt Exception 02, illegal data address, zurück, dann war der Funktionscode richtig und die Adresse nicht, und das ist die nächste Frage. Wie eine Exception-Antwort aufgebaut ist, steht in der Lektion zu Funktionscodes und Exception-Codes.
Welche Zählweise nutzt dieser Hersteller?
Es gibt drei Signale, und nur das dritte kostet Sie Arbeit. Erstens ein ausdrücklicher Satz: Fronius schreibt wörtlich, dass die ausgesendete Registeradresse immer um 1 geringer ist als die Registernummer und dass Sie für Register 40001 die Adresse 40000 (0x9C40) verwenden. Daikin erledigt es in drei Wörtern: "Register Base 0." Zweitens zwei Spalten nebeneinander: SolarEdge veröffentlicht base 0 und base 1 konsequent in derselben Tabelle. Drittens gar nichts. Dann testen Sie.
Die Rechenregel darunter ist nur eine: die PDU-Adresse ist die Datenmodellnummer minus 1. Datenblattnummer 40108 (1-basiert) ist also PDU-Adresse 107, hex 0x006B. Home Assistant, pymodbus und libmodbus erwarten genau diese PDU-Adresse, während viele Datenblätter von Zählern, Antrieben und Wärmepumpen die 1-basierte Nummer drucken.
Der Test dauert zwei Minuten. Lesen Sie einen Wert, dessen Größenordnung Sie kennen. Bekommen Sie beharrlich den Nachbarwert oder Exception 02, liegen Sie um genau eins daneben. Die Umrechnung selbst steht in der Lektion zur Modbus Adressierung.
Wie breit ist dieser Wert?
Ein Register ist 16 Bit. Alles darüber ist eine Absprache darüber, wie Sie Register aneinanderhängen: uint16 und int16 passen in ein Register, uint32, int32 und float32 brauchen zwei, ein String braucht so viele, wie das Datenblatt angibt, mit zwei ASCII-Zeichen pro Register.
Und die Spezifikation legt Big-Endian nur innerhalb eines Registers fest. Die Reihenfolge der beiden Register bei einem 32-Bit-Wert, die Word Order, ist nicht definiert. Der SDM630 sendet das höherwertige Register zuerst, andere Geräte tun das nicht. Zur Frage nach der Breite gehört deshalb immer die Frage nach der Reihenfolge, ausführlich in der Lektion zu Datentypen und Word Order.
Vom Rohwert zur echten Einheit
Der Rohwert ist selten schon die Messgröße. Dafür gibt es zwei Familien. Familie eins ist ein fester Teiler im Datenblatt: NIBE liefert die Außentemperatur als s16 und teilt durch 10, Daikin liefert seine Temperaturen im Format temp16 und teilt durch 100. Beides sind Grad Celsius in einem s16, und wer die Teiler verwechselt, liegt um genau den Faktor 10 daneben.
Familie zwei legt die Skalierung in ein eigenes Register direkt neben den Messwert. SunSpec nennt das sunssf, einen vorzeichenbehafteten Exponenten zur Basis 10 im Bereich minus 10 bis 10.
Bei SMA steht die Wirkleistung als int16 auf Registernummer 40200 (1-basiert), ihr Skalierungsfaktor auf 40201 mit dem Wert 1. Roh 550 mal 10 hoch 1 ergibt 5.500 W. Ein Gegenbeispiel aus derselben Tabelle: die interne Gerätetemperatur auf 40219 hat gar keinen Skalierungsfaktor. Die Regel "jeder Wert hat einen SF" gilt also nicht blind.
Wenn die Zahl keine Messung ist
Manche Werte sind gar keine Messung, sondern eine Meldung im Zahlenformat. Nicht belegte Register liefern kein leeres Feld, sondern einen festen Sentinel: bei SunSpec-Geräten 0x8000 für int16, 0xFFFF für uint16, 0x80000000 für int32 und 0x7FC00000 für float32. Daikin geht einen anderen Weg und antwortet dezimal lesbar: 32767 heißt Register Unsupported, 32766 Register Unavailable, 32765 Wait for value. Ein Daikin-Temperaturregister mit 32767 sind also keine 327,67 Grad, sondern die Aussage, dass dieses Gerät diesen Fühler nicht hat.
Die Reihenfolge ist entscheidend: erst auf Sentinel prüfen, dann skalieren. Umgekehrt verrechnen Sie eine Meldung zu einer Messreihe.
Die fünf Fragen an jede Tabelle
Dieselben fünf Fragen funktionieren bei jeder Registertabelle jedes Herstellers, und in dieser Reihenfolge kosten sie Sie eine Minute pro Wert.
- Welcher Block? Die Blockziffer oder die Überschrift über der Tabelle nennt den Funktionscode: FC03 für Holding-Register, FC04 für Input-Register.
- Welche Zählweise? Suchen Sie den ausdrücklichen Satz oder die zweite Spalte. Finden Sie beides nicht, testen Sie gegen einen bekannten Wert.
- Wie breit? Ein Register ist 16 Bit. Ab zwei Registern gehört eine Aussage zur Word Order dazu.
- Welcher Skalierungsfaktor? Ein fester Teiler aus dem Text, ein eigenes Skalierungsfaktorregister, oder gar nichts.
- Ist es überhaupt eine Messung? Prüfen Sie zuerst auf die Sentinel-Werte dieses Herstellers.
Manchmal lautet die Antwort auf Frage drei, dass es gar keine Zahl ist. Daikin legt mit dem Typ text16 zwei ASCII-Zeichen in ein Register: 21816 ist 0x5538, 0x55 ist der Buchstabe U und 0x38 die Ziffer 8, also Fehlercode U8. Als Zahl gelesen ist dasselbe Register bedeutungslos.
Fehlt die Tabelle ganz, durchsucht der Register Scanner in ModbusCloud Diagnostics einen Adressbereich und zeigt, welche Adressen antworten. Er findet Adressen, keine Bedeutung: diese fünf Fragen bleiben Ihre Arbeit.
Wer mit Photovoltaik anfängt, findet die ersten vier Antworten oft schon im SunSpec-Profil, weil SunSpec genau diese Angaben normiert. Vor dem Kauf eines Zählers lohnt der Vergleich gängiger Modbus Energiezähler: ein Gerät ohne offene Registertabelle kostet Sie später mehr Zeit als der Preisunterschied.
Häufige Fehler
Den Skalierungsfaktor vergessen. 2305 sind keine 2305 V, sondern 230,5 V. Prüfen Sie jeden neuen Wert gegen eine Größe, deren Größenordnung Sie kennen, bevor Sie ihn in ein Dashboard hängen.
Einen 32-Bit-Wert als zwei einzelne Register lesen. Sie bekommen zwei Zahlen, von denen keine etwas bedeutet. Das Datenblatt sagt, über wie viele Register der Wert geht, und das ist keine Nebensache.
Vorzeichen verwechseln. Eine Außentemperatur von minus 5 Grad kommt als 65531 an, wenn Sie sie vorzeichenlos lesen. Das Muster ist gut erkennbar: Werte knapp unter 65536 bei einer Größe, die negativ werden kann.
Einen Sentinel für eine Messung halten. Ein SMA Wechselrichter liefert nachts 0x80000000 statt einer Leistung. Wer das als Zahl in eine Kurve schreibt, bekommt eine Spitze von gut zwei Milliarden Watt und danach einen Alarm ohne Ursache.
Selbst ausprobieren
Wenden Sie das Verfahren auf eine echte Tabelle an und prüfen Sie Ihre Deutung an der Wirklichkeit.
- 1
Registertabelle holen
Nehmen Sie die Tabelle Ihres eigenen Geräts oder die Protokolldokumentation des Eastron SDM630.
- 2
Einen bekannten Wert wählen
Suchen Sie eine Größe, deren Größenordnung Sie kennen: die Netzspannung um 230 oder die Netzfrequenz um 50.
- 3
Die vier Fragen auf Papier beantworten
Block, Zählweise, Breite und Skalierung, bevor Sie irgendetwas auslesen. Genau das ist die Übung.
- 4
Roh auslesen
Lesen Sie die Register als Hex, damit Sie die Rohwerte sehen und nicht die Deutung des Werkzeugs. mbpoll ist kostenlos nutzbar, auch gewerblich. Die Ziffer hinter
-tfolgt der Blockziffer aus dem Datenblatt, also-t 3für 3xxxx und-t 4für 4xxxx:mbpoll -m rtu -a 1 -b 9600 -P none -t 3:hex -r 1 -c 2 -1 /dev/ttyUSB0 - 5
Von Hand zurückrechnen und die Abweichung zuordnen
Rechnen Sie die Rohwerte selbst in die Einheit um und vergleichen Sie mit Ihrer Erwartung. Stimmt die Größenordnung nicht, steckt der Fehler in einer der vier Entscheidungen und nicht in der Messung. Ein Faktor 10 oder 100 zeigt auf die Skalierung, ein Nachbarwert auf die Zählweise, und reiner Unsinn auf die Breite oder die Word Order.
Ohne Hardware. Nutzen Sie den Simulator von pymodbus, ebenfalls kostenlos nutzbar, auch gewerblich. Auf PDU-Adresse 4 liegt über zwei Register ein uint32 mit dem Wert 617001, auf Adresse 16 über fünf Register ein String. Wenden Sie dasselbe Verfahren an: welcher Block, welche Zählweise, wie breit, welche Skalierung.
Erwartetes Ergebnis: ein Blatt mit vier Antworten und ein ausgelesener Wert, der zu Ihrer Erwartung passt, oder eine Abweichung, die Sie genau einer der vier Entscheidungen zuordnen können.
Zusammenfassung
- Eine Zeile im Datenblatt enthält vier Entscheidungen: Block, Zählweise, Breite und Skalierung, und wer eine davon annimmt statt sie zu treffen, liest plausible falsche Zahlen.
- Die Blockziffer steht nie im Telegramm, sie bestimmt nur den Funktionscode: 3xxxx liest man mit FC04, 4xxxx mit FC03.
- Ein Register ist 16 Bit, und bei 32-Bit-Werten ist nur die Byte-Reihenfolge innerhalb eines Registers festgelegt, die Word Order zwischen den Registern nicht.
- Skalierung kommt entweder als fester Teiler aus dem Datenblatt oder als eigenes sunssf-Register neben dem Messwert, und manche Werte haben gar keinen Faktor.
- Prüfen Sie immer zuerst auf Sentinel-Werte wie
0x8000,0xFFFF,0x80000000oder 32767 und skalieren Sie erst danach.
Überprüfen Sie sich selbst
Vier Fragen zu dieser Lektion. Zu jeder Antwort gibt es eine Erläuterung.
Frage 1 von 4
Selbst sehen, wie es funktioniert?
Das ModbusCloud Gateway liest die Geräte aus diesem Kurs aus, ohne dass Sie ein einziges Register programmieren.