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“

@paresy ich bin mir nicht sicher, aber dieses Problem (Nutzung von virtuellen Adressen/Variabeln beim Blockweise lesen) wurde bisher noch nicht gelöst, richtig?
Und wie sieht es in der 7.2 aus? Du hast mal gemeint, dass hierzu grössere Anpassungen nötig seien… so wie ich das noch in Erinnerung habe.

Hi, ja - dafür müssen wir etwas mehr umbauen. Aber - immerhin habe ich eine Idee, wie wir es machen werden. Wir werden das „Blockweise lesen“ direkt in die ModBus Instanz ziehen (so wie wir es mit der Byte Order Option gemacht haben). Das hat den Vorteil, dass dieses Problem gelöst sein wird und, dass sich die blockweise optimierten Abfragen auch in die Vorlage speichern lassen können. Das ist insbesondere für die Abfrage von SunSpec Anlagen wichtig, um die sporadisch auftretenden Race Conditions zu lösen.

Zur 7.2 klappt es vermutlich nicht mehr. Aber danach. Frag aber gerne noch mal nach :slight_smile:

paresy

Alles klar. Danke für die Rückmeldung.

Schade zwar, dass sich dies länger hinzieht. Aber wenn dann alles auch gleich in den Instanzen direkt resp. in den Modbus-Vorlagen speicherbar wird (also auch das blockweise optimierte Lesen), dann warte ich „noch ein bisschen“ darauf …

Wie funktioniert das, wenn ich zwei Instanzen habe mit den Registern 1,4,6 für Instanz A und 2,3,5 für Instanz B.

Hintergrund: Ich habe viel Modbus mit Wago SPS und hier könnte ich mir eigene Instanzen je Raum vorstellen. Jetzt hat ‚jeder‘ Raum Rollläden Position (byte), Helligkeit (byte), Temperatur (real), Licht ein/aus (bit). Die Datenblöcke sind aber nach Typ in den SPS Registern sortiert.

Jetzt müsste eigentlich irgendein übergeordneter Mechanismus (z.B. der Splitter mit der Funktion ‚GetReadingRegistersFromChilds‘ das optimal zusammensetzen.

Das funktioniert so nicht mit den Vorlagen. Die sind immer statisch. Du könntest dir aber einen Konfigurator bauen, der die Vorlagen dynamisch nach deinen Wünschen generiert und dann in die Instanz „lädt“. Das wäre eine Idee um deinen Wunsch umzusetzen. Ist aber nicht wirklich für uns ein Use-Case, da dies schon extrem Anwendungsspezifisch ist.

paresy

Dann htte ich aber nur die EINE Instanz Wago-SPS und nicht mehr die Instanzen Raum A, Raum B, Raum C?

Bleibt denn die Möglichkeit, für die Build-In Instanzen einen gemeinsamen Block anzugeben (wie aktuell bereits im Splitter)?

Das werden wir nicht entfernen, da es für die alten Instanzen relevant ist. Aber vermutlich mit einem Hinweis verstehen, dass es über das ModBus Gerät wesentlich einfacher/besser ist.

Ne. Wenn du einen Konfigurator baust, kannst du so viele ModBus Geräte Instanzen erstellen wie du willst pro Raum. Und die dann automatisch konfigurieren lassen. Ist halt sehr spezifische Entwicklungdsarbeit.

paresy