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.
Modbus integrieren: SPS, Home Assistant, Cloud
Modbus integrieren geht über SPS, Home Assistant oder eine Cloud-Plattform. Vergleichen Sie, was jeder Weg fordert und welche Alarmierung Sie dazu brauchen.
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:
| Byte | Wert | Bedeutung |
|---|---|---|
| 1 | 01 | Serveradresse 1 auf dem RS485-Bus |
| 2 | 04 | FC04, Read Input Registers |
| 3 bis 4 | 00 34 | Startadresse 0x0034, PDU-Adresse 52 (Datenblattnummer 30053) |
| 5 bis 6 | 00 02 | Anzahl Register: 2 |
| 7 bis 8 | 30 05 | CRC-16, niederwertiges Byte zuerst (Wert 0x0530) |
Und die Antwort, neun Byte lang:
| Byte | Wert | Bedeutung |
|---|---|---|
| 1 | 01 | dieselbe Serveradresse |
| 2 | 04 | derselbe Funktionscode, also keine Exception |
| 3 | 04 | Byte count: es folgen 4 Datenbytes |
| 4 bis 7 | 44 9A 50 00 | float32, most significant register first: 1234,5 W |
| 8 bis 9 | F3 5B | CRC-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.
| SPS oder SCADA | Home Assistant | Cloud-Plattform | |
|---|---|---|---|
| Wissen vorab | Programmierumgebung des Herstellers | YAML und Linux | Registertabelle lesen |
| Betreuung danach | Ihr Programmierer, mit Vertrag | Sie selbst, meist ohne Vertrag | der Anbieter, solange der Vertrag läuft |
| Läuft ohne Internet | ja | ja | Abfragen laufen weiter, das Senden wartet |
| Übergabe über | die Projektdateien | nur an jemanden mit demselben Wissen | ein 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.
| Angabe | Eastron SDM630, Gesamtwirkleistung | NIBE S-Serie, Außentemperatur BT1 |
|---|---|---|
| Block und Funktionscode | Input-Register, FC04 | Input-Register, FC04 |
| Zählweise | Datenblattnummer 30053, PDU-Adresse 52 | Input-Register 1 |
| Datentyp | float32 über zwei Register | signed 16 Bit, ein Register |
| Word Order | most significant register first, also ABCD | entfällt bei einem Register |
| Skalierungsfaktor | keiner, der Wert steht in W | durch 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.
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äteklasse | Intervall | Begründung |
|---|---|---|
| SMA-Wechselrichter | 10 s oder langsamer | SMA verlangt zwischen zwei Übertragungen mindestens zehn Sekunden |
| kWh-Zähler | 10 s | 9,8 Prozent Buslast, für Energiemonitoring reichlich |
| Wärmepumpe und GLT | 60 s | 1,6 Prozent Buslast, und die Vorlauftemperatur bewegt sich ohnehin langsamer |
| NIBE S-Serie | Registerbudget prüfen | erlaubt 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.
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
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
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
Gerät minimal einbinden
Nur Host, Port, Verbindungsart, Unit-ID, Registeradresse, Datentyp und Intervall. Keine Benennung, keine Symbole, kein zweiter Sensor.
- 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
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
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 02und bekommt dieselben04 04 44 9A 50 00zurü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
addressab 0, deshalb wird aus der Datenblattnummer 30053 der Eintrag 52, und hinter einem Gateway ist die Verbindungsartrtuovertcpstatttcp. - 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
Selbst sehen, wie es funktioniert?
Das ModbusCloud Gateway liest die Geräte aus diesem Kurs aus, ohne dass Sie ein einziges Register programmieren.