In dieser Lektion

Was diese Lektion behandelt

  • Den USB-nach-RS485-Adapter anschließen und den Port finden
  • Die mbpoll-Befehlszeile, Argument für Argument
  • Nach jedem Schritt eine Kontrolle, und zurück zu Volt oder Ampere

Vorher lesen: Eine Modbus Registertabelle richtig lesen, RS485 erklärt: A, B, Common und Terminierung, Baudrate und Parität: warum 8E1 Standard ist

Ein Modbus Gerät auslesen heißt in der Praxis: vier Angaben aus dem Datenblatt in einen Befehl tippen und prüfen, ob eine Zahl zurückkommt, die stimmen kann. Alles aus den ersten acht Lektionen läuft hier in einer einzigen Handlung zusammen. Nach dieser Lektion lesen Sie ein Register mit mbpoll aus, benennen jedes Argument der Befehlszeile und wissen nach jedem Schritt, welche Fehlerquelle Sie gerade ausgeschlossen haben.

Was Sie vorher brauchen

An Hardware brauchen Sie einen USB-nach-RS485-Adapter, eine Verbindung mit drei Adern (D0, D1 und Common) und ein Gerät unter Spannung. Wichtiger sind die vier Angaben aus dem Datenblatt, denn ohne sie ist jeder weitere Schritt Raten.

AngabeBeispiel Eastron SDM630Woher
Serveradresse1 (Werkseinstellung)Datenblatt oder Display am Gerät
Baudrate9600 (Werkseinstellung)Datenblatt
Parität und Stoppbitkeine Parität, 1 Stoppbit, also 8N1Datenblatt
Register mit ZählweiseNetzfrequenz, 3X-Nummer 30071, PDU-Adresse 0x0046, float32 über zwei Input-RegisterRegistertabelle

Serveradressen laufen von 1 bis 247. Die 0 ist der Broadcast und antwortet nie, 248 bis 255 sind reserviert. Kennen Sie die Adresse nicht, gehört das in eine eigene Aufgabe: dafür gibt es die Anleitung zum Scannen eines Modbus-Netzwerks. Wie diese vier Angaben ins Protokoll passen, steht in der Übersicht zu Modbus RTU.

Adapter anschließen und den Port finden

Der Adapter meldet sich am Rechner als serielle Schnittstelle, und Sie brauchen deren Namen.

BetriebssystemTypischer NameSo finden Sie ihn
Linux/dev/ttyUSB0ls /dev/ttyUSB* vor und nach dem Einstecken
WindowsCOM3Geräte-Manager, Abschnitt Anschlüsse (COM und LPT)
macOS/dev/cu.usbserial-XXXXXXXXls /dev/cu.*

Auf macOS gibt es zu jedem Adapter zwei Einträge, einen mit tty. und einen mit cu. davor. Nehmen Sie immer den cu.-Eintrag. Der tty.-Eintrag wartet auf ein Carrier-Detect-Signal, das ein RS485-Adapter nie liefert, und Ihr Befehl bleibt einfach hängen, ohne Fehlermeldung.

Der erste Befehl, Argument für Argument

So sieht der Befehl aus, der zwei Holding-Register ab der Datenblattnummer 1 liest:

mbpoll -m rtu -a 1 -b 9600 -P none -t 4 -r 1 -c 2 -1 /dev/ttyUSB0
ArgumentBedeutung
-m rtuModus Modbus RTU statt TCP
-a 1Serveradresse 1, im Werkzeug oft "slave id" genannt
-b 9600Baudrate
-P nonekeine Parität
-t 4Datenblock: 4 sind Holding-Register, 3 sind Input-Register
-r 1Startregister in der 1-basierten Zählung des Datenblatts
-c 2Anzahl der Register
-1genau eine Abfrage statt endlosem Polling
/dev/ttyUSB0die serielle Schnittstelle aus dem vorigen Abschnitt

Die Regel dahinter: jedes Argument beschreibt genau eine der vier Angaben aus dem Datenblatt, plus die Schnittstelle. Fehlt eine, füllt das Werkzeug sie mit seiner eigenen Vorgabe auf, und die passt selten.

Ein zweites Beispiel, das sich an genau einer Stelle unterscheidet. Die Messwerte des SDM630 liegen in Input-Registern statt in Holding-Registern, also wird aus -t 4 ein -t 3. Die Netzfrequenz hat die PDU-Adresse 0x0046, dezimal 70, in der 1-basierten Zählung von mbpoll also -r 71:

mbpoll -m rtu -a 1 -b 9600 -P none -t 3 -r 71 -c 2 -1 /dev/ttyUSB0

Eastron verlangt bei diesem Zähler eine gerade Anzahl Register pro Anfrage, -c 2 ist hier also keine Wahl, sondern Bedingung.

Wenn Ihnen ein Fenster lieber ist als eine Kommandozeile, macht der Register Explorer in ModbusCloud Diagnostics dieselbe Abfrage mit Eingabefeldern für Serveradresse, Schnittstelle und Register. In dieser Lektion bleibt mbpoll der Weg, weil Sie an den Argumenten sehen, was tatsächlich gesendet wird.

Was Sie sehen, wenn es klappt

Sie sehen drei Blöcke: zuerst die Verbindungsparameter, wie mbpoll sie verstanden hat, dann eine Zeile pro gelesenem Register mit Index und Wert, und beim Beenden eine Poll-Statistik.

Die Statistik zählt frames transmitted gegen received. Sind beide Zahlen gleich, hat jedes Frage-Antwort-Paar funktioniert, und damit haben Sie in einem einzigen Aufruf bewiesen, dass Verdrahtung, Baudrate, Parität, Serveradresse und Registeradresse alle fünf stimmen. Halten Sie die Anfrage beim Testen klein: FC03 und FC04 erlauben bis zu 125 Register, viele Geräte setzen eine niedrigere Grenze, der SDM630 zum Beispiel 80.

Was Sie sehen, wenn es nicht klappt

Es gibt genau drei Fehlerbilder, und jedes zeigt in eine andere Richtung.

Was Sie sehenWas das bedeutetWo Sie suchen
Timeout, received bleibt 0Es kommt nichts zurückVerdrahtung, Baudrate, Parität, Serveradresse
Exception, zum Beispiel Exception 02Das Frame kam fehlerfrei an und wurde abgelehntRegisteradresse, Zählweise, Funktionscode
Eine Zahl, die nicht sein kannDie Kommunikation ist gut, die Auslegung nichtDatentyp, Word Order, Skalierungsfaktor

Die mittlere Zeile bringt die gute Nachricht. Eine Exception heißt: Ihr Gerät hat geantwortet und damit bewiesen, dass Verdrahtung, Busparameter und Serveradresse stimmen. Eine Antwortzeit von einer bis mehreren Sekunden ist bei 9600 Baud normal, geben Sie dem Werkzeug also einen Moment. Kennen Sie Baudrate und Parität gar nicht, gehen Sie systematisch vor statt wahllos.

Unbekannte serielle Einstellungen finden8N18E18O1115200384001920096002400Datenbits, Parität, StoppbitsBaudrateGültige CRC
Gehen Sie die Kombinationen in fester Reihenfolge durch und ändern Sie jeweils eine Sache, bis eine davon ein Frame mit gültiger CRC zurückgibt.

Die vollständige Zuordnung von Symptom zu Ursache steht in der Lektion zur RTU-Fehlersuche.

Vom Registerwert zur echten Einheit

Eine Zahl auf dem Bildschirm ist noch kein Messwert. Das Datenblatt sagt Ihnen, wie breit der Wert ist und durch welchen Faktor Sie ihn teilen. Eine NIBE-Wärmepumpe liefert die Temperatur als vorzeichenbehaftete 16-Bit-Zahl und teilt durch 10, eine Daikin über DCOM-LT/MB teilt durch 100. Lesen Sie dort 2150, sind das 21,50 Grad Celsius.

Ein SMA-Wechselrichter folgt SunSpec und löst dasselbe anders. Die Netzfrequenz steht dort als ganze Zahl in Register 40202, und die Zehnerpotenz liegt daneben in einem eigenen Skalierungsregister. Dort steht -2, ein Rohwert von 5001 ist also 5001 mal 10 hoch -2, somit 50,01 Hz. Dieselbe Mechanik läuft auch andersherum: die DC-Leistung hat den Skalierungsfaktor 2, ein Rohwert von 57 sind also 5.700 W und nicht 57 W.

Der SDM630 wiederum liefert die Netzfrequenz als IEEE-754-float32 über zwei Input-Register, höherwertiges Register zuerst. Stehen dort 42 48 und 00 00, ergibt das in dieser Reihenfolge genau 50,0 Hz. Tauschen Sie die beiden Register, sieht die Zahl nach keiner Netzfrequenz mehr aus. Warum dieselben vier Bytes vier verschiedene Zahlen ergeben können, arbeitet später im Kurs die Lektion über Word Order und Float aus.

Danach kommt die Plausibilitätsprüfung. Suchen Sie eine Größe, deren Größenordnung Sie sicher kennen: eine Netzspannung liegt zwischen etwa 207 und 253 V, das sind 230 V plus/minus 10 Prozent nach EN 50160, die Netzfrequenz bei rund 50 Hz. Steht im Frequenzfeld 5001, fehlt der Faktor 100. Steht dort 12,7, haben Sie das falsche Register erwischt. Wie Sie die passende Zeile im Datenblatt zerlegen, zeigt die Lektion zum Lesen einer Registertabelle.

Was Sie festhalten, bevor Sie den Schrank schließen

Vier Werte auf ein Etikett an der Klemmenreihe: Baudrate, Parität, Serveradresse und das Register, mit dem Sie getestet haben. Dazu dieselben Angaben in die Anlagendokumentation.

Erst wenn ein Register nachweislich lesbar ist, lohnt sich der nächste Schritt in Richtung Leitsystem, zum Beispiel die Einbindung in Home Assistant.

Häufige Fehler

Die Vorgaben des Werkzeugs nicht kennen. Wer -m rtu vergisst, bekommt einen Verbindungsfehler, der nichts mit dem Bus zu tun hat, und sucht dann stundenlang an der Verkabelung. Prüfen Sie im Zweifel die Kopfzeile der Ausgabe: dort steht, welchen Modus und welche Parameter mbpoll tatsächlich benutzt.

Auf macOS den tty.-Port wählen. Das Kommando hängt ohne Fehlermeldung, weil der Treiber auf ein Carrier-Detect-Signal wartet. Nehmen Sie den cu.-Eintrag desselben Adapters.

Ohne -1 abfragen und den Dauerlauf für einen Hänger halten. mbpoll pollt in der Grundeinstellung weiter, bis Sie abbrechen. Für einen einzelnen Test setzen Sie -1, für eine Dauerbeobachtung lassen Sie es weg und lesen die Statistik beim Abbruch.

Mehrere Dinge gleichzeitig ändern. Wer Adresse, Baudrate und Adernpaar in einem Rutsch verstellt, weiß bei Erfolg nicht, was geholfen hat, und bei Misserfolg nicht, was er schon ausgeschlossen hat. Eine Änderung, ein Versuch, eine Notiz.

Selbst ausprobieren

  1. 1

    mbpoll installieren

    Debian und Ubuntu: sudo apt install mbpoll. macOS: brew install mbpoll. Kontrolle: mbpoll --help zeigt den Hilfetext.

  2. 2

    Adapter einstecken

    Kontrolle: die Schnittstelle taucht auf, unter Linux mit ls /dev/ttyUSB*, unter Windows im Geräte-Manager.

  3. 3

    D0, D1 und Common verdrahten

    Kontrolle: messen Sie im Ruhezustand das Vorzeichen zwischen D0 und D1, wie in der Lektion zur RS485-Leitung beschrieben.

  4. 4

    Die vier Angaben heraussuchen

    Serveradresse, Baudrate, Parität und Register mit Zählweise. Kontrolle: Sie können alle vier aufschreiben.

  5. 5

    Zwei Register lesen

    mbpoll -m rtu -a 1 -b 9600 -P none -t 4 -r 1 -c 2 -1 /dev/ttyUSB0. Kontrolle: Sie bekommen zwei Zahlen zurück.

  6. 6

    Bei Stille genau eine Sache ändern

    Erst die Serveradresse, dann die Parität, dann die Baudrate, dann D0 und D1 tauschen. Kontrolle: nach jedem Versuch notieren, was Sie geändert haben.

  7. 7

    Den Wert in die Einheit zurückrechnen

    Mit dem Faktor aus dem Datenblatt. Kontrolle: die Größenordnung passt zu dem, was Sie erwarten.

  8. 8

    Die Einstellungen festhalten

    Etikett an der Klemmenreihe plus Eintrag in der Dokumentation. Kontrolle: jemand anders kann das Gerät auslesen, ohne Sie anzurufen.

Füllen Sie das zuerst für Ihr eigenes Gerät aus.

Serveradresse .......  ____
Baudrate ............  ____
Parität, Stoppbits ..  ____
Register + FC .......  ____

Rohwert ____  x 10^____  =  ____   Einheit: ____

Ohne Hardware. Installieren Sie den Simulator mit python -m pip install "pymodbus[serial,simulator]==3.15.0" und starten Sie ihn mit pymodbus.simulator --modbus_server server --modbus_device device. Er lauscht auf Port 5020, also ohne Administratorrechte. Dann ersetzen Sie die seriellen Argumente durch -m tcp -p 5020 127.0.0.1 und gehen dieselben Schritte durch, ohne Schritt 2, 3 und 8.

mbpoll -m tcp -p 5020 -a 1 -t 4 -r 3 -c 1 -0 -1 127.0.0.1

Mit -0 zählt mbpoll ab null, -r 3 ist also die PDU-Adresse 3. Der mitgelieferte Datensatz ist so gebaut, dass Sie alle drei Fehlerbilder üben können: PDU-Adresse 3 enthält 17001 und liefert diesen Wert bei jeder Lesung unverändert, der float32 über die PDU-Adressen 6 und 7 startet bei 404,17 und steigt bei jeder Abfrage an, und PDU-Adresse 1 ist als ungültig konfiguriert und gibt eine echte Exception zurück. pymodbus steht unter der BSD-3-Lizenz und ist frei nutzbar, auch geschäftlich. Unter Linux und macOS können Sie mit socat ein virtuelles Schnittstellenpaar anlegen und die RTU-Variante vollständig nachstellen.

Erwartetes Ergebnis: zwei Registerwerte auf dem Bildschirm, zurückgerechnet in eine plausible Einheit, und ein Etikett am Schrank.

Zusammenfassung

  • Ein Modbus Gerät auslesen braucht vier Angaben aus dem Datenblatt: Serveradresse, Baudrate, Parität mit Stoppbit und die Registeradresse samt Zählweise.
  • mbpoll arbeitet ohne -m rtu über Modbus TCP und ohne -b und -P mit 19200 und gerader Parität, während die meisten Geräte ab Werk auf 9600 8N1 stehen.
  • Eine gelungene Abfrage beweist in einem Schritt, dass Verdrahtung, Busparameter, Serveradresse und Registeradresse gleichzeitig stimmen.
  • Stille, Exception und eine unplausible Zahl sind drei verschiedene Fehlerbilder, die in drei verschiedene Richtungen zeigen.
  • Baudrate, Parität, Serveradresse und Testregister gehören auf ein Etikett an der Klemmenreihe, bevor Sie den Schrank schließen.

Überprüfen Sie sich selbst

Vier Fragen zu dieser Lektion. Zu jeder Antwort gibt es eine Erläuterung.

Frage 1 von 4
Sie starten `mbpoll -a 1 -b 9600 -t 4 -r 1 /dev/ttyUSB0` und bekommen sofort einen Verbindungsfehler, ohne dass auf dem Bus irgendetwas passiert. Woran liegt das?
Sie lesen mit `-t 4 -r 1 -c 2` und bekommen zwei plausibel aussehende Zahlen zurück, die aber beide etwa um den Faktor 10 zu niedrig sind. Was ist die wahrscheinlichste Ursache?
Warum lesen Sie jedes Gerät einzeln aus, bevor Sie die ganze Daisy Chain durchschleifen?
In der Poll-Statistik steht `frames transmitted 20`, `received 0`. Was wissen Sie damit?

Kommen Sie bei einem Projekt nicht weiter?

Beschreiben Sie, was Sie sehen und wo es hakt. Wir schauen es uns an und sagen Ihnen, was wir tun würden.

Weiterlesen in der Wissensdatenbank