Register Variable

Hi,

irgendwie ist das Verhalten komisch.

Ich bekomme folgende Hex Werte Seriell über einen Cutter und eine Register Variable.

Die Werte sehen wie folgt im Debug aus.

Seriell -> Cutter -> Register Variable -> Script
FD 03 40 BE -> 03 40 BE -> 03 40 BE

Im Logfile steht aber
24.01.2016 11:37:14*| Register Variable*| empfangener Datensatz: ýB¼

Mein Auswertungsscript:

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 16 Zeichen lang ist
    if (strlen($data) >= 6)
    {
        // $data in Blöcke von bis zu 16 Zeichen zerlegen
        $datasets = str_split($data, 6);
        // $data leeren
        $data = "";

        // alle Datensätze durcharbeiten
        for ($i = 0; $i < count($datasets); $i++)
        {
            // vollständige Datensätze (genau 16 Zeichen lang) ausgeben
            if (strlen($datasets[$i]) == 6)
            {
                echo "empfangener Datensatz: ".$datasets[$i]."
";
                
               
            }
            else
            {
                // Unvollständige Datensätze in $data schreiben
                $data = $datasets[$i];
            }
        }
    }

    // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
    echo $data;

}

Was läuft schief?

Nix. Alles korrekt.
Wenn du im Debug mal den Haken bei Hex rausnimmst, sieht das bestimmt so aus wie im Log :slight_smile:
Michael

Ich würde aber gerne im PHP die hex Werte weiter verarbeiten wie mache ich das dann?

Aber die hast du doch.
Oder möchtest du etwa einen String mir der hexadezimalen Darstellung deiner Daten verarbeiten ?
Ist aber Unfug, weil die Rohdaten zu verarbeiten ist in der Regel besser/einfacher.

Michael

Ja wie komme aber ich den die rohdaten? Ich muss die ersten 2 Hex Werte binär umwandeln oder dezimal

Moin, hatte auch das Problem mit Rohdaten von der USB-Schnittstelle und hab es wie folgt gewandelt:

function ResultToHexDisplay($Result)
    {
    $ResultConv = "";
    //$datalong   = (strlen($Result));
    for ($x = 0; $x < (strlen($Result)); $x++)
        {
        if (ord($Result[ $x ]) < 16) $ResultConv .= "0";
        $ResultConv .= strtoupper(dechex(ord($Result[ $x ])));
        } //$x = 0; $x < $datalong; $x++
    return $ResultConv;
    } //function ResultToHexDisplay( $Result )

Bin nicht der grosse Programmierer , geht sicher noch einfacher , aber bei mir funktioniert.

Bitte nutzt doch die PHP-Tags, das erleichtert das Lesen ungemein :slight_smile:

Um aus einem String einzelne Teile in eine Zahl zu ‚konvertieren‘ (es ist eher eine Typenwandlung), kann man einfach ord nutzen.
PHP: ord - Manual

$Data = "DE"; // Hier mal 'lesbare' Zeichen, damit es einfach verständlich ist
$Zeichen = $Data[0]; // Ein String kann wie ein Array genutzt werden um auf einzelne Zeichen zuzugreifen.
echo ord($Zeichen); // Gibt sie Zahl 68 aus.

Natürlich kannst du anstatt $Data[0] auch substr nutzen.

Wenn man jetzt zwei Zeichen als 16Bit Wert braucht, kann man unpack nutzen:
PHP: unpack - Manual

$Data = chr(0x44).chr(0x45); // = "DE" = 17477
$Word= unpack ("n",$Data[0].$Data[1]); // unpack nimmt hier zwei Zeichen und macht daraus ein Word (16Bit, 2 Byte)
var_dump($Word[1]); // Gibt die Zahl 17477 aus. Achtung, unpack gibt ein Array zurück!

Und für ord und unpack gibt es natürlich auch Umkehrfunktionen chr und pack.
Michael

Danke für die Hinweise.
Hatte es so verstanden, dass man aus :„ýB¼“ (Rohdaten)
ein hex-Ergebnis von „FD0342BC03“ erhält.

Man kann natürlich auch mit Strings arbeiten welche eine Hexadezimale Schreibweise der Daten darstellen.
Aber wie willst du zu einen String, welche z.B. „EF“ enthält mal eben +3 rechne :wink:
Oder eine Checksumme errechnen ? Du musst dann immer wieder hin und herwandeln.

Darum ist es häufig einfacher mit den eigentlichen Zahlenwerten zu arbeiten.
Ob da nun 0xFF oder 255 steht ist ja völlig egal, es ist beides eine Zahl.
Wobei „FF“ in einem String natürlich nicht eine Zahl ist, sondern die Zahlen der entsprechung des Buchstabens F hat.
Hier also ( 0x46, 0x46 oder dezimal 70, 70).
Michael

Also ganz Funktionieren tut es leider noch nicht.

Mein Code:

function ResultToHexDisplay($Result)
    {
    $ResultConv = "";
    //$datalong   = (strlen($Result));
    for ($x = 0; $x < (strlen($Result)); $x++)
        {
        if (ord($Result[ $x ]) < 16) $ResultConv .= "0";
        $ResultConv .= strtoupper(dechex(ord($Result[ $x ])));
        } //$x = 0; $x < $datalong; $x++
    return $ResultConv;
    } //function ResultToHexDisplay( $Result )
    
    
echo "Test1".ResultToHexDisplay($_IPS['VALUE']);
$Word= unpack ("n",$_IPS['VALUE']);
echo "Test2".var_dump($Word[1]);

Ergebniss im Debug der Register Variable 03 00 FE
und im Log:
Test10300FEint(768)
Test2:
empfangener Datensatz: FD0342BC0300

var_dump oder echo beides wird wohl nix :slight_smile:
Wie man an der falschen Ausgabe von Test1 sieht.

$Word= unpack ("n",$_IPS['VALUE']);
echo "Test2: ".$Word[1];  

sollte
Test2: 768 ergeben.
Michael

@ckerndl: kann dir leider nicht mehr folgen , es scheint sich um zwei verschieden Übertragungen zu handeln.
Lese doch nur einmal $_IPS[‚VALUE‘] in eine Variable ein und gebe diese Variable dann mit den beiden Funktionen aus.

@Nall chan: wie schon gesagt bin kein Programmierer oder Informatiker.
Wenn ich unbekannte Schnittstellen mit einem Logger analysier habe ich es gerne wenn ich die Daten in Hex dargestellt bekomme. Man sieht schnell gleiche Strukturen und bei mir ist gedanklich dann sofort „FF“ gleich 255 und nicht 127 , geschweige denn 70,70. Arbeitet die Schnittstelle teilweise mit Bytes setze ich die „FF“ gleich mit 15,15 . Stamme halt noch aus einer Generation wo Rechner noch in Maschinencode Bit für Bit programmiert wurden.

Hast natürlich recht mit 255 … irgendwie habe ich vorhin geschlafen :wink:
Ich arbeite ja auch häufig mit den Hex-Darstellungen im Code, gerade weil es entweder so dokumentiert ist oder wie du sagst das Debug es ja auch so darstellen kann.

Michael

Jetzt geht’s aber es währe schön wenn das logfile auch Hex darstellen würde und nicht Schmarn draus macht

Du verstehst es nicht :wink:
Das Log hat recht. Wenn du da die Rohdaten ausgibts, ist das schon korrekt so.
Michael

[emoji24] doch jetzt schon hätte es trotzdem gerne anders

Dann nimm für das Log doch einfach bin2hex.
Michael

Das war auch meine Lösung :slight_smile: Danke eich