In dieser Lektion

Was diese Lektion behandelt

  • Drei Wege für dieselben Daten: SPS, Home Assistant oder Cloud
  • Die fünf Angaben, die jeder Weg verlangt: Block, Zählweise, Typ, Word Order, Skalierung
  • Eine Alarmregel, die erst nach drei fehlgeschlagenen Abfragen meldet

Vorher lesen: Modbus TCP mit einem Simulator üben, rtuovertcp: der Unterschied, und was ein Gateway tut, Word Order und Float: gleiche Bytes, anderer Wert

Modbus integrieren heißt nicht, das Protokoll noch einmal zu lernen, sondern zu entscheiden, wohin die Daten gehen und wer sie danach pflegt. Eine SPS, Home Assistant und eine Cloud-Plattform lesen exakt dasselbe Register aus demselben Gerät, und trotzdem verlangen alle drei etwas anderes von Ihnen. Nach dieser Lektion vergleichen Sie die drei Wege, tragen auf jedem Weg dieselben fünf Angaben ein und stellen eine Alarmregel auf, die bei einem einzelnen Aussetzer stumm bleibt.

Drei Wege für dieselben Daten

Nehmen wir die Gesamtwirkleistung eines Eastron SDM630: Input-Register, FC04, zwei Register, weil es ein 32-Bit-Float ist. Die Datenblattnummer 30053 ist PDU-Adresse 52, hexadezimal 0x0034. Das ist die vollständige RTU-Anfrage an Serveradresse 1, Byte für Byte:

ByteWertBedeutung
101Serveradresse 1 auf dem RS485-Bus
204FC04, Read Input Registers
3 bis 400 34Startadresse 0x0034, PDU-Adresse 52 (Datenblattnummer 30053)
5 bis 600 02Anzahl Register: 2
7 bis 830 05CRC-16, niederwertiges Byte zuerst (Wert 0x0530)

Und die Antwort, neun Byte lang:

ByteWertBedeutung
101dieselbe Serveradresse
204derselbe Funktionscode, also keine Exception
304Byte count: es folgen 4 Datenbytes
4 bis 744 9A 50 00float32, most significant register first: 1234,5 W
8 bis 9F3 5BCRC-16 über die Antwort (Wert 0x5BF3)

Das ist die Regel dieser Lektion: die fünf PDU-Bytes 04 00 34 00 02 sind auf jedem Weg identisch. Es wechselt nur der Umschlag, also Serveradresse plus CRC-16 bei RTU und ein sieben Byte langer MBAP-Header mit Unit-ID bei TCP, und vor allem die Frage, wer die Übersetzung von 44 9A 50 00 nach 1234,5 W pflegt. Hinter einem RTU-nach-TCP-Gateway bleibt der RTU-Rahmen samt CRC sogar unverändert und wandert so durch die TCP-Verbindung.

Was jeder Weg von Ihnen verlangt

Technisch leisten alle drei dasselbe. Der Unterschied liegt in der Betreuung: wer die Registertabelle pflegt und wer nachts um drei die Meldung bekommt.

WegeModbus-GerätZähler, Wechselrichter,WärmepumpeZielRegelung, Dashboard, Alarm1SPS oder SCADAeingebaut2Protokoll-Bridge zur GLTBACnet, KNX3Home AssistantYAML4Modbus nach MQTTMQTT5Cloud-Plattformausgehendes TLS
1
SPS oder SCADA. Die Steuerung spricht selbst Modbus und regelt damit etwas. Kurzer Regelkreis, dafür brauchen Sie die Programmierumgebung und die Lizenz dieses Herstellers.
2
Protokoll-Bridge zur GLT. Register werden zu Objekten oder Datenpunkten in der vorhandenen Gebäudeleittechnik. Zwei Übersetzungstabellen statt einer, die gepflegt werden wollen.
3
Home Assistant. Kostenlos und schnell aufgesetzt, passend für Wohnhäuser und kleine Objekte. Danach betreuen Sie Server, Sicherung und Updates selbst.
4
Modbus nach MQTT. Das Gateway fragt lokal ab und veröffentlicht an einen Broker. Passend, wenn das Ziel eine IoT-Plattform ist, aber die Datenmodellierung bauen Sie selbst.
5
Cloud-Plattform. Das Gateway fragt lokal ab und meldet sich selbst nach außen. Keine eingehende Portfreigabe und kein eigener Server, dafür ein Abonnement und ein Anbieter.
Dieselben Register, fünf mögliche Ziele. Die Entscheidung liegt in der Betreuung, nicht in der Technik.
MerkmalSPS oder SCADAHome AssistantCloud-Plattform
Wissen vorabProgrammierumgebung des HerstellersYAML und LinuxRegistertabelle lesen
Betreuung danachIhr Programmierer, mit VertragSie selbst, meist ohne Vertragder Anbieter, solange der Vertrag läuft
Läuft ohne InternetjajaAbfragen laufen weiter, das Senden wartet
Übergabe überdie Projektdateiennur an jemanden mit demselben Wissenein Konto

Für ein Wohnhaus oder ein kleines Objekt ist die Home Assistant Modbus-Einbindung ein kurzer Weg zum ersten Messwert. Steht schon eine Gebäudeleittechnik, gehört die Frage zu Modbus in der Gebäudeautomation. Sollen Sie vom Büro aus auf zwanzig Standorte zugreifen, wird daraus Monitoring über die Cloud, mit dem ModbusCloud Gateway oder einem anderen Gateway, das die Verbindung selbst nach außen aufbaut.

Vom Register zum brauchbaren Messwert

Auf jedem Weg tragen Sie dieselben fünf Angaben ein. Lassen Sie eine davon weg, bekommen Sie keine Fehlermeldung, sondern eine falsche Zahl. Zwei Geräte nebeneinander zeigen, warum keine davon optional ist.

AngabeEastron SDM630, GesamtwirkleistungNIBE S-Serie, Außentemperatur BT1
Block und FunktionscodeInput-Register, FC04Input-Register, FC04
ZählweiseDatenblattnummer 30053, PDU-Adresse 52Input-Register 1
Datentypfloat32 über zwei Registersigned 16 Bit, ein Register
Word Ordermost significant register first, also ABCDentfällt bei einem Register
Skalierungsfaktorkeiner, der Wert steht in Wdurch 10 teilen, roh -47 sind -4,7 Grad

Die Regel dazu ist kurz: diese fünf Angaben sind Eigenschaften des Geräts, nicht des Ziels. Beim Wechsel von der SPS auf ein Dashboard ändert sich nur der Ort, an dem Sie sie eintragen. Pro Hersteller fallen sie verschieden aus: NIBE teilt Temperaturen durch 10, Daikin durch 100, und wer den Teiler vertauscht liegt exakt um den Faktor 10 daneben. Als int16 gelesen ergibt 0x449A den Wert 17562, und der sieht wie eine plausible Leistung aus. Die vier Varianten der Word Order stehen in der Lektion zu Datentypen und Word Order.

Eine minimale Konfiguration

Mehr als diese zehn Zeilen braucht Home Assistant nicht, um den Zähler aus dem Beispiel oben zu lesen.

modbus:
  - type: rtuovertcp
    host: 192.168.1.50
    port: 502
    sensors:
      - name: Wirkleistung gesamt
        device_address: 1
        address: 52
        input_type: input
        data_type: float32

Vier Felder tragen die ganze Lektion. type ist die Verbindungsart: rtuovertcp, weil ein RS485-nach-Ethernet-Gateway dazwischen sitzt, tcp bei einem Gerät mit eigener Ethernetschnittstelle. device_address ist die Serveradresse auf dem Bus, die hinter einem Gateway auch in der Unit-ID des MBAP-Headers landet. address zählt ab 0 und geht unverändert als PDU-Startadresse in den Rahmen, deshalb steht dort 52 und nicht 30053. input_type: input wählt den Block, und data_type: float32 setzt die beiden Register zusammen. Ist die Word Order vertauscht, kommt swap: word dazu.

tcpnatives Modbus TCPHAhubPV-WechselrichterEthernetPort 502
Für Geräte mit eigener Ethernetschnittstelle, die selbst Modbus TCP sprechen, etwa die meisten modernen Wechselrichter.
rtuovertcpRTU-Rahmen im TCP-StromHAhubGeräteserverEthernetPort 502 (RTU-Framing)
Für serielle Gateways, die den RTU-Rahmen unverändert weiterreichen. Erkennbar an der CRC am Ende der Antwort.
serialdirekt auf RS485HAhubUSB-RS485A/B/GND/dev/ttyUSB0
Für einen USB-nach-RS485-Adapter an dem Rechner, auf dem Home Assistant läuft. Port, Baudrate und Parität geben Sie selbst an.
Die falsche Verbindungsart liefert Timeouts statt einer Fehlermeldung. tcp und rtuovertcp sehen gleich aus, der Rahmen auf der Leitung ist verschieden.

Die vollständige Konfiguration mit Sensoren, Schaltern und Hub-Optionen steht in der Anleitung zur Home Assistant Modbus-Einbindung.

Wie oft lesen Sie was aus?

Das Intervall gehört zur Dynamik der Messgröße, nicht zum Projekt. Messen Sie Ihre Zykluszeit, also wie lange eine Runde über alle Geräte dauert, und teilen Sie sie durch das Poll-Intervall: das ist Ihre Buslast. Die Faustregel dieses Kurses lautet, unter 50 Prozent zu bleiben, das Intervall also mindestens doppelt so lang zu wählen wie die Zykluszeit. Auf dem durchgerechneten Bus mit zehn Zählern bei 9600 Baud dauert ein Zyklus 0,98 Sekunden. Ein Intervall von 1 Sekunde sind dann 97,9 Prozent, 5 Sekunden sind 19,6 Prozent, 10 Sekunden sind 9,8 Prozent und 60 Sekunden sind 1,6 Prozent.

GeräteklasseIntervallBegründung
SMA-Wechselrichter10 s oder langsamerSMA verlangt zwischen zwei Übertragungen mindestens zehn Sekunden
kWh-Zähler10 s9,8 Prozent Buslast, für Energiemonitoring reichlich
Wärmepumpe und GLT60 s1,6 Prozent Buslast, und die Vorlauftemperatur bewegt sich ohnehin langsamer
NIBE S-SerieRegisterbudget prüfenerlaubt sind 100 Register pro Sekunde, 60 Register im Sekundentakt sind schon 60 Prozent

Zwei Randbedingungen kommen dazu. SolarEdge schließt eine untätige TCP-Verbindung nach 2 Minuten, das Intervall muss also darunter bleiben, wenn die Sitzung offen bleiben soll. Und hinter einem Gateway gilt die serielle Rechnung unverändert weiter: die Ethernetseite ist schnell, der Bus dahinter läuft weiterhin auf 9600 Baud. Die vollständige Rechnung steht in der Lektion über Poll-Intervall und Buslast.

Alarmieren ohne Fehlalarme

Ein verstümmelter Rahmen liefert keine Exception, sondern Stille und damit einen Timeout. Auf einem langen Bus passiert das hin und wieder, ohne dass etwas nicht in Ordnung wäre. Melden Sie ein Gerät deshalb erst nach drei fehlgeschlagenen Abfragen in Folge als offline.

Abfrage 1OKAbfrage 2FehlerAbfrage 3FehlerAbfrage 4FehlerOffline-AlarmDrei Fehlversuche in Folge
Alarmieren Sie nie bei einer einzelnen fehlgeschlagenen Abfrage. Auf einem stark belegten Bus ist ein einzelner Timeout normal.

Drei Regeln halten die Nacht ruhig. Erstens: trennen Sie "Gerät antwortet nicht" von "Wert außerhalb der Grenze", denn das Erste erklärt das Zweite meistens schon. Zweitens: arbeiten Sie bei Grenzwerten mit einem Hysteresepaar, also Alarm oberhalb von 70 Grad und Entwarnung unterhalb von 65. Rechnen Sie mit 5 bis 10 Prozent des Grenzwerts; ohne diesen Abstand pendelt ein Wert an der Schwelle dutzende Male pro Stunde hin und her. Drittens: lassen Sie den Client ein totes Gerät nach drei erfolglosen Runden vorübergehend überspringen, sonst wartet er in jeder Runde den vollen Timeout ab.

Der letzte Punkt ist messbar. Ein einziges totes Gerät verlängert einen Zyklus von 0,98 Sekunden auf 1,88 Sekunden bei einem Timeout von 1 Sekunde, und auf 3,88 Sekunden, sobald der Client drei volle Timeouts abwartet. Beispiele für solche Regeln stehen im Artikel über automatische Modbus-Benachrichtigungen.

Was Sie für den nächsten Monteur festhalten

Die Anlage läuft jetzt, und in zwei Jahren steht jemand anderes davor. Halten Sie pro Gerät fest: Marke und Typ, Serveradresse oder Unit-ID, Verbindungsart, und pro Messwert den Block, die Adresse in beiden Zählweisen, den Datentyp, die Word Order und den Skalierungsfaktor. Schreiben Sie das Poll-Intervall mit Begründung dazu und jeden Alarmgrenzwert mit seinem Entwarnungswert. Die Begründung ist der Teil, den alle weglassen und den später niemand rekonstruieren kann: 10 Sekunden sehen willkürlich aus, bis daneben steht, dass der Hersteller nicht schneller abgefragt werden will.

Genau das spart Ihnen eine vorbereitete Registertabelle aus einer Vorlagenbibliothek, und genau das fehlt, wenn jemand ohne Notizen von Hand konfiguriert hat. Prüfen Sie eine solche Tabelle trotzdem einmal gegen das Datenblatt Ihrer Firmware-Version. Diese Liste ist die Grundlage der Übergabecheckliste in der nächsten Lektion.

Häufige Fehler

Sofort in der YAML oder im Dashboard anfangen. Sie tragen eine Konfiguration ein, der Sensor bleibt leer, und Sie suchen einen Protokollfehler in einer Textdatei. Weisen Sie erst mit einem Kommandozeilenwerkzeug nach, dass das Register lesbar ist. Erst wenn das klappt, wissen Sie, dass ein leerer Sensor an der Konfiguration liegt.

tcp eintragen, wo rtuovertcp nötig ist. Hinter einem RS485-nach-Ethernet-Gateway ist das eine häufige Ursache für einen Sensor, der leer bleibt. Die TCP-Verbindung kommt zustande, Port 502 ist offen, und trotzdem kommt nie eine Antwort zurück. Den Unterschied in den Bytes zeigt die Lektion RTU oder TCP wählen.

Veraltete Feldnamen aus einem alten Forenbeitrag übernehmen. In Home Assistant heißt das Feld device_address und nicht slave, die Datentypen heißen int16 und float32 und nicht int und float. Ein veralteter Name wird beim Neustart ignoriert oder abgelehnt, und die Meldung dazu steht in dem Log, das Sie nicht offen hatten.

Bei einer einzelnen fehlgeschlagenen Abfrage alarmieren. Sie bekommen Meldungen zu Zeitpunkten, an denen nichts los ist, und nach einer Woche schaltet jemand die ganze Alarmierung ab. Zählen Sie drei Fehlversuche in Folge, bevor Sie melden, und trennen Sie "antwortet nicht" von "Wert außerhalb der Grenze".

Selbst ausprobieren

Sie binden ein Gerät an ein System an und prüfen den Wert mit einer zweiten Methode. mbpoll und der pymodbus-Simulator sind kostenlos nutzbar, auch gewerblich.

  1. 1

    Zuerst nachweisen, dass das Register lesbar ist

    Lesen Sie den Wert mit einem Kommandozeilenwerkzeug, unabhängig von Ihrem System. Für ein float32 ab PDU-Adresse 52 bei Serveradresse 1:

    mbpoll -m rtu -a 1 -b 9600 -P none -t 3:float -r 52 -c 1 -0 -1 /dev/ttyUSB0
    
  2. 2

    Die fünf Angaben notieren

    Block, Zählweise, Datentyp, Word Order und Skalierungsfaktor. Notieren Sie auch die Sentinelwerte, wenn der Hersteller sie veröffentlicht. Ohne diese Notiz raten Sie später an der Konfiguration.

  3. 3

    Gerät minimal einbinden

    Nur Host, Port, Verbindungsart, Unit-ID, Registeradresse, Datentyp und Intervall. Keine Benennung, keine Symbole, kein zweiter Sensor.

  4. 4

    Neu starten und den Wert suchen

    Öffnen Sie die Statusanzeige Ihres Systems und suchen Sie die neue Größe. Bleibt sie leer, liegt es an Schritt 3 und nicht an der Verbindung, denn Schritt 1 war erfolgreich.

  5. 5

    Gegen die erste Messung prüfen

    Steht dort eine andere Zahl als in Schritt 1, gehen Sie die fünf Angaben durch. Ein Faktor 10 oder 100 deutet auf den Skalierungsfaktor, eine absurd große Zahl auf die Word Order.

  6. 6

    Alarmregel mit Zähler bauen

    Lassen Sie die Meldung erst nach drei aufeinanderfolgenden Fehlversuchen auslösen, und geben Sie jedem Grenzwert einen Entwarnungswert, der deutlich darunter liegt.

Ohne Hardware. Starten Sie den Simulator von pymodbus und verbinden Sie Ihr System mit 127.0.0.1:5020 und der Verbindungsart tcp. Alle Schritte außer dem ersten laufen identisch ab.

Erwartetes Ergebnis: ein Wert, der in zwei unabhängigen Werkzeugen gleich ist, und eine Alarmregel, die einen einzelnen Aussetzer aushält.

Was Sie zu diesem Weg für den nächsten Monteur dokumentieren, ist Thema der letzten Lektion, der Checkliste für Inbetriebnahme und Übergabe.

Zusammenfassung

  • Die PDU ändert sich nicht je Ziel: jeder Weg sendet dieselben 04 00 34 00 02 und bekommt dieselben 04 04 44 9A 50 00 zurück, nur der Umschlag unterscheidet sich.
  • Die drei Wege unterscheiden sich in der Betreuung und nicht in der Technik, entscheiden Sie also danach, wer die Registertabelle pflegt und wer nachts die Meldung bekommt.
  • Block, Zählweise, Datentyp, Word Order und Skalierungsfaktor sind Eigenschaften des Geräts, jeder Weg braucht also alle fünf.
  • In Home Assistant zählt address ab 0, deshalb wird aus der Datenblattnummer 30053 der Eintrag 52, und hinter einem Gateway ist die Verbindungsart rtuovertcp statt tcp.
  • Wählen Sie das Poll-Intervall nach der Dynamik der Messgröße und halten Sie die Buslast unter 50 Prozent: bei einem Zyklus von 0,98 Sekunden sind 10 Sekunden 9,8 Prozent.
  • Melden Sie ein Gerät erst nach drei fehlgeschlagenen Abfragen in Folge offline und geben Sie jedem Grenzwert einen Entwarnungswert, sonst alarmieren Sie auf Rauschen.

Überprüfen Sie sich selbst

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

Frage 1 von 4
Ihr neu angelegter Sensor bleibt leer, obwohl mbpoll dasselbe Register auf demselben Bus sauber ausliest. Wo suchen Sie zuerst?
Warum ist ein scan_interval von 1 Sekunde für eine Wärmepumpe meistens eine schlechte Wahl?
Sie melden ein Gerät offline, sobald eine einzelne Abfrage fehlschlägt. Was passiert in einer Anlage mit einem langen RS485-Bus?
Welche der fünf Angaben (Block, Zählweise, Datentyp, Word Order, Skalierungsfaktor) können Sie weglassen, wenn Sie ein Gerät an eine Cloud-Plattform statt an eine SPS anbinden?

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