Du hast einen Sensor per RS485 angeschlossen, die Verbindung steht, und das Tool zeigt brav eine Zahl: 215. Ist das eine Temperatur, ein Statuscode oder nur die Hälfte eines größeren Werts? Wer ein Modbus Register auslesen will, braucht mehr als eine funktionierende Leitung. Erst vier Angaben machen aus der Zahl einen Messwert: der richtige Registertyp mit passendem Function Code, die korrekte Adresse ohne Versatzfehler, der Datentyp samt Byte-Reihenfolge und die Skalierung mit Einheit.
Das Protokoll selbst ist schlicht: vier Datentabellen, eine Startadresse und eine Anzahl pro Abfrage, Antworten aus 16-Bit-Wörtern. Fast alle Probleme entstehen an den Übergängen zwischen Datenblatt, Software und Gerät. Wer diese Übergänge kennt, findet die meisten Fehler in Minuten.

Welche Modbus Register gibt es? Coils, Discrete Inputs, Input und Holding Register
Das Modbus-Datenmodell kennt vier Bereiche. Zwei davon enthalten einzelne Bits, zwei enthalten 16-Bit-Register. Coils sind Bits, die du lesen und schreiben kannst, klassisch für Relaisausgänge oder Ein/Aus-Schalter. Discrete Inputs sind ebenfalls Bits, aber nur lesbar, etwa der Zustand eines Kontakteingangs. Input Register sind 16-Bit-Wörter, die nur gelesen werden können und typischerweise Messwerte enthalten. Holding Register sind 16-Bit-Wörter mit Lese- und Schreibzugriff, gedacht für Parameter, Sollwerte und Konfiguration.
So weit die Theorie. In der Praxis legen viele Hersteller auch reine Messwerte in Holding Register, weil manche Steuerungen und Gateways ursprünglich nur diesen Bereich lesen konnten. Du kannst also aus der Art des Werts nicht ableiten, in welchem Bereich er liegt. Das steht ausschließlich im Datenblatt des Geräts.
Wichtig ist außerdem: Die vier Bereiche sind logisch getrennte Tabellen. Holding Register 0 und Input Register 0 sind zwei verschiedene Speicherstellen, auch wenn beide mit Adresse 0 angesprochen werden. Welcher Bereich gemeint ist, entscheidet allein der Function Code der Anfrage. Die aktuelle Spezifikation spricht übrigens von Client und Server statt von Master und Slave, gemeint ist dasselbe.
Modbus Function Codes: Welcher Code liest welches Register?
Jede Modbus-Anfrage beginnt mit einem Function Code. Er legt fest, welche Tabelle angesprochen wird und ob gelesen oder geschrieben wird. Für das Auslesen von Messwerten brauchst du fast immer nur zwei davon: FC03 für Holding Register und FC04 für Input Register. Die folgende Tabelle zeigt die gängigen Codes mit den Höchstmengen, die die Spezifikation pro Anfrage erlaubt.
| Function Code | Aktion | Bereich | Max. pro Anfrage |
|---|---|---|---|
| 01 (0x01) | Lesen | Coils | 2000 Bits |
| 02 (0x02) | Lesen | Discrete Inputs | 2000 Bits |
| 03 (0x03) | Lesen | Holding Register | 125 Register |
| 04 (0x04) | Lesen | Input Register | 125 Register |
| 05 (0x05) | Einzeln schreiben | Coil | 1 Bit |
| 06 (0x06) | Einzeln schreiben | Holding Register | 1 Register |
| 15 (0x0F) | Mehrfach schreiben | Coils | 1968 Bits |
| 16 (0x10) | Mehrfach schreiben | Holding Register | 123 Register |
Ein häufiger Fehler ist der falsche Code für den richtigen Wert. Liegt die Temperatur laut Datenblatt im Holding Register, du fragst aber mit FC04, antwortet das Gerät mit einer Exception. Du erkennst sie daran, dass im Antwort-Function-Code das oberste Bit gesetzt ist: Aus 0x04 wird 0x84, aus 0x03 wird 0x83. Der mitgelieferte Exception Code verrät die Ursache. Code 01 bedeutet, dass das Gerät die Funktion nicht unterstützt, Code 02 meldet eine ungültige Datenadresse, Code 03 einen unzulässigen Wert, etwa eine zu große Registeranzahl. Antwortet das Gerät gar nicht, liegt das Problem dagegen meist tiefer: falsche Geräteadresse, falsche Baudrate oder vertauschte Adern.
Schreibende Function Codes lässt du bei der ersten Inbetriebnahme weg. Ein versehentlich überschriebenes Register mit Geräteadresse oder Baudrate lässt ein Gerät vom Bus verschwinden.
Modbus Adresse 40001 oder 0: Wie funktioniert der Adressversatz?
Hier entsteht der Klassiker unter den Modbus-Fehlern. Im Protokoll selbst wird jedes Register mit einer Adresse von 0 bis 65535 angesprochen. Die Spezifikation hält ausdrücklich fest, dass das Element mit der Nummer X in der Anfrage mit der Adresse X−1 adressiert wird. Ihr eigenes Beispiel: Wer die Register 108 bis 110 lesen will, schickt die Startadresse 107, hexadezimal 0x006B.
Dazu kommt eine historische Schreibweise aus der SPS-Welt. Dort steht die erste Ziffer für den Bereich: 0xxxx für Coils, 1xxxx für Discrete Inputs, 3xxxx für Input Register und 4xxxx für Holding Register. Die Referenz 40001 bezeichnet also das erste Holding Register, und das hat die Protokolladresse 0. 30001 ist entsprechend Input Register 0, 40108 ist Holding Register 107. Bei Geräten mit mehr als 9999 Registern findest du auch sechsstellige Varianten wie 400001.
Datenblätter mischen diese Welten. Manche nennen die Referenz 40001, manche die nullbasierte Adresse 0, manche eine einsbasierte Nummer 1 ohne Bereichsziffer, und manche geben die Adresse hexadezimal an. Auch Tools unterscheiden sich. Einige erwarten die Protokolladresse, andere zählen ab 1, viele haben einen Schalter zwischen beiden Varianten.
Das typische Symptom eines Versatzfehlers ist tückisch, weil keine Fehlermeldung kommt. Du liest einfach das Nachbarregister. Statt der Temperatur erscheint die Luftfeuchte, oder bei einem 32-Bit-Wert kombinierst du die zweite Hälfte des einen Werts mit der ersten Hälfte des nächsten. Ziehe deshalb nicht pauschal eins ab. Prüfe stattdessen mit einem Register, dessen Inhalt du sicher kennst, zum Beispiel die Geräteadresse oder eine Firmware-Version. Liefert die eingetragene Adresse genau diesen Wert, stimmt die Zählweise.
Modbus Datentypen: Wie liest du 32-Bit- und Float-Werte?
Ein Register enthält 16 Bit, mehr nicht. Was diese Bits bedeuten, legt allein der Hersteller fest. Als UINT16 ergeben sie eine Zahl von 0 bis 65535, als INT16 im Zweierkomplement eine Zahl von −32768 bis 32767. Dasselbe Bitmuster 0xFFFB ist als vorzeichenlose Zahl 65531, als vorzeichenbehaftete Zahl −5. Genau hier entstehen die berühmten 6553,1 °C bei Frost: Der Fühler meldet −0,5 °C als −5 mit Faktor 0,1, die Software interpretiert das Register aber als vorzeichenlos.
Für größere Zahlen reichen 16 Bit nicht. Ein Energiezähler mit 100000 Wh braucht 32 Bit und belegt damit zwei aufeinanderfolgende Register, hier 0x0001 und 0x86A0. Ebenso belegt ein Float32 nach IEEE 754 zwei Register. Die Temperatur 21,5 °C steht als Float32 in den Registern 0x41AC und 0x0000. Werte mit 64 Bit, also INT64 oder Double, belegen vier Register. Texte wie Seriennummern werden oft als ASCII abgelegt, zwei Zeichen pro Register.
Daraus folgen zwei Regeln. Erstens musst du immer so viele Register lesen, wie der Datentyp belegt, und zwar in einer gemeinsamen Anfrage. Liest du die beiden Hälften eines Zählerstands zu unterschiedlichen Zeitpunkten, kann sich der Wert dazwischen ändern, und du setzt zwei Hälften verschiedener Zustände zusammen. Zweitens darfst du die einzelnen Register eines Float32 nicht als eigenständige Werte behandeln. Das erste Register 0x41AC ist als Ganzzahl 16812, und diese Zahl hat mit 21,5 °C nichts zu tun.
Manche Register sind gar keine Zahlen, sondern Bitfelder. Ein Statusregister kann in einzelnen Bits etwa „Fühlerbruch“ oder „Messbereich überschritten“ melden. Als Zahl gelesen geht diese Information verloren, also zerlege es nach der Bitbeschreibung des Herstellers.
Byte-Reihenfolge bei Modbus: Big Endian, Little Endian oder Word Swap?
Innerhalb eines einzelnen Registers ist die Sache eindeutig. Die Spezifikation schreibt Big Endian vor, das höherwertige Byte kommt zuerst. Für Werte über mehrere Register gibt es dagegen keine verbindliche Regel. Jeder Hersteller entscheidet selbst, ob das höherwertige Wort im ersten oder im zweiten Register steht und ob die Bytes innerhalb der Wörter zusätzlich getauscht sind.
Üblich ist es, die vier Bytes eines 32-Bit-Werts mit A, B, C und D zu benennen, wobei A das höchstwertige Byte ist. Die folgende Tabelle zeigt, was aus unserem Beispielwert 21,5 °C wird, wenn deine Software die vier gängigen Reihenfolgen anwendet, die Register aber in der Reihenfolge ABCD geliefert wurden.
| Reihenfolge | Bezeichnung | Gelesene Bytes | Ergebnis als Float32 |
|---|---|---|---|
| ABCD | Big Endian | 41 AC 00 00 | 21,5 |
| CDAB | Word Swap | 00 00 41 AC | etwa 2,4 × 10⁻⁴¹ |
| BADC | Byte Swap | AC 41 00 00 | etwa −2,7 × 10⁻¹² |
| DCBA | Little Endian | 00 00 AC 41 | etwa 6,2 × 10⁻⁴¹ |
Bei Float-Werten ist ein Reihenfolgefehler meist sofort sichtbar, weil winzige oder absurd große Zahlen herauskommen. Bei Ganzzahlen ist er subtiler. Unser Zählerstand 100000 wird mit vertauschten Wörtern zu 2258632705. Das fällt auf, aber bei kleineren Zahlen sieht ein solcher Fehler im Dashboard manchmal nur nach hohem Verbrauch aus.
Gute Datenblätter nennen die Reihenfolge ausdrücklich, oft als „high word first“ oder „low word first“. Fehlt die Angabe, hilft nur der Test mit einem bekannten Wert. Der Milesight UC100 bietet für 32-Bit- und Float-Werte vier Reihenfolgen zur Auswahl, für 16-Bit-Werte zwei. Probiere sie mit einem Wert durch, den du vom Display des Geräts ablesen kannst, und behalte die Rohwörter dabei im Blick.

Modbus Skalierung: Wie wird aus dem Registerwert ein Messwert?
Viele Geräte übertragen Messwerte nicht als Float, sondern als Ganzzahl mit festem Faktor. Der Rohwert 215 mit dem Faktor 0,1 ergibt 21,5 °C. Ein pH-Fühler liefert vielleicht 712 mit dem Faktor 0,01 für pH 7,12. Das Protokoll kennt keine Einheiten und keine Kommastellen. Beides musst du aus dem Datenblatt übernehmen.
Die allgemeine Formel lautet: Messwert = Rohwert × Faktor + Offset. Ein Offset kommt ins Spiel, wenn der Hersteller negative Werte vermeiden will. Ein Fühler kann zum Beispiel die Temperatur plus 40 Grad mal 10 übertragen. Dann ergibt der Rohwert 615 mit Faktor 0,1 und Offset −40 wieder 21,5 °C. Manche Geräte legen den Faktor in einem eigenen Register ab, oft als Zehnerpotenz. Steht dort −2, musst du den Rohwert durch 100 teilen. Ändert sich dieser Faktor mit dem Messbereich, musst du ihn bei jeder Abfrage mitlesen.
Ein zweiter Punkt betrifft Rohwerte, die gar keine Messung sind. Viele Geräte nutzen Sonderwerte wie 0x7FFF, 0x8000 oder 0xFFFF, um „kein gültiger Wert“ oder „Fühler nicht angeschlossen“ zu signalisieren. Skalierst du solche Werte blind, landen 3276,7 °C in deiner Grafik. Prüfe deshalb im Datenblatt, welche Werte reserviert sind, und filtere sie vor der Umrechnung heraus.
Notiere Rohwert, Faktor, Offset und Zieleinheit zusammen. Wenn sich später die Anzeige ändert, der Rohwert aber gleich bleibt, weißt du sofort, dass der Fehler in der Umrechnung liegt und nicht am Gerät.
Modbus Registertabelle lesen: Was steht im Datenblatt?
Die Registertabelle ist das wichtigste Dokument der ganzen Integration. Ohne sie kannst du ein Modbus-Gerät praktisch nicht sinnvoll auslesen. Eine vollständige Tabelle enthält pro Wert die Adresse, den Bereich oder Function Code, die Zugriffsart (R für lesen, W für schreiben, R/W für beides), den Datentyp, die Anzahl der Register, die Einheit, den Faktor oder die Auflösung und den gültigen Wertebereich.
Beim Lesen lohnt sich ein genauer Blick auf die Adressspalte. Steht dort 0x0100, ist das hexadezimal und entspricht der Dezimaladresse 256. Steht 40257, ist es die Referenzschreibweise für dieselbe Stelle. Oft verrät eine Fußnote oder die Einleitung des Kapitels, wie gezählt wird. Lies diese Hinweise, bevor du die erste Adresse eintippst.
Achte auch auf Lücken. Manche Tabellen führen Register als „reserviert“ oder lassen Adressen einfach aus. Fragst du einen Block an, der über eine solche Lücke reicht, kann das Gerät die gesamte Anfrage mit Exception 02 ablehnen, obwohl jeder Wert für sich lesbar wäre. Beginne deshalb mit einem einzelnen Wert und erweitere den Block erst, wenn das funktioniert.
Zuletzt die Version: Registertabellen können sich mit der Firmware ändern. Notiere Modell und Firmware-Stand zu jeder Tabelle. Liefert ein Austauschgerät plötzlich andere Werte, suchst du dort zuerst.
Modbus Register testen: Mit welchem Tool liest du sie aus?
Bevor ein Wert in einem Gateway oder einer Plattform landet, solltest du ihn direkt am Bus prüfen. Für Modbus RTU brauchst du dafür einen USB-RS485-Adapter am Rechner. Für Modbus TCP reicht eine Netzwerkverbindung, der Standardport ist 502. Bewährte Software sind das kommerzielle Windows-Tool Modbus Poll, die kostenlose Oberfläche QModMaster, mbpoll für die Kommandozeile und die Python-Bibliothek pymodbus für eigene Skripte.
Bei RTU müssen zuerst die seriellen Parameter stimmen: Baudrate, Parität, Datenbits und Stoppbits müssen exakt denen des Geräts entsprechen, ebenso die Geräteadresse. Kommt gar keine Antwort, prüfe außerdem die Adern A und B. Sie sind bei verschiedenen Herstellern unterschiedlich beschriftet und werden oft vertauscht. Bei längeren Leitungen gehört an beide Enden des Busses ein Abschlusswiderstand von 120 Ω.
Lies dann ein einzelnes, bekanntes Register und vergleiche es mit dem Display oder einer Referenzmessung. Die meisten Tools zeigen den Rohwert parallel in mehreren Formaten an, also als UINT16, INT16, Hex und bei zwei Registern als Float32 in verschiedenen Reihenfolgen. So erkennst du Versatz, Datentyp und Byte-Reihenfolge in einem Durchgang. Prüfe das Ergebnis an einem zweiten Messpunkt, damit kein zufälliger Treffer durchrutscht.
Erst wenn das am Rechner funktioniert, überträgst du die Einstellungen auf das Gerät, das den Wert dauerhaft erfasst. Der Milesight UC100 arbeitet dabei als Modbus-RTU-Client und fragt bis zu 32 Kanäle ab. Pro Kanal trägst du Geräteadresse, Startadresse, Registeranzahl, Datentyp, Byte-Reihenfolge und Vorzeichen ein. Mit der Fetch-Funktion im Konfigurationstool löst du eine Testabfrage aus und siehst direkt, ob das Ergebnis zu deinem Rechnertest passt.
Modbus RS485 Konverter kaufen: Worauf solltest du achten?
Ob ein Konverter zu deinem Gerät passt, zeigt dir die Registertabelle. Prüfe, welche Bereiche er lesen kann, also Coils, Discrete Inputs, Input und Holding Register, und ob er sowohl FC03 als auch FC04 unterstützt. Vergleiche die Datentypen. Liegen deine Werte als Float32 oder INT32 vor, muss der Konverter zwei Register zusammen lesen und die passende Byte-Reihenfolge einstellen können. Bei negativen Werten braucht er eine Option für vorzeichenbehaftete Zahlen.
Achte auf die seriellen Parameter, denn Baudrate, Parität und Stoppbits müssen zum Gerät passen. Zähle außerdem, wie viele Werte du brauchst, und vergleiche das mit der Zahl der Kanäle. Eine Testfunktion direkt im Konfigurationstool spart bei der Inbetriebnahme viel Zeit. Und plane, wo Skalierung und Offset gerechnet werden, im Konverter oder in der Plattform dahinter.
Wenn du alle Modbus Register auslesen kannst und deine Tabelle vollständig ist, kannst du gezielt vergleichen. Wenn du einen passenden Konverter suchst, findest du unsere Modelle in der Kategorie Modbus.
FAQ zu Modbus Registern
Wie viele Modbus Register kann ich auf einmal lesen?
Die Spezifikation erlaubt mit FC03 und FC04 bis zu 125 Register pro Anfrage, mit FC01 und FC02 bis zu 2000 Bits. Viele Geräte setzen niedrigere Grenzen oder lehnen Blöcke über Lücken ab. Der Milesight UC100 liest laut Dokumentation pro Kanal ein oder zwei Register, verteilt auf bis zu 32 Kanäle.
Warum zeigt ein Modbus Register falsche Werte?
Die häufigsten Ursachen sind ein Adressversatz um eins, ein falscher Datentyp, etwa vorzeichenlos statt vorzeichenbehaftet, eine falsche Byte-Reihenfolge bei 32-Bit-Werten oder eine fehlende Skalierung. Prüfe mit einem bekannten Wert und schau dir die Rohwörter an, bevor du an der Umrechnung drehst.
Was ist ein Modbus Holding Register?
Ein Holding Register ist ein 16-Bit-Register mit Lese- und Schreibzugriff. Gelesen wird es mit FC03, geschrieben mit FC06 oder FC16. Es enthält Parameter und Einstellungen, bei vielen Geräten aber auch Messwerte. In der Referenzschreibweise beginnt der Bereich bei 40001.