Loxone Config – Modbus synchron lesen – Teil 1

Im Zuge der „Loxonisierung“ meiner Haustechnik bin ich auf ein Problem gestoßen, dass wohl bereits viele vor mir hatten: Das asynchrone Auslesen von Modbus-Werten. Klingt komisch, macht aber immer wieder Probleme. Beispielsweise in Fällen, in denen Register-Werte mit ihren passenden Skalierungsfaktoren ausgelesen werden müssen kann das temporär zu großen Ausreißern führen. Damit werden Daten falsch angezeigt, Graphen falsch skaliert und auch Statistiken können verfälscht werden.

Früher oder später kommt wohl jeder der einen Loxone Server/Miniserver einsetzt an den Punkt, wo ein Modbus angesprochen werden muss. Typischerweise sind das Wechselrichter, Wärmepumpen, Wallboxen etc.. Jetzt ist es leider so, dass Modbus ein relativ altes lowlevel System ist. Man kann sich Anfragen so vorstellen, dass Bytefolgen hingeschickt werden, um in einer Tabelle (Device) eine bestimmte Zelle (Register) anzufragen und das Ergebnis entsprechend in einer Bytefolge zurückzuliefern. Hat man nun eine ganze Menge an Anfragen, dann werden diese nacheinander abgearbeitet, im Fall von Loxone zeitlich asynchron. Keine Transaktionen und in Loxone auch keine Gruppierungsmöglichkeiten.

Im Folgenden gehe ich darauf ein, wie in „Loxone Config“ Modbus-Werte synchron gelesen werden können. Ich mache das anhand eines Fallbeispiels mit meinem 3-Phasen SolarEdge Wechselrichter für das Lesen von 4 Registern und gebe noch einen Tipp für das Lesen von 2 Registern. Anwendungsfall hierbei ist es den Wert des bezogenen bzw. eingespeisten Stroms aus dem Netz auszulesen (M_AC_Power).

In der SolarEdge Vorlage, welche bei Loxone zum Download erhältlich ist, ist eine Musterkonfiguration von SolarEdge vorgegeben, welche einige Register ausliest – natürlich asynchron – und damit zu dem Problem der temporären Ausreißer führt. In unserem Beispiel nehmen wir mal die Registerwerte 40206 und 40210. Nachstehend ein Auszug aus der Doku.

Ziel ist es nun also diese beiden Registerwerte synchron zu erhalten. In Loxone können für einen Wert nur bis zu 64bit-Werte ausgelesen werden. Für unser Beispiel ein Problem, da offensichtlich 5 16bit-Register in Reihe notwendig wären. Für unser Beispiel wird es ausreichend sein, die vier Register ab 40207 synchron zu lesen (also 40207 mit 64bit), da 40206 die Summe der Folgeregister enthält, also die Phasen A, B und C. Heißt: Wir lesen 4 Register synchron, summieren die ersten 3 Register auf und mulitiplizieren mit dem synchron gelesenen Skalierungsfaktor. Das Ergebnis wird damit immer passend sein, ohne Ausreißer. Die Zauberworte zur Lösung heißen Bitmuster und Mathematik: Wir rechnen aus den gelesenen 64bit einfach unsere 4x16bit Integer heraus.

In der Loxone Config wird das am Ende so aussehen:

Wie funktioniert das nun?

1. Zunächst wird ein auszulesender Modbus-Wert als Sensor konfiguriert, der 64bit liest:

2. Programm-Baustein in der Loxone-Config einfügen

In einem Programmbaustein werden wir individuellen PicoC Code einfügen und den gelesenen 64bit Sensorwert verarbeitet. Also: Modbus-Sensor an I1 anschliessen und auf der Output-Seite einige Ausgänge anzeigen lassen. Für dieses Beispiel mindestens 4. Der Programmcode iteriert sekündlich und verarbeitet den Wert des Sensors entsprechend.

Nachstehend der Programmcode für den Baustein zum Download.

Der Code enthält 2 Fallbeispiele für synchrones Auslesen:

  • Wie oben beschrieben einen 4-Register Fall mit 64bit
  • Einen 32bit Fall. Also müssen die Register hier direkt hintereinander folgen. Beispielkonfiguration nachstehend.

Dieser Sensor kann dann an I2 des Programm-Bausteins angeschlossen werden.

Das Gesamtergebnis sieht dann wie folgt aus:

Damit können viele Probleme umgangen werden. Hope it helps! 🙂

Ich werde demnächst noch einen zweiten Teil zum Modbus Lesen schreiben: Über PicoC ist es auch möglich z.B. 10 oder 20 oder 30 oder mehr Werte in einem Block aus dem Modbus synchron auszulesen. Stay tuned!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert