NEWS
Auslesen einzelner Bits über Modbus-Adapter
-
Hallo Zusammen,
ich versuche aktuell meine Heizung via Modbus TCP an ioBroker anzubinden.
Prinzipiell funktioniert das auch, d. h. Verbindung zur Heizung habe ich und auch Werte kann ich auslesen bzw. kommen im ioBroker wie erwartet an.
Ein Problem habe ich aber, bei dem ich mir nun schon seit Tagen nicht weiterkomme.
Erstmal kurz ein Beispiel, was bei mir funktioniert.
Generell unterstützt die Heizung nur Funktionscode 03 (Read Holding Registers). Mir liegt eine Liste des Herstellers vor, auf der das Mapping abgedruckt ist.
Bspw. steht in Adresse 00011 die Kesseltemperatur in °C. Das habe ich auch entsprechend im Modbus-Adapter eingetragen und funktioniert super.
Jedoch ist es so, dass etliche Störungen und Fehler der Heizung nicht einzeln in einer Adresse stehen, sondern bis zu 16 Fehler in einer Adresse.
Es ist dann beschrieben, welches Bit welche Störung signalisiert. Beispiel:
Adresse 00002 Bit 0 = Türschalter
Adresse 00002 Bit 1 = Fallschacht
Adresse 00002 Bit 2 = Bunkeröffnung
Adresse 00002 Bit 3 = zu wenig Unterdruckusw. --> Jede Adresse hat 16 Bits (0-15), es sind aber nicht überall alle Bits belegt.
Nun habe ich heute Früh mal die Störung "Fallschacht" an der Heizung ausgelöst / simuliert.
Bei der über FC03 (Read Holding Registers) ausgelesene Adresse 00002 stand dann unter Objekte die Zahl 2.
So aus binärer Sicht würde das ja bedeuten, dass das Bit 1 den Wert 1 hat, würde also passen.
D. h. ich müsste das Ganze dann immer entsprechend umrechnen.
Gibt es da nicht eine andere Möglichkeit, sodass ich mehrere Objekte habe und dahinter immer nur ein einzelnes Bit steckt?
Weil ich denke die Umrechnung wäre zu kompliziert, gerade weil es ja auch sein kann, dass nicht nur ein Bit einer Adresse 1 sein kann, sondern auch mehrere.
Wie ihr vielleicht merkt, bin ich da noch ein Neuling. Ich würde mich sehr freuen, wenn mir hier jemand kurz eine Hilfestellung geben könnte.
Vielen Dank euch!
-
@magnus-0 sagte: welches Bit welche Störung signalisiert.
Siehe Funktion checkBit(val, bit).
-
Vielen Dank für die schnelle Rückmeldung.
Ich muss sagen, ich kene mich da leider noch nicht so genau aus, aber mithilfe des Namens "checkBit" bin ich auf folgenden Beitrag / Kommentar / Hinweis von @GombersIOB gestoßen:
Auswertung Bits Modbus-Register
Ich habe mir den Screenshot von @GombersIOB angesehen, jedoch glaube ich, dass das bei mir nicht funktioniert.
Was passiert nämlich, wenn mehrere Bits eines Registers auf 1 gehen? Dann funktioniert das Ganze nicht mehr, oder?
-
@magnus-0 sagte: wenn mehrere Bits eines Registers auf 1 gehen?
In einer Schleife kann man alle 16 Bit prüfen.
return !!(val >> bit & 1);
-
@paul53 Ok, Danke für die Rückmeldung.
Das muss ich mir in Ruhe die Tage mal anschauen, die Geschichte mit Bit / Dezimal usw. ist nicht so meins. Aber schaue ich mir mal an.
-
@magnus-0 sagte in Auslesen einzelner Bits über Modbus-Adapter:
wenn mehrere Bits eines Registers auf 1 gehen?
wieso nicht. ist doch ein binäres Mäuseklavier mit 16 dipswitches auch