Modbus Connector – Funktionsbeschreibung
Der Modbus Connector (HP.ModbusConnector) ist eine App von Herborner Pumpen für die FLECS-Plattform. Sie verbindet Ihre Steuerung – eine SPS oder ein Leitsystem – über Modbus TCP mit den übrigen Herborner-Apps auf dem Gerät: Die Steuerung schreibt Messwerte der Pumpen in Register, der Modbus Connector gibt sie an die anderen Apps weiter und stellt deren Ergebnisse wieder als Register bereit.
Die Apps im Zusammenspiel
| App | Aufgabe |
|---|---|
| HP.ModbusConnector | Modbus-TCP-Schnittstelle zur Steuerung (diese App) |
| HP.AiCore | Wertet die Pumpendaten aus: Differenzdruck, Wirkungsgrad, Pumpen-Statuswort, Vorfilterzustand und berechneter Volumenstrom |
| HP.CloudLink | Verbindung zur Herborner-Cloud: überträgt Mess- und Kennwerte, Ereignisse und Protokolle und liefert Pumpen- und App-Konfigurationen an das Gerät |
| FLECS Service Mesh | Gemeinsamer Datenbus, über den die Apps auf dem Gerät ihre Daten austauschen |
Alle Apps laufen auf demselben FLECS-Gerät und tauschen ihre Daten ausschließlich über den Datenbus aus. Der Modbus Connector ist die einzige App mit einer Modbus-Schnittstelle.
Steuerung (SPS) HP.ModbusConnector Datenbus
┌─────────────┐ schreibt ┌──────────────────┐ Messwerte ┌──────────────────┐
│ │ ───────► │ Holding-Register │ ────────► │ HP.AiCore │
│ │ liest │ │ Kennwerte │ │
│ │ ◄─────── │ Input-Register │ ◄──────── │ │
└─────────────┘ └──────────────────┘ ├──────────────────┤
│ HP.CloudLink │ ◄──► Herborner-Cloud
└──────────────────┘
Datenfluss
- Die Steuerung schreibt die Messwerte einer Pumpe – Volumenstrom, Drücke, Drehzahl, Leistung, Motorwerte, Umrichter-Status – in die Holding-Register.
- Der Modbus Connector prüft jeden Wert auf Datentyp, Registeranzahl und die zulässigen Grenzen (Min/Max) und gibt gültige Werte auf den Datenbus. Ungültige Werte werden verworfen und im Protokoll vermerkt.
- HP.AiCore berechnet aus den Messwerten die Kennwerte der Pumpe und gibt sie auf den Datenbus.
- Der Modbus Connector übernimmt die Kennwerte in die Input-Register, aus denen die Steuerung sie liest.
- HP.CloudLink überträgt Mess- und Kennwerte in die Herborner-Cloud.
Nach einem Neustart fordert der Modbus Connector die Konfigurationen und die aktuellen Kennwerte bei den anderen Apps neu an, damit die Input-Register wieder gefüllt sind.
Pumpen und Entities
Pumpen haben einen festen Satz an Datenpunkten. Die vollständige Belegung mit Adressen, Datentypen und Grenzwerten steht in der Standard-Konfiguration.
| Register | Richtung | Datenpunkte |
|---|---|---|
| Holding | Steuerung → Gerät | Messwerte: Volumenstrom, Drücke (Druckseite, Saugseite, Vorfilter), Drehzahl, Wellenleistung, Motorstrom und -spannung, Betriebsstunden, Energieverbrauch, Umrichter-Statuswort und -Fehlercode, Füllstand Windkessel, Vorfilter gereinigt, Verschmutzungsgrad Vorfilter |
| Input | Gerät → Steuerung | Kennwerte von HP.AiCore: berechneter Volumenstrom¹, Differenzdruck, Wirkungsgrad, Pumpen-Statuswort, Vorfilterzustand¹ – sowie Name und Seriennummer der Pumpe |
¹ Nur, wenn das zugehörige Analysemodul für die Pumpe freigeschaltet ist; sonst bleibt das Register auf 0.
Entities sind frei definierte Objekte ohne Pumpe, etwa Messstellen oder Behälter,
mit eigenen Datenpunkten. Nur lesbare Datenpunkte erscheinen als Input-Register,
beschreibbare als Holding-Register. Jede Entity belegt ab Register 20000 + Nr. × 1000
je Datenpunkt einen Block von 10 Registern.
Pumpen und Entities legt Herborner Pumpen in der Cloud an; HP.CloudLink überträgt ihre Konfiguration auf das Gerät, der Modbus Connector speichert sie lokal. Neu angelegte Pumpen oder Entities erhalten ihre Register erst nach einem Neustart des Modbus Connectors.
Verhalten der Modbus-Schnittstelle
- Erreichbarkeit: Port
502des Geräts (in der App intern Port5020). - Adressen sind 1-basierte Registernummern: Register
100entspricht der Protokolladresse99. Jede Pumpe belegt 100 Register abPumpen-Nr. × 100; die Input-Register davor (1–99) enthalten die Geräteinformationen. - Unterstützte Function Codes: Lesen
01,02,03,04; Schreiben05,06,15,16; Lesen und Schreiben23; Geräteidentifikation43(Read Device Identification, MEI-Typ14). Andere Function Codes beantwortet die App mit der Exception Illegal Function (01). - Geräteinformationen: Function Code
43und die Input-Register1–99beschreiben das Gerät und den Zustand der App, siehe Geräteinformationen. - Holding-Register sind Eingänge. Der Modbus Connector füllt sie nicht selbst – dort steht, was die Steuerung zuletzt geschrieben hat, nach einem Neustart zunächst 0.
- Input-Register werden bei jeder Leseanfrage im Hintergrund aktualisiert; die Antwort enthält den Stand der vorherigen Aktualisierung. Lesen Sie die Register daher zyklisch. Ohne Anfragen gleicht die App spätestens nach 100 Zyklen ab.
- Last: Die App bearbeitet Anfragen in Zyklen (Standard: 0,1 s). Kommen in einem
Zyklus mehr Anfragen als eingestellt (Standard: 20), antwortet sie mit der Exception
Server Device Busy (
06) – die Steuerung sollte die Anfrage dann wiederholen. - Zahlen und Texte: Zahlen belegen 2 Register (32 Bit), Texte so viele Register, wie
die Konfiguration vorgibt. Byte-Reihenfolge (Standard
little) und Textkodierung (Standardutf-8) sind einstellbar.
Geräteinformationen
Eine Steuerung, die den Modbus Connector zum ersten Mal anspricht, muss drei Dinge wissen: ob unter der Adresse wirklich ein Modbus Connector antwortet, wie sie die Register lesen muss und ob die App arbeitet. Dafür gibt es zwei Wege:
| Weg | Inhalt | Geeignet für |
|---|---|---|
Function Code 43 (Read Device Identification) |
Hersteller, Produktcode, Version, Produktname und Gerätekennung als Text | Leitsysteme und Tools zur Geräteverwaltung, die FC 43 unterstützen |
Input-Register 1–99 (Info-Block) |
Dieselben Angaben in Kurzform, dazu Kodierung, Registerbelegung und Zustand der App | Jede Steuerung – gelesen wird mit dem gewöhnlichen Function Code 04 |
Pflicht sind bei Function Code 43 laut Modbus-Spezifikation nur Hersteller, Produktcode
und Version. Die vollständige Belegung beider Wege mit Beispielwerten steht in der
Standard-Konfiguration. Die Werte im Einzelnen:
Erkennung
Signatur (Register 1–2): immer 0x4850 0x4D42. Jedes Register enthält zwei
ASCII-Zeichen – 0x48 „H“, 0x50 „P“, 0x4D „M“, 0x42 „B“ –, auf der Leitung stehen also
die Bytes von „HPMB“. Ein Modbus-Tool zeigt sie dezimal als 18512 19778, in der
Textansicht als HPMB.
Mit einem einzigen Lesezugriff prüft die Steuerung damit, ob sie mit einem Modbus Connector spricht und nicht – etwa nach einem Tippfehler in der IP-Adresse – fremde Register als Pumpendaten liest. Die Signatur besteht bewusst aus zwei einzelnen 16-Bit-Zahlen: so ist sie unabhängig von Byte-Reihenfolge und Textkodierung immer gleich. Das Verfahren ist aus der Energietechnik bekannt; SunSpec-Geräte kennzeichnen sich auf dieselbe Weise mit „SunS“. Die Signatur ändert sich nie.
Layout-Version (Register 3): Version der Belegung von Register 1–99, aktuell 1.
Kommt ein Feld hinzu oder verschiebt sich eines, steigt die Version. Eine Steuerung, die für
Version 1 programmiert ist, erkennt eine höhere Version und wertet die übrigen Register
dann nicht blind aus.
Kodierung
Zahlen mit 32 Bit belegen zwei Register, und welches davon zuerst kommt, ist bei Modbus nicht
festgelegt. Ein vertauschtes Paar ist der häufigste Fehler bei der Inbetriebnahme: Der
Volumenstrom steht dann als winzige oder riesige Zahl statt als 12,5 in der Steuerung.
Byteorder-Prüfzahl (Register 4–5): immer der Wert 0x12345678, abgelegt in der
eingestellten Byte-Reihenfolge. Die Reihenfolge der beiden Register zeigt, wie alle 32-Bit-
Werte des Geräts zu lesen sind:
| Register 4 | Register 5 | Byte-Reihenfolge | In der Steuerung |
|---|---|---|---|
0x1234 |
0x5678 |
big |
höherwertiges Wort zuerst |
0x5678 |
0x1234 |
little (Standard) |
niederwertiges Wort zuerst (Word Swap) |
Bei Texten bestimmt die Byte-Reihenfolge, welches der beiden Zeichen eines Registers zuerst kommt.
Byte-Reihenfolge (Register 6): dieselbe Aussage als Zahl – 0 big, 1 little – für
Steuerungen, die sie automatisch auswerten.
Textkodierung (Register 7): 0 utf-8, 1 latin-1, 2 ascii, 3 cp1252, 4 utf-16.
Texte wie Pumpenname und Seriennummer liegen als Bytes in den Registern. Bei Umlauten
hängt es von der Kodierung ab, welche Zeichen die Bytes ergeben; ohne dieses Register
müsste die Steuerung sie raten.
Version und Gerät
App-Version (Register 8–10) als Major, Minor und Patch sowie die Build-Zeit
(Register 11–12) in Unix-Sekunden. Damit lässt sich in der Steuerung oder im Leitsystem
festhalten, welche Version auf welchem Gerät läuft.
Texte (Register 13–80): Herstellername, Produktname, Produktcode, FLECS-Version,
Hostname, Gerätekennung und Architektur. Ein Text endet am ersten Byte 0x00. Ist er
länger als sein Feld, steht nur der Anfang im Register; vollständig liefert ihn Function
Code 43. Die Gerätekennung ist aus der Lizenz des FLECS-Geräts abgeleitet und
unterscheidet Geräte eindeutig, etwa in einer Anlage mit mehreren Modbus Connectors.
FLECS-Version, Gerätekennung und Architektur liest die App beim Start vom FLECS-Gerät. Klappt das nicht, versucht sie es noch zweimal im Abstand von einer Minute; danach bleiben die Felder bis zum nächsten Start leer. Für den Betrieb ist das ohne Bedeutung.
Registerbelegung
Die Register 81–84 beschreiben, wo Pumpen und Entities liegen. Eine Steuerung kann die
Adressen damit ausrechnen, statt sie fest einzuprogrammieren:
| Register | Wert | Bedeutung |
|---|---|---|
81 |
100 |
Register je Pumpe – Pumpe i beginnt bei Register i × 100 |
82 |
20000 |
Erstes Register des Entity-Bereichs |
83 |
1000 |
Register je Entity – Entity j beginnt bei 20000 + j × 1000 |
84 |
10 |
Register je Datenpunkt einer Entity |
Zusammen mit der Anzahl Pumpen und Entities (Register 88–89) kann ein Leitsystem alle
Pumpen und Entities automatisch durchlaufen, z. B. bei 3 Pumpen die Basisadressen 100,
200 und 300. Wo ein Datenpunkt innerhalb einer Pumpe liegt, steht nicht hier, sondern
in der Standard-Konfiguration.
Zustand der App
Statuswort (Register 85):
| Bit | Gesetzt, wenn | Wozu |
|---|---|---|
| 0 | die Gerätedaten des FLECS-Geräts gelesen sind | Unterscheidet „Feld leer, weil noch nicht gelesen“ von einem gültigen Wert |
| 1 | mindestens eine Pumpe konfiguriert ist | Wichtigste Prüfung: Ohne Konfiguration aus der Cloud bleiben alle Pumpenregister 0. Ist das Bit 0, sind die Pumpenwerte keine Messwerte |
| 2 | mindestens ein Modbus-Client verbunden ist | Für die lesende Steuerung selbst immer gesetzt; aussagekräftig nur in der Weboberfläche. Ob weitere Clients verbunden sind, zeigt Register 87 |
Heartbeat (Register 86): zählt in jedem Zyklus der App um 1 hoch (Standard: zehnmal je
Sekunde) und beginnt nach 65535 wieder bei 0. Ändert sich der Wert zwischen zwei
Abfragen nicht mehr, liefert die App keine frischen Daten.
Verbindungen (Register 87), Laufzeit (Register 90–91, Sekunden seit dem Start) und
Uhrzeit des Geräts (Register 92–93, Unix-Sekunden UTC). Wird die Laufzeit kleiner, ist
die App neu gestartet.
Inbetriebnahme und Implementierung
Inbetriebnahme mit einem Modbus-Tool
Für die erste Prüfung genügt ein Modbus-TCP-Testprogramm auf einem Rechner im selben Netz. Die App antwortet auf jede Unit-ID.
- Verbindung und Gerät prüfen: Function Code
04, Protokolladresse0, Anzahl3. Erwartet:0x4850 0x4D42 0x0001(dezimal18512 19778 1). Kommt eine andere Antwort oder keine, stimmen IP-Adresse oder Port502nicht. - Kodierung bestimmen: Register
4–7lesen (Protokolladresse3, Anzahl4). Die Prüfzahl zeigt die Wortreihenfolge, Register7die Textkodierung. Beides im Testprogramm und später in der Steuerung einstellen. - Konfiguration prüfen: Register
85lesen. Ist Bit 1 nicht gesetzt oder steht in Register88eine0, sind keine Pumpen konfiguriert – Herborner Pumpen muss sie in der Cloud anlegen, und HP.CloudLink muss auf dem Gerät laufen. - Pumpendaten prüfen: Die Basisadresse der Pumpe aus Register
81berechnen und einen bekannten Wert schreiben bzw. lesen. Die Weboberfläche zeigt unter Telemetry dieselben Werte; die Gruppe Device Information enthält den Info-Block, wie ihn die Steuerung sieht. - Optional: Function Code
43lesen, sofern das Programm ihn unterstützt.
Implementierung in der Steuerung
- Beim Verbindungsaufbau Register
1–7einmal lesen. Weicht die Signatur ab oder ist die Layout-Version unbekannt, eine Störung melden und keine weiteren Register auswerten. Danach Wortreihenfolge und Textkodierung aus Register4–7übernehmen. - Den Info-Block in einem Stück lesen: alle 99 Register mit einer Anfrage (Function Code
04, Protokolladresse0, Anzahl99). Jede Anfrage zählt gegen die Grenze der Anfragen je Zyklus; ein großer Block belastet die App weniger als viele kleine. - Heartbeat überwachen: Register
86zyklisch lesen, z. B. jede Sekunde, und auf Änderung prüfen, nicht auf größer – der Zähler läuft über. Ändert er sich mehrere Sekunden lang nicht, eine Störung „Modbus Connector liefert keine Daten“ auslösen. - Neustart erkennen: Wird die Laufzeit (Register
90–91) kleiner, ist die App neu gestartet. Dann die Prüfung beim Verbindungsaufbau wiederholen: Neue Pumpen erhalten ihre Register erst mit einem Neustart, und eine geänderte Byte-Reihenfolge oder Textkodierung gilt ebenfalls erst danach. - Pumpenwerte nur mit Bit 1 verwenden: Ist Bit 1 im Statuswort nicht gesetzt, die Input-Register der Pumpen als ungültig behandeln.
- Texte dekodieren: je Register zwei Bytes in der eingestellten Reihenfolge, am ersten
0x00abschneiden, mit der Kodierung aus Register7in Zeichen umwandeln.
Ablauf in Pseudocode:
beim Verbindungsaufbau:
r = lese_input_register(adresse=0, anzahl=99)
wenn r[0..1] != [0x4850, 0x4D42] -> Störung "falsches Gerät"
wenn r[2] != 1 -> Störung "unbekannte Layout-Version"
word_swap = (r[3] == 0x5678) // little: niederwertiges Wort zuerst
kodierung = r[6]
basis_pumpe(i) = i * r[80]
zyklisch (z. B. 1 s):
r = lese_input_register(adresse=0, anzahl=99)
wenn r[85] == heartbeat_alt über 5 s -> Störung "keine Daten"
wenn laufzeit(r[89..90]) < laufzeit_alt -> Neustart: Verbindungsaufbau wiederholen
pumpen_gültig = (r[84] & 0b10) != 0
Die Indizes im Pseudocode sind Protokolladressen, also Registernummer minus 1.
Einstellungen
Die Server-Einstellungen – Port, Zykluszeit, Anfragen je Zyklus, Byte-Reihenfolge und Textkodierung – sind mit ihren Standardwerten in der Standard-Konfiguration beschrieben. Herborner Pumpen kann sie über die Cloud anpassen; HP.CloudLink übergibt die Änderung an den Modbus Connector, und die aktuelle Konfiguration wird zurück in die Cloud gemeldet. Einzelne Werte lassen sich außerdem über Umgebungsvariablen der App setzen; sie werden dabei dauerhaft übernommen.
Weboberfläche
Die Weboberfläche der App zeigt:
- Telemetry: alle Register mit ihrem aktuellen Wert, in der Gruppe Device Information
auch den Info-Block
1–99, und den Zustand des Servers (Verbindungen, Anzahl Register, Byte-Reihenfolge und Textkodierung), - Logs: die letzten Protokolleinträge,
- Statistics: Anfragen, Verbindungen und Fehlerantworten der Modbus-Schnittstelle,
- Jobs: Wartungsaufträge, die Herborner Pumpen über die Cloud anstößt, etwa die Installation, Aktualisierung oder den Neustart einer anderen App auf dem Gerät. Der Modbus Connector kann sich selbst nicht aktualisieren oder neu starten.
Ereignisse und Protokolle der App gelangen über HP.CloudLink auch in die Herborner-Cloud.
Sicherheit
Die Modbus-Schnittstelle und die Weboberfläche arbeiten ohne Anmeldung. Betreiben Sie
das Gerät nur in einem vertrauenswürdigen Netz und sichern Sie den Zugang zu Port 502
und zur Weboberfläche über Firewall oder Netzwerksegmentierung ab. Jeder Modbus-Client im
Netz kann die Geräteinformationen lesen, darunter eine eindeutige Kennung des Geräts.
Lizenzen
Für die Nutzung gelten die Lizenz und die Lizenzbedingungen (EULA). Die enthaltene Drittanbieter-Software ist unter Drittanbieter-Lizenzen aufgeführt.