[ModBus] [SolarEdge WR] Datenblöcke / Skalierungsfaktoren / Socket Restart

Hi zusammen,

ich habe einige Fragen zur neuen Modbus Implementierung, die ich für unseren SolarEdge WR benutze.

Woher ich komme:
Im Frühjahr 2021 gab es noch nicht die neue Implementierung, daher

  • habe ich über ein Script alles Modbus Instanzen erzeugt und mit dem Splitter verbunden
  • das Intervall dieser auf 0 gesetzt, es wird also keine Lesezugriff von den Instanzen getriggert
  • ein zyklisch aufgerufenes Script geschrieben, welches mir die MosBus Register ausliest und die Variablen entsprechend berechnet (SolarEdge hat diese komische Skalierung mit den *_SF Registern)

Funktioniert so weit seid fast vier Jahren, allerdings mit einigen Problemen:

  • Der Socket ist zwei mal am Tag „down“, wahrscheinlich da in dieser Zeit der WR die Isolationsprüfungen durchführt. Dies fange ich im Script ab, indem ich den Socket schliesse, wieder öffne und anschliessend 90 Sekunden warte.
  • Die Skalierungsfaktoren ändern sich durchaus dynamisch, insbesondere in einigen Grenzbereichen. Dies habe ich versucht dadurch abzufangen, dass ich das zugehörige SF Register vor und nach dem eigentlichen Registerblock auslese, für den dieses gilt. Nur wenn die beiden Werte gleich sind, errechne ich aus den Modbus Rohdaten die endgültigen Variablen. Klappt aber nur meistens, ich habe immer noch in den Grenzbereichen die Sprünge, nun aber nicht mehr so häufig. Ist aber trotzdem unschön, beim M_Import z.B. von 300W auf 2980W auf 32 W auf 310W zu springen.

Nun zu der neuen Implementierung und meinen Fragen:

ModbusDevice:
will ich recht ungern verwenden, da sich dann alle ID der Register ändern würden, oder kann ich in ein leeres Device meine ModbusAddress Instanzen „ziehen“ und die werden einsortiert?

Datenblöcke lesen:
interessiert mich am meisten. Da meine Modbus register alle mit dem Intervall 0 konfiguriert sind, habe ich mal schnell im Splitter einen Datenblock angelegt, um einige Register des Meters im Block auszulesen. Klappt super und sehr schnell.

Frage: Habt jemand von Euch beobachtet, ob sich damit auch die SF Problematik erledigt? Schafft es SolarEdge die Daten konsistent in den BlockRead zu packen?

Frage: Habe ich irgendeine Kontrolle per Script, wann die Blöcke ausgelesen werden, oder übernimmt das Symcon und kann nicht eingreifen? Ich müßte ja irgendwie mein Script starten, wenn alle Daten eingelesen wurden, um die Variablen zu berechnen (ja, mit den virtuellen Adressen im Device geht es auch, ich sträube mich aber noch, nochmal von 0 anzufangen).

Frage: Was passiert, wenn der Socket zweimal am Tag off ist? Bei meinem Script musste ich immer den Socket per Script aus/anschalten, vielleicht auch, weil das Intervall überall zu 0 gesetzt war.
Erkennt nun der Splitter, dass der Socket weg ist und setzt diesen nach dem Timeout wieder neu auf?

Ich habe gerade ein wenig mit den Blöcken und dem Modbus Device gespielt.

Ich habe den Range vom Meter1 (Startadresse 190, Anzahl 105) im Block des Splitters hinterlegt.
Die Variablen in meinen Modbus-Address Instanzen werden fleissig geupdated.

Parallel habe ich ein modbus-Device angelegt und das json File von @pitti für das Meter1 verwendet.
Hier scheint jedoch kein Update mit den Block-Reads des Splitters zu geben?
Setze ich das Intervall in der Device Config auf 5000ms, so werden die Werte fleissig im 5 Sekunden Abstand gelesen.
Setze ich das Intervall auf 0, werden die Variablen nicht vom Splitter-Blockread geupdated, so wie ich es von den einzelnen Adress-Instanzen her gesehen habe.

Mache ich da was falsch, oder geht es halt nicht?

Wenn ich mich recht erinnere kommt die Blockabfrage für das Modbus device erst noch.

Viele Grüße
Stephan

oh, laut @gogo20012002 (Link) wurde es schonmal erfolgreich ausprobiert