Modbus Variablen umrechnen

Hallo zusammen,

das Auslesen meines GoodWe WR via Modbus LAN-Gateway klappt mittlerweile gut, jedoch habe ich noch Wissenslücken, von denen ich hoffe, dass ich sie noch schliessen kann:

Ein Datum steht in drei eigenen 16bit Registern von denen jeweils ein Wert im HByte des Register steht, der zweite Wert im LByte des Registers (z.B. Jahr im HByte und Monat im LByte, jeweils zweistellig). Wie kann ich das auseinander werkeln?

Ähnliche Frage: In einem 32Bit-Register habe ich vier unterschiedliche Zustände, jedes Byte hat seinen eigenen Wert. Wie bekomme ich die Werte in einzelne IPS-Variablen?

Und zu guter Letzt habe ich noch STR-Variablen von unterschiedlicher Länge, wo kann ich innerhalb von IPS die entspr. Länge mitgeben?

Danke.

Erstmal auf dem alten (weitehrin funktionsfähigem) Weg, den neuen mit einem Modbus-Gerät kann vielleicht jemand anderes erklären.

Zwei Register = zwei Modbus-Instanzen.
Jeweils entsprechend 16bit auswählen. Prüfen ob die Daten korrekt ankommen.
Ein Script anlegen welches mit GetValue die beiden Werte in PHP-Variablen lädt. Mit simplen BitOperationen die Daten zurecht schieben.
Die PHP-Variablen jeweils ausgeben und prüfen, ob das etwa passen könnte.

Vier IP-Symcon Variablen (vmtl. Integer) anlegen und die eben ausgelesenen Werte in die Symcon Variable schreiben.

Pseudoscript:

$register1 = GetValue(12345);  // 'Wert' Variable von Modbus-Instanz 1
$register2 = GetValue(12346);  // 'Wert' Variable von Modbus-Instanz 2

$value1 = $register1 >> 8;
$value2 = $register1 & 0x00ff;
$value3 = $register2 >>8;
$value1 = $register2 & 0x00ff;

echo "\nWert 1: ".$value1;
echo "\nWert 2: ".$value2;
echo "\nWert 3: ".$value3;
echo "\nWert 5: ".$value4;

SetValue(54321, $value1);
[...]
SetValue(54318, $value4);

Danke für die rasche Antwort,

Da auch bei den „Modbus-Geräten“ IPS -Variablen erzeugt werden, kann man auch diese Variablen für die Berechnung heranziehen.

Die Werte für die ersten zwei Register sind noch nicht ganz nachvollziehbar, da aber der Wert für „Sekunde“ richtig hochzählt und dann nach 60 auch wieder 1 kommt und der Wert für „Minute“ sich um 1 erhöht, scheint die Vorgehensweise richtig zu sein.

Nochmals Danke.

An zwei Stellen gab es noch Flüchtigkeitsfehler wegen copy&paste, vielleicht hat @Geraldo die schon selbst korrigiert.

$register1 = GetValue(12345);  // 'Wert' Variable von Modbus-Instanz 1
$register2 = GetValue(12346);  // 'Wert' Variable von Modbus-Instanz 2

$value1 = $register1 >> 8;
$value2 = $register1 & 0x00ff;
$value3 = $register2 >>8;
$value4 = $register2 & 0x00ff;

echo "\nWert 1: ".$value1;
echo "\nWert 2: ".$value2;
echo "\nWert 3: ".$value3;
echo "\nWert 4: ".$value4;

SetValue(54321, $value1);
[...]
SetValue(54318, $value4);

Bei den neuen Modbus Geräten kannst du die virtuellen Adressen nutzen. Dort kannst du dann die Formeln hinterlegen und auch passend exportieren als Vorlage.

paresy

Danke, bin schon am basteln.

Kannst Du noch was zu der o.g. Frage zum Thema STR-Variable und deren Länge sagen?
Bei mir kommen alle Variablen an, bis auf eben die STR’s.
Kann natürlich sein, dass da auch auf Seiten GoodWe was falsch läuft.

Geraldo

Apropos, wann ist das Problem gelöst, dass sich die virtuellen Adressen/Variabeln nicht nutzen lassen in Kombination von Blockweise lesen? Solange das nicht gefixt ist, kann ich diese leider nicht nutzen…

1 „Gefällt mir“