Mit dem Abschluss dieser Reihe möchte ich noch eine letzte Variante vorstellen, die ich umgesetzt habe: Das zusammenhängende Lesen von Registern mit unterschiedlichsten Datentypen. Manchmal hat man z.B. eine Reihe von 32bit Registern und dazwischen gibts dann auf einmal ein 16bit Register. Erst mal blöd, ist aber halt so. Wieder am Beispiel des SolarEdge Wechselrichters zeige ich, wie man dieses Problem in Loxone lösen kann.
Zunächst einmal: Ich lese in meiner Hausautomatisierung natürlich nicht jedes einzelne Register der nachfolgenden Beschreibungen aus. Aber eine grundsätzliche Lösung hilft vielen in unterschiedlichsten Kontexten und es muss ja nicht jeder in Probleme laufen…
(Auf die kleinen Bilder kann man nachstehend klicken um sie in groß zu betrachten.)
Eine generelle Erläuterung zu der Konfiguration, die sich von den Teilen zwei und drei dieser Reihe etwas unterscheidet. Danach finden sich dann zwei Beispiele samt Erklärung.

Der wichtigste Teil in diesem Screenshot befindet sich links im Textgenerator-Baustein. Neben den bereits beschriebenen Informationen wie IP-Adresse, Port und Startadresse sieht man dort:
- Angabe von Menge und Ergebnisdatentypen, kommasepariert. Im Bild zu sehen: Es sollen 6 Werte vom Datentyp 1(=uint16) gelesen werden, dann einmal ein Wert vom Datentyp 2(=int16), dann wieder 6 Werte vom Datentyp 1(=uint16) usw.
- Die „1“ in der vierten Zeile sagt dem Programm, dass die über Modbus-TCP gelesenen Werte des Devices im BigEndian Format geliefert werden. Eine „0“ wäre entsprechend die Zulieferung in einem LittleEndian Format.
Das Ganze funktioniert deswegen ganz gut, weil wir eigentlich nur festlegen, wie die Ergebnisbytes zu interpretieren sind. Man kann also einen int32 Wert auch als float32 lesen lassen. Ist natürlich sinnfrei, erzeugt aber zunächst mal keinen funktionalen Fehler aus Implementierungssicht. Insofern ist also gut darauf zu achten, dass man die richtigen Datentypen verwendet. Sonst gibts Zahlensalat.
An 2 konkreten Beispielen sieht das dann wie folgt aus.
Beispiel 1 – Auslesen von 22 Registern – int16 und uint16 gemischt
Aus der SolarEdge Doku habe ich die folgende Registerbeschreibung verwendet und ausgelesen.

Wer aufgepasst hat: Die Mengen und Datentypangaben passend zu dieser Beschreibung entsprechen denen, die oben im großen Screenshot zu sehen sind.
Beispiel 2 – Auslesen von 9 Registern – uint16, uint32 und float32 gemischt
Noch gemischter in der Verwendung der Datentypen ist dieses Beispiel.

Die Umsetzung in eine passende Konfiguration sieht dann so aus:

Es empfiehlt sich bei der Verwendung des Codes auch mindestens Teil 3 dieser Reihe zu lesen. Die Ausgabe von Strings und Coils funktioniert weiterhin so wie dort beschrieben. Diese speziellen Datentypen sollten auch nicht unbedingt mit dem Rest vermischt werden… Auch den dortigen Hinweis zur Stabilität bei Deployments beachtet man besser.
Hex hex, der Code…
…und hier gibts die picoC Sourcen dazu. Ist wiederum eine Weiterentwicklung der Sourcen aus den Teilen zuvor. Falls es im Code zuvor Bugs gegeben haben sollte: Nur die nachstehende Variante würde weiterentwickelt. Stand jetzt, ist das Projekt aber abgeschlossen. Ich hoffe, das Toolset lässt keine Wünsche mehr offen. 🙂
Linker Programm-Baustein:
Rechter Programm-Baustein:
Wem diese Lösung geholfen hat: Ich freue mich über jede Nachricht dazu.

