Problem nach update auf 2.2

Nachdem ich mein IPS von 2.1 auf 2.2 upgedated habe, läuft es nicht mehr so wie früher.
Nach längerer Suche wo das Problem liegt habe ich nun den Codeteil herausgefunden der nicht mehr richtig funktioniert. Leider ist es mir unerklärlich warum.
Dieser Code liest aus deinem XML File bestimmte Werte aus, fügt sie einer Variablen hinzu und schickt diese Daten an das COM Port. Seit dem Update bekomme ich aber nur noch Nullen über das Comport.
Vermutlich macht diese Zeile das Problem

$TempDaten .= chr(MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0)) . chr($HighByte) . chr(MonitorXMLAuslesen(2, $RealBlockNameArray[$i],0,0)); 

Ich bekomme aber mit print die richtigen Werte zurück

print MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0) . $HighByte . MonitorXMLAuslesen(2, $RealBlockNameArray[$i],0,0);

Gibts es mit der chr Umwandlung in der neuen Version ein Problem, oder sieht jemand woanders einen Fehler?

Die zwei Funktionen:

 function Datenanfordern_START($ID,$BlockID)
 {
 //Variable Deklatation
   global $ETA_MLP, $ETA_MLP_0, $ETA_MLP_1, $ETA_MLP_2, $ETA_MLP_3, $ETA_MLP_4, $ETA_MLP_5;
   global $ID, $Intervall,$HighByte,$Anzahl;
   $TempDaten = '';
   $TempPS = 0;
   $tempBlockName = "ETA_MLP_". $BlockID;
   $Anzahl = count($$tempBlockName);
   //Daten Bauen
   $Daten ="{MC";                  //Startzeichen und Servicekennung
   $Daten .= chr(1+($Anzahl*3));   //Anzahl der Nutzdatenbytes ( RefreshTime + Anzahl * 3 byte)
   $PS = $Intervall;
   $RealBlockNameArray = $$tempBlockName;

   for ($i=0; $i<$Anzahl; $i++)  
        {
        $TempDaten .= chr(MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0)) . chr($HighByte) . chr(MonitorXMLAuslesen(2, $RealBlockNameArray[$i],0,0)); 
        //Pruefsumme
        $TempPS = $TempPS +  MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0) + MonitorXMLAuslesen(2, $RealBlockNameArray[$i],0,0);
        }
      $PS = $PS + $TempPS;
      $PS = $PS%256; //Modulo 256

      $Daten .= chr($PS);
      $Daten .= chr($Intervall);
      $Daten .= $TempDaten;
      $Daten .= "}";
      ComPort_SendText($ID, $Daten);
 }
//Auslesen des MonitorXML Files
   function MonitorXMLAuslesen($SuchType, $ID, $Knoten, $LByte)
   {
    //SuchType
    // 1 = ID->Knoten
    // 2 = ID->Index(LByte)
    // 3 = Knoten und Index->Teiler
    // 4 = Knoten und Index->ID
    // 5 = Knoten und Index->Name
    // 6 = ID->Name
      $xml = simplexml_load_file('Monitorliste.xml');
      if ($SuchType == 1) {
         foreach ($xml->xpath('MonitorRow') as $Row) {
            If ($Row->ID == $ID) {
               return $Row->Knoten;
            }
         }
       } else if ($SuchType == 2) {
         foreach ($xml->xpath('MonitorRow') as $Row) {
            If ($Row->ID == $ID) {
               return $Row->LByte;
            }
         }
       } else if ($SuchType == 3) {
         foreach ($xml->xpath('MonitorRow') as $Row) {
            If ($Row->Knoten == $Knoten and $Row->LByte == $LByte) {
               return $Row->Teiler;
            }
         }
       } else if ($SuchType == 4) {
         foreach ($xml->xpath('MonitorRow') as $Row) {
            If ($Row->Knoten == $Knoten and $Row->LByte == $LByte) {
               return $Row->ID;
            }
         }
       } else if ($SuchType == 5) {
         foreach ($xml->xpath('MonitorRow') as $Row) {
            If ($Row->Knoten == $Knoten and $Row->LByte == $LByte) {
               return $Row->Name;
            }
         }
       } else if ($SuchType == 6) {
         foreach ($xml->xpath('MonitorRow') as $Row) {
            If ($Row->ID == $ID) {
               return $Row->Name;
            }
         }
      }
   }

Daten über die COM vor dem Update auf 2.2:

Request: 05.04.2010 12:01:19.99164 (+0.8594 seconds)

 7B 4D 45 00 00 7D 7B 4D 43 0A 51 C8 21 00 03 21   {ME..}{MC.QÈ!..!
 00 04 21 00 1F 7D                                 ..!..}          

Answer: 05.04.2010 12:02:19.86664 (+0.0313 seconds)

 7B 4D 44 0F 18 21 00 03 00 CB 21 00 04 00 E4 21   {MD..!...Ë!...ä!
 00 1F 00 E0 7D                                    ...à}

Daten über die COM nach dem Update auf 2.2 (gleicher Code):

Request: 05.04.2010 11:53:40.58264

 7B 4D 43 0A 51 C8 00 00 00 00 00 00 00 00 00 7D   {MC.QÈ.........}

Answer: 05.04.2010 11:53:43.67564 (+3.0938 seconds)

 7B 53 45 17 47 53 79 73 74 65 6D 20 45 72 72 6F   {SE.GSystem Erro
 72 20 4E 72 2E 3A 30 78 38 46 20 0A 7D 7B 4D 44   r Nr.:0x8F .}{MD
 05 00 00 00 00 00 00 7D                           .......}

warum hast Du teilweise vor Variablen 2 $$.

Gute Frage, hab das Script vor langer langer Zeit mal geschrieben… mal nachlesen ob das für irgendwas gut war…

Edit:
Weiß schon wieder, damit kannst du den Inhalt einer Variable als Variable verwenden :slight_smile: Kompliziert?

Das sind dann variable Variablen.
z.B.


$varname = 'test';
$test = 'Hallo';
echo $$varname; // Ausgabe: Hallo

Was sagt ihr dazu, hab mal diesen Code dazwischen eingefügt:

  
...
   $RealBlockNameArray = $$tempBlockName;

        $TempCharVar = '';
        $TempCharVar1 = '';
        $TempCharVar = 33;
        $TempCharVar1 = chr(33);
		  print $TempCharVar."<BR/>";
		  print $TempCharVar1."<BR/>";
		  print ord($TempCharVar1)."<BR/>";
		  print "------------------"."<BR/>";

   for ($i=0; $i<$Anzahl; $i++)   //Die n Anzahl Parameter
        {
        
        //Test
        
			$TempDaten1 = MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0);
			$TempDaten2 = $HighByte;
			$TempDaten3 = MonitorXMLAuslesen(2, $RealBlockNameArray[$i],0,0);
			print "Vor chr: ".$TempDaten1."/".$TempDaten2."/".$TempDaten3."/"."<BR/>";
			$TempDaten1chr = chr($TempDaten1);
			$TempDaten2chr = chr($TempDaten2);
			$TempDaten3chr = chr($TempDaten3);
			print "Vor dem zusammenbauen 1: ".ord($TempDaten1chr)."<BR/>";
			print "Vor dem zusammenbauen 2: ".ord($TempDaten2chr)."<BR/>";
			print "Vor dem zusammenbauen 3: ".ord($TempDaten3chr)."<BR/>";
			$TempDaten = chr($TempDaten1).chr($TempDaten2).chr($TempDaten3);
			print "Nach chr: ".ord($TempDaten)."<BR/>";


			$TempDaten .= chr(MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0)) . chr($HighByte) . chr(MonitorXMLAuslesen(2, $RealBlockNameArray[$i],0,0));

...

und bekomme diese Ausgabe:

33
!
33

Vor chr: 33/0/3/
Vor dem zusammenbauen 1: 0
Vor dem zusammenbauen 2: 0
Vor dem zusammenbauen 3: 0
Nach chr: 0
Vor chr: 33/0/4/
Vor dem zusammenbauen 1: 0
Vor dem zusammenbauen 2: 0
Vor dem zusammenbauen 3: 0
Nach chr: 0
Vor chr: 33/0/31/
Vor dem zusammenbauen 1: 0
Vor dem zusammenbauen 2: 0
Vor dem zusammenbauen 3: 0
Nach chr: 0

Kann mir bitte ein Programmierer erklären was ich da falsch mache, bzw. verstehe. Warum bekomme ich da immer Nullen zurück?

Danke

Der gleiche Code gibt unter IPS 2.1 folgendes aus:

33
!
33

Vor chr: 33/0/3/
Vor dem zusammenbauen 1: 33
Vor dem zusammenbauen 2: 0
Vor dem zusammenbauen 3: 3
Nach chr: 33
Test2: 33
Vor chr: 33/0/4/
Vor dem zusammenbauen 1: 33
Vor dem zusammenbauen 2: 0
Vor dem zusammenbauen 3: 4
Nach chr: 33
Test2: 33
Vor chr: 33/0/31/
Vor dem zusammenbauen 1: 33
Vor dem zusammenbauen 2: 0
Vor dem zusammenbauen 3: 31
Nach chr: 33
Test2: 33

probiere mal bitte:


echo $TempDaten1chr = chr((int)$TempDaten1);
echo $TempDaten2chr = chr((int)$TempDaten2);
echo $TempDaten3chr = chr((int)$TempDaten3); 

Ich baue morgen einmal ein Script zusammen, das dann alle testen können. Heute habe ich leider keine Zeit mehr…immer diese Frauen :wink:

@Thomas, zum Schluß ist deine Ausgabe

IPS 2.1:

33
!
33

Vor chr: 33/0/3/
Vor dem zusammenbauen 1: 33
Vor dem zusammenbauen 2: 0
Vor dem zusammenbauen 3: 3
Nach chr: 33
-------------Thomas---------------
!

IPS 2.2:

33
!
33

Vor chr: 33/0/3/
Vor dem zusammenbauen 1: 0
Vor dem zusammenbauen 2: 0
Vor dem zusammenbauen 3: 0
Nach chr: 0
-------------Thomas---------------
!

Wie versprochen mein Script zum Testen


<?
 function Datenanfordern_START($BlockID)
 {
   global $ETA_MLP, $ETA_MLP_0, $ETA_MLP_1, $ETA_MLP_2, $ETA_MLP_3, $ETA_MLP_4, $ETA_MLP_5;
   global $HighByte,$Anzahl;
	$HighByte = 0;
   $ETA_MLP_0 = array(115,91);
   $testXML = '';
   $TempDaten = '';
   $tempBlockName = "ETA_MLP_". $BlockID;
   $Anzahl = count($$tempBlockName);
   $RealBlockNameArray = $$tempBlockName;
   for ($i=0; $i<$Anzahl; $i++)
        {
        	print "XMLAuslesen1 ohne chr: ".MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0)."<BR/>";
        	print "XMLAuslesen2 ohne chr: ".MonitorXMLAuslesen(2, $RealBlockNameArray[$i],0,0)."<BR/>";
			$testXML = chr(MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0));
			print "XMLAuslesen1 nach chr->ord: ".ord($testXML)."<BR/>";
        }
 }

   function MonitorXMLAuslesen($SuchType, $ID, $Knoten, $LByte)
   {
      $xml = simplexml_load_file('Monitorliste.xml');
      if ($SuchType == 1) {
         foreach ($xml->xpath('MonitorRow') as $Row) {
            If ($Row->ID == $ID) {
               return $Row->Knoten;
            }
         }
       } else if ($SuchType == 2) {
         foreach ($xml->xpath('MonitorRow') as $Row) {
            If ($Row->ID == $ID) {
               return $Row->LByte;
            }
         }
      }
   }
   
  Datenanfordern_START(0);
?>

Das passende XML File unter den Ordner Scripts ablegen (Monitorliste.xml):


<?xml version="1.0" standalone="yes"?>
<MonitorTable>
<MonitorRow><ID>91</ID><Knoten>8</Knoten><HByte>0</HByte><LByte>71</LByte><Unknown9>2</Unknown9><Unknown10>20</Unknown10><Unknown11>0</Unknown11><Unknown12>0</Unknown12><Teiler>1</Teiler><IndexEbene>0</IndexEbene><Name>BOILER</Name></MonitorRow>
<MonitorRow><ID>115</ID><Knoten>33</Knoten><HByte>0</HByte><LByte>66</LByte><Unknown9>2</Unknown9><Unknown10>20</Unknown10><Unknown11>0</Unknown11><Unknown12>0</Unknown12><Teiler>1</Teiler><IndexEbene>0</IndexEbene><Name>MK_3</Name></MonitorRow>
</MonitorTable>

Meine Ausgaben:

IPS Version 2.2:

XMLAuslesen1 ohne chr: 33
XMLAuslesen2 ohne chr: 66
XMLAuslesen1 nach chr->ord: 0
XMLAuslesen1 ohne chr: 8
XMLAuslesen2 ohne chr: 71
XMLAuslesen1 nach chr->ord: 0

IPS Version 2.1:

XMLAuslesen1 ohne chr: 33
XMLAuslesen2 ohne chr: 66
XMLAuslesen1 nach chr->ord: 33
XMLAuslesen1 ohne chr: 8
XMLAuslesen2 ohne chr: 71
XMLAuslesen1 nach chr->ord: 8

Kann das jemand nachstellen?

Hallo,
kann das Verhalten von der IPS2.2 bestätigen, kannst Du aber leicht mit einen b[/b] beheben

$testXML = chr((int) MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0));

… aber irgendwie verstehe ich deinen Code nicht, warum du zuerst mit „CHR“ wandelt und dann wieder mit „ORD“ zurück ==> ergibt ja am Schluss wieder das selbe ???

tgusi74

Für mich stellt sich die Frage warum der gleiche Code zw. der 2.1er und 2.2er Version ein anderes Ergebnis anzeigt? Gibts dazu eine Erklärung?

Das die Umwandlung mit ORD keinen Sinn ergibt is klar, war ja auch nur zum testen bzw. zum Anzeigen. Wenn du meinen ersten Beitrag gelsen hast siehst du das ich die Daten zur COM schicke und dort benötige ich nur die chr Daten.

Hallo,
ich vermute mal das liegt an den unterschiedlichen PHP-Versionen

IPS2.1 ==> PHP 5.1.6
IPS2.2 ==> PHP 5.3.1

… auf jeden Fall kommt es bei deinen Projekt zu ein „Fehler/Bug“ den einfach „CHR“ nicht verträgt und liefert somit ein 0x00 zurück (alle anderen Funktion haben kein Problem mit den Rohdaten), sobald man aber eine Konvertierung (eine der ausgeblendeten Zeilen) durchführt ist alles wieder in Ordnung

	
$test = MonitorXMLAuslesen(1, $RealBlockNameArray[$i],0,0);
//$test = iconv("UTF-8","ISO-8859-1",$test);
//$test = utf8_encode($test);
//$test = (int) $test;
				
echo "Rohdaten       = '" . $test                    . "'
";
echo "UTF8_ENCODE    = '" . utf8_encode($test)       . "'
";
echo "CHR            = '" . chr($test)               . "'
";
echo "HEXDEC         = '" . hexdec($test)            . "'
";
echo "DECHEX         = '" . dechex($test)            . "'
";
echo "ORD + CHR      = '" . ord(chr($test))          . "'
";
echo "base_convert   = '" . base_convert($test,10,2) . "'
";
echo "DECBIN         = '" . decbin($test)            . "'
";

Man müsste sich vermutlich mit den ENCODING im XML-File bzw. beim Decodieren mit SIMPLE_XML spielen, irgendwo ist hier eine Vermischung der Formate

tgusi74

Mit (int) hats dann funktioniert, danke für die Hilfe!