Modbus RTU High & Low-Byte in Wechselrichter schreiben geht nicht

Hallo Zusammen,

ich ringe gerade mit Modbus. Das Thema ist immer noch: Daten zu meinem Solar-Wechselrichter schreiben. Es geht konkret um das:

Ich würde gerne per IPS den Minimum State of Charge festlegen können. Und zwar so, dass ich bei gemeldeten schlechtem Wetter den Min_SOC am Abend eher hochsetze (Notstrom vorhalten) und bei gutem Wetter herabsetzen (wird am Morgen ja in jedem Fall geladen).

Ich kann auch mit der Adresse Hex 0x0093 = Dezimal 147 den aktuellen Wert = 20% auslesen.
So ist das konfiguriert:

Wenn ich aber dann mittels ModBus_WriteRegisterByte versuche einen Wert zu schreiben, dann kommt einfach nichts dabei raus, bzw. eine Fehlermedlung.

Ich habe hier im Forum schon mit High & Low geschaut, aber ich komme da nicht ganz mit.
Ist das so, dass High & Low-Byte eine Speicheradresse belegen? Also nicht nur 20% geschrieben wird, sondern sowas wie „120“ oder „020“ (je nachdem was mit dem Low-Byte ist)?

Wenn ja, wie kann ich das denn auseinanderklamüsern und die 20%, 10% oder was auch immer vernünftig schreiben?

Ich habe nicht den Hauch einer Idee und bin mit dem Messer zur Schießerei gekommen :smiley:

Gruß,
Maeffjus

PS: Das habe ich gefunden, komme ich aber in Sachen verstehen nicht weiter - also hilft mir nix.
Siehe: Auswerten von Low- und High-Byte eines Word

Ich habe noch etwas „geforscht“, ich habe nun soweit verstanden, dass man z.B. für den Min_Soc auf 20% zu setzen und Grid-Charge abzuschalten 14 00 senden müsste. Das bedeutet dann 14 (Hex) = 20 (dec) und 00 = disabled.

Aber wie geht das mit dem Modbus-Modul von IPS?

Beispiel von mir, um die LED Helligkeit vom GO-E zu andern per Aktion Skript :

<?php
if($_IPS["SENDER"] == "WebFront")
{ModBus_WriteRegister(14677,$_IPS["VALUE"]);

}
1 „Gefällt mir“

Das Problem ist, sowie ich das sehe, sind auf der Adresse 147 zwei verschiedene Dinge zu finden:
Das eine ist min SoC, was der erste Teil des Bytes ist, der zweite Teil ist dann Night-Charge enabled oder disabled.

Ich muss also - wie oben beschrieben - den Hex-Wert 14 00 an das Gerät schicken, über Modbus. Dann habe ich High- und Low-Byte angesprochen. Da weiß ich nicht wie das gehen könnte.

1 „Gefällt mir“

In der Spalte steht ein „R“. Dies deutet i.d.R. darauf hin, dass man diesen Wert nur Lesen (=Read) kann, aber nicht beschreiben kann.

1 „Gefällt mir“

Wo kann man in die Doku schauen ?

1 „Gefällt mir“

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

@DerStandart : Es steht in der Spalte oben W/R - ich nehme evtl, dass es für Write / Read steht. Aaaaber - in allen Spalten steht nur R und im Changelog steht einiges von Write bzw. es gibt sogar nen Kommentar zum Register-schreiben. (Siehe Seite 5, unten)

Und den Wert kann ich am Display bzw. in der App problemlos ändern.

Richtig. Die Überschrift steht für Read/Write.

Das deutet für mich darauf hin, dass diese Werte per Modbus nur ausgelesen werden können.

Okay, aber wir reden hier ja von Modbus.

Also ich vermute, Du kannst da nichts per Modbus ändern.

Den habe ich gelesen. Der passt tatsächlich nicht dazu, dass überall nur R steht.

1 „Gefällt mir“

Ich denke, die Doku ist Mist. Schau mal durch.

1 „Gefällt mir“

Ich habe gerade ne Mail an Solax geschrieben. Schaun mer mal.

Allerdings besteht das Problem mit dem High- und Low- Byte doch trotzdem, wie soll ich das differenziert schreiben?

0x0093 würde ich mal als uint16 ansehen und das auslesen, danach mal versuchen daraus uint8 hi und low zu erzeugen.

1 „Gefällt mir“

Passt, kommt 2560 raus, was in Hex = 0A00 ist, also 0A und 00, also 10 (%) und Disabled.
Passt alles. Aber schreiben als Word - 3840, was 0F00, also 15 und 00 entspricht geht nicht. Schauen wir mal was Solax zu sagen hat!

Danke für den Tip!

Da habe ich jetzt keine Erfahrung, ob der Wert jetzt überhaupt geschreiben werden kann. Das geht aus der Doku nicht hervor. Lese aber noch…

Würde sagen, 0093 ist nur R lt. Doku. Bin gespannt was die dir sagen.

1 „Gefällt mir“

@DerStandart
@tomgr

Solax hat geantwortet! Das Schreiben ist nicht möglich. Es gibt ein Dokument in welchem beschrieben wird wie es geht - aber, dass kann ich Euch dann leider nicht mehr mitteilen.
Ich bekomme das Dokument, muss aber ein NDA unterzeichnen.
Ich vermute, dass mir das NDA verbietet euch Details mitzuteilen.

Falls aber was dazu erlaubt ist, melde ich mich gerne!

Danke schonmal & Gruß!

ModBus kann leider nur ganze Register (=Words) schreiben. D.h. du müsstest in IP-Symcon Word als Typ einstellen und das High/Low-Byte selber korrekt zusammenbauen.

paresy

1 „Gefällt mir“

Also so wie in Post #12 - richtig? Ich glaube, dass ich das sogar eventuell gebacken bekomme :smiley:

So - kurzes Update:

Nachdem ich ein NDA mit Solax unterschrieben habe, habe ich nun auch die passenden Adressen.
Lese- und Schreibadressen sind nämlich nicht gleich.
Wie die Adressen genau sind darf ich hier allerdings leider nicht sagen.
Kurzum: Schreiben geht - für den Min_SoC wird sogar uint(16) geschrieben.

Danke an alle!
Gruß,
Maeffjus

Was musst man denn und an wen bei Solax schicken, damit man Einblick in die kompletten Modbusadressen bekommt.
Ich bekomme in den nächsten Tag auch noch einen Solax X1 mini und wollten den mit einem Modbus RTU>Lan Adapter auslesen und beschreiben.
Gerne auch per PN.

Viele Grüße,
Doc

Ich habe nun auch einen Solax X1 Mini über einen Rs485 > LAN Adapter an IPS dran.

Welche Modbusadressen zum lesen sind denn für die aktuelle Leistung und den Gesamtzähler vorgesehen.
Hatte hier die Adresse 2 als Input Register auslesen (04) für die aktuelle Leistung gefunden, aber das kann doch nicht richtig sein?

Sehe zwar, das IPS etwas sendet aber es kommt keine Antwort.
Muss man bei diesen Solax WR wie bei Fronius Modbus von freischalten?

Danke u. viele Grüße,
Doc

Freischalten musste ich nix. Geht dein RS485-Adapter denn?
Hier nochmal das gleiche wie in meiner Nachricht, damit andere auch was davon haben:
SOLAR ENERGY TOTAL:

Aktuelle Leistung musst Du selbst berechnen, ich mache das mittels folgendem:

$batterie=GetValueInteger(57811);
$PV1=GetValueInteger(35723);
$PV2=GetValueInteger(41880);
$PV=$PV1+$PV2;
$netz=GetValueInteger(37533);

$verbrauch= $PV-$netz-$batterie;

SetValueInteger(10348,$verbrauch);

GRID-POWER (im Script = $netz) ist zB das hier:

Übrigens, nicht wundern - die Werte stehen alle auf 0ms, da ich das Abrufen zentral durch zwei Scripte steuere. Einmal Werte mit vielen Daten (aktuelle Leistung usw., alle 15s) und langsamer mit wenigen Daten (Zähler usw alle 60s).

Nur nochmals als Tip, vielleicht scheitert es ja da: Du musst die Adresse von Hex (Solax-Dokument) nach Dezimal umrechnen bevor du die einträgst.

Gruß,
Maeffjus