Loxone Config – Modbus synchron lesen – Teil 3

In Vorbereitung auf den letzten vierten Teil zeige ich hier eine weitere Möglichkeit um große Mengen an synchron gelesenen Modbus-TCP Daten in Loxone direkt anzeigen zu lassen. Synchron/blockweise/atomar gelesen, wie man es auch nennen möchte. Ist natürlich in jedem Fall komfortabler nur entsprechende Ausgänge an den ausgebenden Baustein anzuschließen und sicher zu sein, dass alles zusammenpasst, als in Loxone die Register herauszufummeln und asynchrone Werte zu erhalten. Oder auch zum Testen, ohne große Konfiguration einfach mal Daten anzeigen lassen. Zudem ist man frei in den zeitlichen Abständen des Auslesens. Voraussetzung ist natürlich ein zusammenhängender Registerbereich.

UPDATE: Aktuellste Version von Funktionsbeschreibung, Doku und Sourcen gibts hier.

Die Lösung, deren Code weiter unten heruntergeladen werden kann, unterstützt das synchrone Auslesen von bis zu 26 Registern – numerische 16 oder 32 Bit Register, aber auch von String-Datentypen sowie das synchrone Auslesen von Coils (das sind Bit-Register). Genauer:

Die gelesenen Bytes werden im Code noch „konvertiert“ im Sinne einer Umwandlung von Big Endian Formaten hin zu Little Endian.

Im Folgenden zeige ich drei Beispiele mit unterschiedlichen Datentypen und gehe auf die Besonderheiten beim Auslesen von Strings und Coils ein. Ich verwende hierfür einen Solaredge Wechselrichter. Es sollte aber natürlich bei allen Modbus-TCP Devices funktionieren. Für andere Modbustypen müsste der Code angepasst werden. Aktuell liest der Code alle 10 Sekunden Werte aus, ist aber natürlich individuell anpassbar.

Beispiel 1 – 20 numerische Werte synchron auslesen und anzeigen

Das Endergebnis des Auslesens der Werte über die Modbus Funktion 3(Read holding registers) wird wie folgt aussehen, wobei einige Besonderheiten zu beachten sind. Diese stelle ich gleich darauffolgend dar. Diese Variante ist anwendbar für die Datentypen uint16, int16, uint32, int32, float16 und float32. Abhängig vom Datentyp werden also jeweils entweder 2 oder 4 Register vorgesehen.

In den beiden dargestellten Programm-Bausteinen laufen jeweils picoC Programme. Im Linken wird die Modbus-Connection hergestellt, die Daten gelesen und an den Ausgängen O1 bis O13 die ersten 13 Werte ausgegeben. Die restlichen Werte werden an den nächsten Programm-Baustein als Hex-String weitergegeben. Der Baustein kann aber natürlich auch eigenständig laufen.

Eingestellt ist im Beispielcode die Startadresse 40206(9D0E) des Wechselrichters mit 20 synchron zu lesenden int16-Registern (Wert 2). Insgesamt werden also in einem Rutsch 20*2=40 Bytes gelesen.

Der empfangende Programm-Baustein erhält die Rest-Daten als Hex-String (Eingang T1) inkl. der Information, um welchen Datentyp es sich bei den Daten handelt. Da die Programm-Bausteine asynchron laufen, ist das Ganze dann auch nur fast synchron in der Anzeige. Im Code ist die Update-Häufigkeit des empfangenden Bausteins auf 50ms eingestellt. Kann man natürlich reduzieren und beobachten, wie sich der eigene Server bzgl. seiner Ressourcen dann verhält. Noch etwas schneller stellt sicherlich kein Problem dar. Nur ganz weglassen sollte man die Verzögerung dann doch nicht…

Die Einstellungen werden über einen Textgenerator-Baustein vorgenommen. Alternativ im picoC Code selbst, wie im zweiten Teil dieser Serie bereits beschrieben. Eine allerletzte, weil flexiblere Möglichkeit, zum Auslesen gemischter Datentypen in einem Block wird noch im vierten Teil beschrieben. Das ist dann auch die Variante, deren Code im Zweifel weiterentwickelt wird.

Beispiel 2 – Auslesen und Anzeigen von 4 Werten vom Datentyp String

Liest man String-Datentypen aus, so werden diese am Ausgang „Txt2“ des linken Programm-Bausteins gesammelt ausgegeben. Sie dienen ohnehin nur zur Info und so viele Textausgänge gäbe es auch gar nicht.

Hierfür wird ein Textgenerator-Baustein mit einer anderen Startadresse(E100), Menge an Ergebnissen(4) und Datentyp(String32, also 8) erstellt:

Beispiel 3 – 13 Coils synchron auslesen und anzeigen

Coils sind Bit-Register und von daher anders zu behandeln. Wenn z.B. 9 Coils gelesen werden, dann sind hierfür 2 Byte an Daten notwendig, wobei vom zweiten Byte dann nur das erste Bit relevant ist. Mit diesem Wissen nun zum Beispiel mit 13 Coils. Die Ausgabe an den Kanälen erfolgt so, dass jeweils ein Byte an einen Ausgang gelegt und ein Loxone Binärdekoder angeschlossen wird. Sieht im Ergebnis dann folgendermaßen aus:

Ich lese hier startend bei der Registeradresse 80 (in Hex 0050) also 13 Coils(Datentypwert 9) synchron aus und lasse diese anzeigen. Die Ergebnisse sind im Screenshot von oben nach unten zu lesen. Das erste Bit entspricht also dem Wert von Register 80, das nächste 81 usw..

Nun zur Magie…

Für den linken Programm-Baustein mit der Modbus-Connection nachstehend der picoC-Code. Ist eine Modifikation des Codes aus Teil2 dieser Reihe, mit etlichen Verbesserungen und Erweiterungen.

Für den rechten Programm-Baustein wird ein Decodier- und Anzeigecode benötigt. Nachstehend zum Download.

Kein Licht ohne Schatten… Leider ist es so, dass die zur Verfügung gestellte Lösung von Loxone nicht ganz sauber ist. Heißt: Wenn gerade vom Modbus TCP-Stream gelesen wird und gleichzeitig ein Deployment auf den Miniserver erfolgt, also eine neue beliebige Konfiguration eingespielt wird, stürzt der ganze Miniserver ab(Stand 01/2026) und rebootet. Um das zu verhindern, zeigt die Implementierung an, wann gerade vom Modbus gelesen wird.

Redeployments also nur im Zustand „Reading ok“ durchführen. Dann klappts auch mit der Stabilität. 🙂

Ich habe sehr viel Inspiration aus den geteilten Informationen anderer Leute aus dem Internet bekommen. Deshalb auch die Offenheit hinsichtlich dieser Lösung. Ich hoffe, es hilft jemandem. Feedback ist natürlich jederzeit willkommen.

3 Antworten auf „Loxone Config – Modbus synchron lesen – Teil 3“

  1. Danke für diese Lösungsmöglichkeit, sehr cool.
    Zum Glück ist mir dein Beitrag im Loxforum dazu gepusht worden mit Link, denn dort ist er nimmer auffindbar.
    Toll wäre wenn du das auch im Loxwiki dokumentieren könntest bzw. Nochmal im Forum zur Verfügung stellst.

    1. Zugegeben, mein Kommentar im Loxforum Post #217.1 ist etwas versteckt. Dachte, dass der Hinweis im diversen Diskussionverlauf sinnvoll wäre. Falsch gedacht, da offensichtlich nicht wirklich auffindbar/brauchbar… 🙂 Ich werde im Loxwiki die Tage mal eine Seite dazu anlegen.

Schreibe einen Kommentar zu andrej Antwort abbrechen

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