Solax Wechselrichter per Modbus abfragen (viele Werte auf einmal, wie?)

Hallo Zusammen,
ich würde gerne meinen Solax-Wechselrichter mittels Modbus RTU über TCP abfragen.
Ich benutze dazu einen Exsys EX-6051, im Modus TCP-Server.
Soweit so gut, ich bekomme Antworten vom Wechselrichter.

Allerdings, war ich nur schlau genug an die Modbus-Instanz mit CSCK_SendText einen Schnipsel Hex zu senden und Antworten zu bekommen. Dazu habe ich das Beispiel aus der Hersteller-Doku genommen.

Ich bin aber natürlich faul und würde gerne sehr viel Krempel abfragen.
Dazu sehe ich, IPS kann auch Modbus „sprechen“.

Was ich aber nicht so genau verstanden habe, bzw weiß:

Gibt eine eine Möglichkeit, dass ich die Register einfach schnell und automatisch der Reihe nach abfrage? Es gibt ja einerseits einen Modbus-Gateway, wo man Datenblöcke konfigurieren kann, oder halt eine Modbus-Instanz.
Aber ich sehe bei der Instanz nur die Möglichkeit einen Datenpunkt abzufragen.

Dazu würden es wirklich sehr, sehr, sehr viele Instanzen werden wenns nur einen Punkt pro Instanz gibt.

Was ist denn das was man als Expertenoption bei dem Gateway angeben kann? Das finde ich nicht dokumentiert.

Ach noch etwas: Ich muss bei IPS die HEX-Adresse aus der Schnittstellendoku in eine Dezimalzahl umwandeln, oder? (also im Feld für die Adresse)

Danke & Gruß,
Maeffjus

SolaxPower External Communication Protocol X1&X3 Hybrid -G4 ModbusRTU V3.14- public version.pdf (2,6 MB)

Hallo Meffjus,

das selbe habe ich gerade auch vor und stehe vor dem gleichen Problem wie du auch.

Da gibt es eine Dokumentationslücke im Handbuch.

Einerseits wird dort geschrieben, dass man zunächst ein Modbus Device anlegen soll und dieses dann später einem Modbus Gateway zuordnen soll. Und ja das funktioniert auch. Aber nur für Einzelwerte!
Wenn ich z.B. die Seriennummer aus meinem Wechslerichter auslesen will, wird mir diese in 10 unsigned Word’s im ASCII Format zurückgeliefert. (Kann ich im Debug des Gateways sehen)
Aber natürlich steht in der Instanzvariablen nur der erste Wert als Integer!?

Dann habe ich im Gateway genau wie du es auch beschrieben hast die Datenblöcke gefunden und welche eingetragen. Denn nur dort kann man eintragen das die erwartete Antwort mehr als ein Wert ist!
Und wie schon geschrieben im Debug sehe ich das 10 Werte abgefragt werden und der Wechselrichter auch 10 Werte zurückgibt. (Und es ist tatsächlich seine Seriennummer) Also so weit so gut.

Aber was ich nicht verstehe und nicht gefunden habe ist, wie ich die Datenblöcke aus dem Gateway den einzelnen Modbus Instanz Devices zuordnen kann!? Übrigens auch mit einem Cutter habe ich experimentiert und bin gescheitert. Den kann man nämlich nicht an ein Gateway anbinden sondern nur an eine Schnittstelle. (Wahrscheinlich weil ein Gateway auch ein Splitter ist)

Hast du eine Lösung gefunden oder weiß jemand wie man das machen muss?
Ich hätte erwartet, dass man bereits bei der Modbus Device Instanz angeben kann wieviele Werte zurückgeliefert werden sollen. Aber das wäre wohl zu einfach…

Beste Grüße
Ralf

Hey Ralf,
sorry für die späte Antwort! Ich war im Urlaub und hatte mal ein paar Tage keine Lust auf IPS :wink:
Also mir ist es nur für die High und Low bytes aufgefallen. Man liest ja eig. nur eins davon aus.
Aber es geht auch beides, dann musst du z.B. ein 8 bit high und ein 8 bit low abrufen indem du von der Adresse 16 bit als Wert liest. Dann hast Du beides zusammen.
Das musst du dann umwandeln und aufteilen.

Für mich ist das aber nicht wichtig, denn ich lese tatsächlich nur die paar Dinge von denen automatisch das korrekte ausgegeben wird.

Zum Schreiben kann ich zumindest soviel sagen, dass die High und Low-bytes vom Lesen in separate Adressen geschrieben werden. (Diese sind übrigens NICHT gleich den Leseadressen)

Gruß,
Maeffjus

Hallo!

Ich versuche auch gerade meinen SOlax Inverter mit einem Raspberry PI auszulesen, dazu habe ich auch einen USB-RS485 Konverter, der baugleiche funktioniert einwandfrei mit einem Zähler (SDM630), aber ich schaffe es nicht den Inverter zu kontaktieren… hat jemand vielleicht einen kurzen Codeausschnitt, wie ihr die Initalisierung macht? Danke! LG

Hey, dafür brauchst Du keine Scripte!
Du musst eine Modbus-Instanz anlegen und dann die passenden Adressen abfragen. Siehe Bild:

Viel Spaß & Glück: Ahja, du musst die Adressen aus den Unterlagen von Solax umrechnen.
Entweder von Hex nach Dec oder andersrum.
Gruß,
Maeffjus

Ahja, den Intervall musst du aber angeben, ich mache das nur zyklisch mittels eines Skripts! Zum Beispiel 60.000ms

Hallo!

Danke, mit welchem Programm machst du das?
ich versuche es mit Python über einen Raspberry…

DAnke!

LG

Da du dich hier im IP-Symcon Forum aufhältst darfst du noch mal raten … :thinking:

1 „Gefällt mir“

Minesweeper und Pinball :grin:

Hi,
ich hatte dasselbe problem und habe mir für einen ESP32 einen MQTT Gateway selbst geschrieben der die Daten meines Solax per Modbus RTU (RS-485) abfragt und per MQTT bereitstellt. Damit ist meine Lösung nicht an eine bestimmte Hausautomatisierung gebunden und mehrere Clients können angeschlossen werden, wie zb. zusätzlich eine OpenWB
Vieleicht ist dieses Projekt ja interessant für den Einen oder Anderen…

Ein paar Screenshots der Weboberfläche gibt es im dazugehörigen Github Wiki

1 „Gefällt mir“

um mal auf die eingangsfrage zu antworten: In der Modbus Antwort steht an 3. Stelle als uint16 die Länge der Datenantwort. Also gehen in eine Antwort nur 255 Byte. Hab ich auch selbst getestet. Fragt man mehr ab kommt nur Müll heraus. Also muss man 2x abfragen. Ich mache es so:

  1. 01 04 00 00 00 77 → für die ersten 119 Register
  2. 01 04 00 78 00 77 → für die nächsten 119 Register
  3. usw.

Wobei für den Solax X1 nur in der ersten 119 Registern die relevanten Daten stehen.

Das klingt sehr interessant, geht Das nicht auch mit anderen RS485 Quellen?

Hi
Natürlich geht das auch mit allen anderen RS485 Quellen, es muss nur das spezifische Protokoll einprogrammiert und interpretiert werden :wink:

Zb. Der Growatt hat ein fast identisches Protokoll. Dieser kann sehr leicht integriert werden.

Hi Tobias,
Ich habe dein Modbus to MQTT Gateway mal an einem Q.Home ESS (Wohl Baugleich mit dem Solax x3 G4) getestet. Leider bekomme ich nicht so wirklich valide Werte zurück.
Einige Werte scheinen Valide, jedoch scheitere ich bereits an der Seriennummer.

Leider finde ich so gar keine Modbus Doku des bei Q.Cells, eventuell hast du noch einen Tipp die Register richtig zu bestimmen / bzw. das Problem zu lösen.
Mein Ziel ist es, alle Daten aus dem WR auszulesen und auch einzelne Werte (z.B. SoC nach Wettervorhersage) zu schreiben.

Bin für jede Info dankbar
Gruß Steffen

Hi,
wenn dein WR baugleich mit dem Solax-X3 ist und du mit der Solax-X3 Einstellung überhaupt einen Raw Datastring zurückbekommst, ist die erste Hälfte der Arbeit ja schon fast geschafft :slight_smile: Wenn du kein Modbus Protokoll hast, bleibt dir nur ein Reverse Engeneering übrig.
Sprich, in der WebUI musst du auf der Seite „RawData“ deine WR Werte finden.
Zb. dein WR zeigt dir einen Gesamtertrag von zb. 800kwh an, i.d.r. sind diese werte immer mal 0.1 zu nehmen, also suchst du den Wert 8000. Das wäre der HexString 0x1F 0x40. (https://bin-dez-hex-umrechner.de/)
Diesen Wert musst du jetzt im HexString finden.
Du musst damit jetzt systematisch vorgehen.

Hilfe bietet dir auch die Wikiseite an:
adding new inverters or items · tobiasfaust/SolaxModbusGateway Wiki (github.com)

Hallo Tobias,

danke für die Antwort. Irgendwie glaube ich, dass ich noch irgendwo ein anderes Problem habe. SolaX soll baugleich sein, selbst die Komponenten von SolaX passen zu dem System.
Ich bekomme nur Werte unter „RawData of Live-Data“ in „RawData of ID-Data“ wird nichts angezeigt. Ist das normal?
Eine ganze Menge Werte wie z.b. die Batteriekapazität, und L1 bis 3 Voltage sind korrekt. Wenn das Protokoll anders wäre, wäre das ein großer Zufall.

Die Verkabelung selbst habe ich bereist geprüft, dass scheint mir alles richtig zu sein.
Leider finde ich im Raw Datenstring auch nur die Werte, die sowieso schon richtig ermittelt werden, die anderen, tauchen da gar nicht erst auf. (ziemlich viel steht auf 0x00)
Noch irgend einen Tipp für mich?

Danke
Gruß
Steffen

Hallo Tobias,

ich hab’ s gefunden, in der register.h war ein Fehler in der Solax X3 konfig. Da fehlt ein [ vor der Data Sektion.

Ich hätte da noch 3 Fragen. Dann würde ich die Anpassungen für Q-Cell und SolaX X3 anpassen und dir zum aktualisieren bereitstellen.

  1. Kannst du mir bitte exemplarisch mal die Position dieses Register nennen.
    Register: 0x0082~0x0083
    Beschreibung: FeedinPower_Rphase(X3)
    R/W: R
    Bemerkung: FeedinPower_Rphase (meter/CT) (082:LSB,0x83:MSB)
    Einheit: 1W
    Datengröße: int32
    Länge: 2
    Zudem: was hat es mit (082:LSB,0x83:MSB) auf sich?

  2. Ein Beispiel für die Adressierung hier wäre noch sehr hilfreich. Ich komme einfach nicht drauf.
    [„#ClientID“, „0x04“, „0x00“, „0x00“, „0x00“, „0x77“],
    [„#ClientID“, „0x04“, „0x00“, „0x78“, „0x00“, „0x77“]
    Frage: wie komme ich in Bereiche größer 1000 und kann ich hier x beliebige weitere Bereiche anfügen (250 Adressen max. ist klar)

  3. Kann ich per MQQT auch Daten schreiben? Wenn ja, hättest du ein Beispiel?

Danke für deine Unterstützung.

Gruß
Steffen

Hallo @Maeffjus ,

Du hattest in diesen Thread geschrieben - „ich mache das nur zyklisch mittels Skript!“ - hast Du funktionierende Best Practise Werte die Du empfehlen kannst? bzw. wenn ja, für welche der Werte die Du abfragst per Skript in welcher Frequenz?. Was sind denn die minimalen, sinnvollen Werte die einem für den Start helfen? Wie aktualisiere ich den eine MoBus Instanz per Skript?

Danke Dir!

Grüße,

Siehe Dokumentation:

Michael

Hallo MaLu,

die Werte nehme ich 1x pro Minute:

Diese alle 15s:

Hallo @Maeffjus ,

Vielen Dank für die Infos.

Das meint also für mich - ModBus Gerät installieren, Modus Instanzen einrichten - Pro Wert eine, aus Solax WR Sicht - die Hex in Dezimal Werte umrechnen und einrichten.

Soweit die Theorie - wo ich noch ein bisschen hänge - die Werte die aus z.B. mehreren Adressen bestehen - wie sind diese zu behandeln? Habe mal versucht Deine Werte (die ich Total sinnig finde) im Dokument zu finden - einige sind klar (Temp oder so) aber manche finde ich nicht wirklich (oder mehrfach) basierend auf Deinen Texten.

Danke und Grüße,
MaLu