Registervariable und Hex-Werte

Hallo Zusammen,

ich möchte Hexwerte aus einer Registervariablen verarbeiten
und dreh mich seit zwei Tagen nurnoch im Kreis und komm nicht weiter…

Folgendes möchte ich machen:
Ein paar Statuswerte aus einer Ledatronic (Abbrandsteuerung von Leda für einen Kamineinsatz) auslesen und visualisieren.

Die Verbindung über einen Client Socket steht und ich bekomme fleißig meine Werte (siehe Anhänge)
Die einfachen Statuswete wie „Betrieb“, „Tür offen“, usw. kann ich schon auslesen und verarbeiten.
Als Grundlage habe ich das Beispiel aus der Dokumentation genommen und für mich abgepasst.

Jetzt mein Problem:
Es gibt noch einen Temeraturwert und die Klappenstellung in %
Aus den Hexwerten von den Debuggern habe ich auch lokalisiert um welche es sich handelt, alles gut soweit :wink:
Aber ich kann sie nicht vernünftig verarbeiten, weil die Werte, die ich aus der Registervariablen lese keine Hex-werte sind sondern Text…??? Über Online-Hex De/Encoder passen die (Text)Zeichen auch alle, soweit also auch okay. Aber wie verarbeite ich diese weiter??

Hier ist mein Skript und im Anhang einige Screenshots…

Wäre Super, wenn mir jemand helfen könnte :slight_smile:

Vielen Dank schonmal im Voraus!

Gruß
David

<?php

// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable") {
    // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
    $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
    // neu empfangene Daten an $data anhängen
    $data .= $_IPS['VALUE'];
 
    // wenn $data mindestens 33 Zeichen lang ist
    if (strlen($data) >= 33) {
        // $data in Blöcke von einem Zeichen zerlegen
        $datasets = str_split($data, 1);
        // $data leeren
        $data = "";
 
        // alle Datensätze durcharbeiten
        for ($i = 0; $i < count($datasets); $i++) {
            // vollständige Datensätze (ein Zeichen lang) ausgeben
            if (strlen($datasets[$i]) == 1) {
              
              // Temperatur auslesen, Datensatz 3 - Datensatz-Nummerierung beginnt mit "0"!!!!!!!
                if ($i == 3) {
                    $hex_dec = hexdec($datasets[$i]);
                    var_dump ($hex_dec);        /* zum Anzeigen unter "Meldungen" */
                    var_dump ($datasets[$i]);   /* zum Anzeigen unter "Meldungen" */
                  
                    SetValue(41027, $hex_dec);
                }
                
                // - Platzhalter - Klappenstellung auslesen, Datensatz 4 - (Analog zu Temp. auslesen)

                
                // Status/Betriebsart auslesen, Datensatz 5
                if ($i == 5) {
                    if ($datasets[$i] == "\x00") {SetValue(34896, "Bereit");}
                    if ($datasets[$i] == "\x3E") {SetValue(34896, "Heizbetrieb");}
                    if ($datasets[$i] == "\x47") {SetValue(34896, "Anheizen");}
                    if ($datasets[$i] == "\x64") {SetValue(34896, "Tür offen");}
                    if ($datasets[$i] == "\x46") {SetValue(34896, "Heizfehler");}
                    if ($datasets[$i] == "\x01") {SetValue(34896, "Grundglut");}
                }

            } else {
                // Unvollständige Datensätze in $data schreiben
                $data = $datasets[$i];
            }
        }
    }
 
    // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
    RegVar_SetBuffer($_IPS['INSTANCE'], $data);

}


?>

Client Socket Konfi.JPG

Die Darstellung im Debug ist Hex, dennoch sind das nur Bytes.
Also einfach ord($data) und du hast den Wert des Bytes als Zahl.
Das Split auf $data kannst du auch weglassen.
Du kannst den String $data direkt wie ein Array benutzen.
Michael

Vielen Dank für die schnelle Antwort!!

Werde ich gleich mal testen :wink:

Ich habe das selbe Problem beim auslesen meines stromzählers (Das EHZ Modul legt leider dauernd neue Variablen an und liefert keine negativen werte).
Das Problem bei der Umwandlung scheinen die ascii steuerzeichen zu sein.
Mal ein Beispiel

<SOH><SOH><SOH>v<EOT><NUL><NUL>

solte in Hex

0x01 0x01 0x01 0x2F 0x04 0x01 0x01

ergeben
Die PHP funktionen scheinen jedes symbol einzelnd umzuwandeln.
Hat da mal jeman einen tip für mich?

mfg
KingPin

Du lässt dich ebenfalls von der Debug Ansicht ärgern :slight_smile: Wechsel die mal von Automatisch auf HEX. Dann passt alles :slight_smile:

paresy

Und wer gerne wissen möchte was nun <SOH> bedeutet oder warum da auch mal <EOT> steht

Ok habs nun hinbekommen lag an der Falschen schreibweiße von $_IPS[‚VALUE‘].
Gibt es eine möglich keit ein script das über eine Registervariable läuft einfacher zu debuggen?
Habe jetzt imme ine Varible erstellt und mit setValue beschrieben finde dies aber umständlicher wie ein echo oder var_dump.

Kannst auch Echo und var_dump benutzen.
Die Ausgabe ist dann im Logfile/Meldungsfenster.
Michael

Wo finde ich das in der Webconsole kenne das nur aus der Alten Windows consolen software.

Klick in der Konsole oben in der Leiste auf das +
Michael