Modbus Bitregister Waveshare, Sugar Valley / Infinity Elektrolyse Poolsteuerung

Hallo, ich bin Anfänger in Sachen Modbus und noch wirklich weit drin in IP-Symcon.
Ich habe das Waveshare Modbus Gateway an meine Elektrolyse vom Pool angeschlossen.
Hier handelt es sich um eine Infinity Hydrolife, baugleich mit Sugar Valley und viele anderen.
Die ersten Register konnte ich schon auslesen und zuordnen (lesend).

Jetzt möchte ich z.B. den Status der Register 0x010E (270) auslesen und als Statusled visualisieren.
Das sind ja eigentlich alles 1bit Werte. Wie muss ich hier vorgehen ? Mas bedeutet hier das Mask in der zweiten Spalte ?

image

Danke Jürgen

Ein Franke im Badischen Exil

Du nimmst das Byte und verundest es mit der Maske.

$byte = GetValue( MODBUS_WERT_ID );
$bit3 = $byte & 0x0008;
$bit8 = $byte & 0x0040;

Danke für deine Antwort, teilweise verstehe ich es. Weiß aber nicht wir ich hierbei weiter ansetzen kann bzw. wo ich jetzt einsteigen muss.

Kann mir noch jemand einen Tip geben wie ich hier weiterkomme ?

Danke :slight_smile:

Woran scheitert es denn? Hast du das Script mal ausgeführt? Liefert es die passenden Werte? Achtung: du kannst mit ECHO keinen boolean ausgeben. Dafür brauchst du var_dump.

Starten des Script dann über ‚bei Variablenänderung‘ der Modbus Variable, welche über den Timer in der Instanzkonfiguration (oder im Splitter, je nach Konzept) entsprechend abgefragt wird.

Das ist mein Problem, wie binde ich so ein Script ein, ist das in irgendeinem Tutorial ersichtlich ?




image

Ich vermute einmal das ist komplett falsch, ich habe noch nie etwas mit Scripte gemacht :shushing_face:

Na du hast erfolgreich an Script angelegt und mit Inhalt befüllt. Die Variablen-ID (32980) hast du leider im Objektbaum abgeschnitten, ob die Stimmt kann ich so nicht prüfen. Gehen wir mal davon aus, dass du die korrekte ID genommen hast.

Allerdings ist gleich in Zeile 1 ein Fehler. Es heißt

<?php
$byte = .....

Ich hatte das exemplarisch für BIT 3 und Bit8 gemacht. Die sind (Wert aktuell binär 00000001) aber beide auf 0. Daher solltest du auch noch bit0 auswerten.

$bit0 = $byte & 0x0001;
var_dump($bit0);

Wenn du jetzt erfolgreich den Wert siehst, kannst du an einer ANDEREN Stelle (also nicht unmittelbar unter der Instanz „Modbus-Gerät“) noch 8 boolean Variablen erzeugen und dann statt var_dump, SetValue verwenden.

PS: Da du hier die neue Modbus-Instanz verwendest, könnte man theoretisch auch innerhalb der Instanz die neuen Variablen anlegen und intern füllen. Das wird aber deutlich komplexer und würde ich hinten anstellen, bis du diese Variante verstanden hast.

Vielen Dank Tobias dann werde ich mal versuchen das hinzubekommen. :+1:

Der erste Schritt ist geschaft :sweat_smile:

Irgendwas stimmt da aber nicht. Eigentlich kann Bit1 nicht zwei sein. Kannst du bitte mal den Inhalt von $byte zeigen?

So sollte es jetzt gehen. Hab die Schreibweise mal etwas angepasst, sodass es vielleicht auch schneller ersichtlich wird.

<?php
$byte = GetValue( 24885);  //255;
$bit0 = ($byte &  1)  >>0; 
$bit1 = ($byte &  2)  >>1;
$bit2 = ($byte &  4)  >>2;
$bit3 = ($byte &  8)  >>3;
$bit4 = ($byte & 16)  >>4;
$bit5 = ($byte & 32)  >>5;
$bit6 = ($byte & 64)  >>6;
$bit7 = ($byte &128)  >>7;

echo "byte: ";var_dump($byte);
echo "bit0: ";var_dump($bit0);
echo "bit1: ";var_dump($bit1);
echo "bit2: ";var_dump($bit2);
echo "bit3: ";var_dump($bit3);
echo "bit4: ";var_dump($bit4);
echo "bit5: ";var_dump($bit5);
echo "bit6: ";var_dump($bit6);
echo "bit7: ";var_dump($bit7);

Vielen Dank Tobi für deine Unterstützung.
Es schaut so aus dass ich jetzt die Daten habe die ich benötige. Ob es der richtige Weg ist weiß ich nicht, aber zumindest habe ich jetzt für mich einen kleinen Einstieg.


![image|690x141]

$byte = GetValue( 24885); //255;

$bit0 = ($byte & 1) >>0;
$bit1 = ($byte & 2) >>1;
$bit2 = ($byte & 4) >>2;
$bit3 = ($byte & 8) >>3;
$bit4 = ($byte & 16) >>4;
$bit5 = ($byte & 32) >>5;
$bit6 = ($byte & 64) >>6;
$bit7 = ($byte &128) >>7;

echo "byte: ";var_dump($byte);
echo "bit0: ";var_dump($bit0);
echo "bit1: ";var_dump($bit1);
echo "bit2: ";var_dump($bit2);
echo "bit3: ";var_dump($bit3);
echo "bit4: ";var_dump($bit4);
echo "bit5: ";var_dump($bit5);
echo "bit6: ";var_dump($bit6);
echo "bit7: ";var_dump($bit7);

// Bitwerte in die Variable schreiben

SetValue(57581, $bit0);
SetValue(37517, $bit1);
SetValue(32195, $bit2);
SetValue(56104, $bit3);
SetValue(28755, $bit4);
SetValue(49338, $bit5);
SetValue(11960, $bit6);
SetValue(11184, $bit7);

//Skript hier einfügen

Danke :+1:

Du solltest dich nur entscheiden, ob du ‚Führe PHP Code aus‘ oder ‚Starte Script‘ nimmst und das andere entsprechend auch löschen. Zudem kann man das Script deutlich kompakter schreiben.

$byte = GetValue( 24885);
SetValue(57581, ($byte & 1) >>0);
SetValue(37517, ($byte & 2) >>1);
[...]
SetValue(xxx, ($byte & 128) >>7);