Serial port Datensätze verarbeiten

Hallo RWN, ich habe mir Dein Script noch mal angesehen.
So wie ich das verstehe, so als Anfänger, machst Du da folgendes:

if(strlen($IPS_VALUE) >= 128)  // warten bis 128 Zeichen angekommen sind
    {
        $data = str_split($IPS_VALUE, 16);  // die 128 Zeichen in Blöcke zu 16 Zeichen teilen
        for ($i = 0; $i < count($data); $i++)
       {
          if (strlen($data[$i]) == 16) 
          {
             $r = explode(" ", Str2Dec(str_replace(';', '', $data[$i]))); // die Daten in Dezimal umwandeln
           $value = array_sum($r);  // und hier,  die Werte addieren ????
             echo "empfangener Datensatz: ".Str2Dec(str_replace(';', '', $data[$i]))."als Ergebnis ".$value."
";
             SetValue($variablen[$i], $value);

ein Wert aus der RV z.B. 00 00 00 00 00 01 02 03
wird dadurch zu Ergebnis = 6 es sollte aber das Ergebnis = 123 errechnet werden.

wie muss ich dafür das Script ändern?

Ich habe ja nur am Rande mitgelesen aber mich verwirrt das Geschriebene auch etwas. Die Kernfrage wird wohl sein, was für ein Zahlensystem empfängst Du überhaupt und es schaut so aus, als ob Dir das selbst nicht klar ist.

00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 02 3B entspr. 2
00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 04 3B entspr. 4
00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 08 3B entspr. 8
00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 0A 3B 06 3B entspr. 16

hier ist es mal Hexadezimal

und dann wieder Dezimal

ein Wert aus der RV z.B. 00 00 00 00 00 01 02 03
wird dadurch zu Ergebnis = 6 es sollte aber das Ergebnis = 123 errechnet werden.

Wenn das nun das letzte richtige Ergebnis ist und es ist Dezimal, dann mußt Du doch nur den Stellenwert festlegen. Also für Dein Beispiel mathematisch ausgedrückt 1 x 10^2 + 2 * 10^1 + 3 * 10^0 = 123.

Aber dazu kannst Du Dir auch die Dezimalumrechnung für den Schluß aufheben und mit Hex oder Binär oder egal was rechnen. Zahlensysteme sind ja beliebig konvertierbar Also bei hex dann entsprechend a x 16^2 + b * 16^1 + c * 16^0 oder bei binär a x 2^2 + b * 2^1 + c * 2^0 usw.

genau, das ist das Problem.

im Log kommt an:
empfangener Datensatz: 00 00 00 00 08 05 05 09 (echo aus dem script in hexadezimal)

als Ergebnis 27 (echo aus dem Script in dezimal)

((im Script werden also 9+5+5+8 gerechnet = 27))

im script müsste die letzte Stelle des Datensatzes mit 1, die vorletzte mit 10, die vorvorletzte mit 100 usw multipliziert werden und dann zum Ergebnis aufaddiert werden.

nur, wie mache ich das in dem Script?

mit der Hilfe eines Freundes sieht das Script nun so aus, und, es läuft…

vielen Dank estmal an alle die mitgeholfen haben!!! :slight_smile:

<?
$variablen = array
(15211 , 11106 , 29080 , 44612 , 48494 , 58101 , 46312 , 31901); // IDs der Variablen eintragen.


if ($IPS_SENDER == "RegisterVariable")
{
    if(strlen($IPS_VALUE) >= 160)
    {
        $data = str_split($IPS_VALUE, 20);
        for ($i = 0; $i < count($data); $i++)
       {
          if (strlen($data[$i]) == 20)

               {
             $r = explode(" ", Str2Dec(str_replace(';', '', $data[$i])));

             for ($j=0; $j<10; $j++)
	    {
	      $r[$j] = $r[$j] * pow(10,9-$j);
	    }

	     $value = array_sum($r);
             echo "empfangener Datensatz: ".Str2Dec(str_replace(';', '', $data[$i]))."als Ergebnis ".$value."
";
             SetValue($variablen[$i], $value);
          }
       }
    }
}

function Str2Dec($daten)
{
    $Dec = "";
   for($i=0; $i<strlen($daten); $i++)
   $Dec .= sprintf("%02d ", ord($daten[$i]));
   return $Dec;
}

?>

(( zu all den vorherigen Fragen und Angaben, die Datenblock Länge hat sich auf 160 Zeichen erhöht))