Temperaturwerte aus einem Pelletkessel der FA. ETA auslesen

Hallo,

Du brauchst mit Sicherheit nicht alle, also legst Du nur die an, die Du benoetigst. Und das regelmaessige auslesen des „Inhaltsverzeichnisses“ bringt auch nichts, Du musst regelmaessig die variablen Daten auslesen, nur das macht ja Sinn. Den Rest macht dann IPS.

Du hast schon recht ein regelmäßiges auslesen macht keinen Sinn solange sich die Anlage nicht ändert. Ich möchte aber dass der Enduser in der Oberfläche das „Inhaltsverzeichnis“ hat und dort die abzufragenden Werte auswählen kann. Also ich lese einmal die möglichen Abfragewerte der Anlage aus und der User bekommt sie zur Auswahl (Visualisierung) und sagt dann, ich möchte z.B die Kessel Temp. und die Abgas Temp. angezeigt bekommen. Wie könnte ich so was bauen?

So, und für alle die wissen wollen wie das geht mit dem auslesen der Monitor Liste aus einer ETA Steuerung, anbei ein Aufzeichnung der com Überragung

Die genauen Bytes bring ich noch nach, welche ich halt schon weiss.

Hallo mistjo,

ich habe Deinen Anhang mal gesperrt. Ist denn der Inhalt wirklich veroeffentlichungsfaehig und vom Hersteller des Geraetes auch erlaubt? Nicht dass Du bzw. auch das Forum Schwierigkeiten bekommen…

Bitte mal Deine Stellungnahme dazu, dann schalten wir den Anhang wieder fuer alle frei.

Wie Steiner schon am Anfang geschrieben hat, sind die Protokoll Daten öffentlich. Dieses PDF ist nur ein Mitschnitt der übertragung zur ETA Steuerung. Ob das jetzt für euch ok, ist oder nicht kann ich nicht sagen.

Hallo,

oeffentlich ja, aber man soll jeweils anfragen, das heisst im Umkehrschluss, man moechte nicht, dass derartige Daten frei zum Download stehen.

Hallo mistljo,

ich habe dieses Problem zur Zeit wie folgt gelöst: Das komplette Script poste ich heute Abend mal.

   $Index = ord($COM_String{$i*5+1});
   $Wert = 256 * ord($COM_String{$i*5+2}) + ord($COM_String{$i*5+3});
   $IPSVar = "ETA.".$Index;   //Bezeichnung der IPS Variable
   .
   .
   .
   if(!IPS_VariableExists($IPSVar)) {    // wenn Variable fehlt: anlegen
      IPS_CreateVariable($IPSVar, "Float");
     }
    SetValueFloat($IPSVar, $Wert);   //A usgabe der Temperatur/Pelletsvorrat
    

Damit lege ich eine IPS Variable, mit z.b.dem Namen ETA.20 an(20 ist der Monitorlistenindex der Kesseltemperatur) und übergebe darin den Wert. Man könnte nach dem selben Schema sicherlich auch noch den Knoten mit einbauen.
Darf ich fragen welches Modell Du von ETA hast? Ich habe den PE15.

HTH
Attain

HI
Ich hab einen ETA SH-P mit TWIN 20/15 kW

Hast du schon mal geschaut was du alles auslesen kannst, da gibt es weit mehr als nur die Temperaturen. Man kann sogut wie alle Werte die auch auf der Display angezeit werden, auslesen. Und es stehen auch die Teiler (10, 100) und ein paar andere feine Sachen in der Monitor Liste. Leider bin ich in PHP nicht so gut, aber das wird schon. Muss mich erst mit der IPS Software vertraut machen.

Hi mistljo,

ich habe die Scripte im 1.Post angepasst und hoffe Du kannst damit was anfangen. Die Indexnummern beim SH sind etwas anders, aber ansonsten sollte es auch damit funktionieren.

Gruß

Leider nicht, da beim Twin unterschiedliche Indexe verwendet werden. Aber ich programmier schon an der Monitor Liste, schaut soweit schon ganz gut aus. Nur hab ich dabei leider timing probleme mit der com. Wie triggerst du das script bei empfang neuer daten, gibts da einen besseren Weg als im script ein „on change“ (com.port) event??? :confused:

Ich Programmier gerade an der Monitor Liste die ich später dann als XML abspeichern möchte. Hab dabei aber ein paar Probleme mit der Seriellen schnittstelle.
Anforderungs Script:


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : MonitorListe anfordern
Trigger  :
Interval :
*/
// Konfigurationsteil
$ID = 14223;  //Instances ID des COM-Ports

$MonitorListeStart ="{MA";
$MonitorListeStartBytes = chr(02) . chr(01) . chr(00) . chr(01);
$MonitorListeEndZeichen = "}";

//Zusammensetzen
$Daten = $MonitorListeStart . $MonitorListeStartBytes . $MonitorListeEndZeichen;
$MonitorListeStatus = false;
ComPort_SendText($ID, $Daten);

?>

Empfangscript (Teil):



..
..
if(substr($COM_String,0,2) == "Mb") {     // MonitorListe neue Zeile

      //Ende der MonitorListe wurde erreicht
      if(ord($COM_String{2}) == 0 AND ord($COM_String{3}) == 0) {

         $MonitorListeEnde = "{MO";
         $MonitorListeEndeBytes = chr(01) . chr(01);

         $MonitorListeEndZeichen = "}";

         //Zusammensetzen
         $Daten = $MonitorListeEnde . $MonitorListeEndeBytes . $MonitorListeEndZeichen;

         ComPort_SendText($ID, $Daten);
         SetValueString("COM.Port","");     //Eingangspuffer leeren
            
      }  else {
      
          //DatenPrüfsumme testen
         $NutzdatenAnzahl =  ord($COM_String{2});
         $EmpfangenePruefsumme = ord($COM_String{3});
         SetValueInteger ("Pruefsumme1" , $EmpfangenePruefsumme);
         // Summe der Nutzdaten
         for($i=4; $i <= $NutzdatenAnzahl+5; $i++) {
            $SummeDerNutzdaten = $SummeDerNutzdaten + ord($COM_String{$i});
         }

         $ErrechnetePruefsumme = $SummeDerNutzdaten%256;
         SetValueInteger ("Pruefsumme2" , $ErrechnetePruefsumme);
         SetValueInteger ("stringlaenge" , strlen($COM_String));
 
         if($EmpfangenePruefsumme == $ErrechnetePruefsumme) {

               //Weiteren Parameter holen.
          
               $MonitorListeWeiter ="{MA";
               $MonitorListeWeiterBytes = chr(02) . chr(02) . chr(01) . chr(01);

               $MonitorListeEndZeichen = "}";

               //Zusammensetzen
               $Daten = $MonitorListeWeiter . $MonitorListeWeiterBytes . $MonitorListeEndZeichen;
               //SetValueString("COM.Port","");     //Eingangspuffer leeren
               ComPort_SendText($ID, $Daten);
         }
         SetValueString ("MonitorListe" , substr($COM_String,13,32));
      }
}

..
..

Mir is nur nicht ganz klar warum das „Weitere Zeile holen“ zu oft rausgeschickt wird, damit kommt die ETA Steuerung nicht klar und bricht mittendrinnen ab. Kann das sein das durch den Timmer das Script mehrmals gleichzeitig läuft??

Log der Com Schnittstelle:


Answer: 22.05.2008 15:06:13.40864 (+0.0313 seconds)

 7B 4D 62 1D 93 00 00 00 FF 00 00 00 00 02 47 53   {Mb.“...ÿ.....GS
 4D 20 43 6F 6E 6E 65 63 74 6F 72 20 20 20 20 20   M Connector     
 20 20 7D                                            }             

Request: 22.05.2008 15:06:14.31464 (+0.7969 seconds)

 7B 4D 41 02 02 01 01 7D                           {MA....}        

Answer: 22.05.2008 15:06:14.48664 (+0.1719 seconds)

 7B 4D 62 1D 5B 00 00 00 FF 00 00 00 00 01 50 45   {Mb.[...ÿ.....PE
 4C 4C 45 54 53 53 54 45 55 45 52 55 4E 47 20 20   LLETSSTEUERUNG  
 20 20 7D                                            }             

Request: 22.05.2008 15:06:15.43964 (+0.9063 seconds)

 7B 4D 41 02 02 01 01 7D 7B 4D 41 02 02 01 01 7D   {MA....}{MA....} <-- sollte nur einmal kommen



Hab da irgendwie Timing Probleme, gibts eine bessere möglichkeit die COM abzufragen??


Request: 22.05.2008 15:06:31.72164 (+0.7656 seconds)

 7B 4D 41 02 02 01 01 7D                           {MA....}        

Answer: 22.05.2008 15:06:31.76764 (+0.0469 seconds)

 7B 4D 62 1D 06 10 00 14 00 B0 00 00 0A 01 4B 65   {Mb......°....Ke <--da fehlt was

Request: 22.05.2008 15:06:31.78364 (+0.0156 seconds)

 7B 4D 41 02 02 01 01 7D                           {MA....}        

Answer: 22.05.2008 15:06:31.79964 (+0.0156 seconds)

 73 73 65 6C 20 20 20 20 20 20 20 20 20 20 20 20   ssel            
 20 20 7D 7B 4D 62 1D F2 10 00 45 00 B0 00 00 0A     }{Mb.ò..E.°...  <--- komplett durcheinander
 02 4B 65 73 73 65 6C 20 53 4F 4C                  .Kessel SOL     

Request: 22.05.2008 15:06:31.81464 (+0.0000 seconds)

 7B 4D 41 02 02 01 01 7D                           {MA....}        

Answer: 22.05.2008 15:06:31.81464 (+0.0000 seconds)

 4C 20 20 20 20 20 20 20 20 20 7D                  L         }     

Request: 22.05.2008 15:06:32.12764 (+0.3125 seconds)

 7B 4D 41 02 02 01 01 7D 7B 4D 41 02 02 01 01 7D   {MA....}{MA....}
 7B 4D 41 02 02 01 01 7D 7B 4D 41 02 02 01 01 7D   {MA....}{MA....}
 7B 4D 41 02 02 01 01 7D 7B 4D 41 02 02 01 01 7D   {MA....}{MA....}

Answer: 22.05.2008 15:06:35.97164 (+2.1563 seconds)

 7B 4D 62 1D 07 10 00 14 00 B0 00 00 0A 02 4B 65   {Mb......°....Ke
 73 73 65 6C 20 20 20 20 20 20 20 20 20 20 20 20   ssel            
 20 20 7D 7B 4D 62 1D 9C 10 00 13 00 B0 00 00 0A     }{Mb.œ....°...
 01 41 62 67 61 73 20 20 20 20 20 20 20 20 20 20   .Abgas          
 20 20 20 20 20 7D 7B 4D 62 1D 7F 10 00 3B 00 B0        }{Mb...;.°
 00 00 0A 02 41 62 67 61 73 20 53 4F 4C 4C 20 20   ....Abgas SOLL  
 20 20 20 20 20 20 20 20 7D 7B 4D 62 1D 9D 10 00           }{Mb...
 13 00 B0 00 00 0A 02 41 62 67 61 73 20 20 20 20   ..°....Abgas    
 20 20 20 20 20 20 20 20 20 20 20 7D 7B 4D 62 1D              }{Mb.
 E4 10 00 1C 00 55 00 00 01 01 47 65 62 6C E4 73   ä....U....Gebläs
 65 64 72 65 68 7A 2E 20 20 20 20 20 20 20 7D      edrehz.       } 



Anbei noch die Screenshots der IPS Konfiguration:

CutChars.JPG

Register Variable.JPG

Script Event.JPG

Ja , durch den Timer läuft das Script alle 2 sec durch. Stell den Wert mal wieder auf 0

Gruß

Aufn Kopf greif :o Danke, das wars gg

Nagut, dann gehts weiter im Programm …

So hab mal mein Script fertig. Hab dazu die Scripte vom „Attain“ umgebaut, bzw. erweitert.
Was ist neu? Es kann jetzt von der ETA Steuerung die MonitorListe abgefragt werden und diese wird als XML File abgelegt. Script funktioniert jetzt auch für Twin Öfen und kommt mit unterschiedlichen Steuerungs Knoten (Nodes) klar.


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : COM_string_zerlegen.ips.php
Trigger  : On Change "Com.Port" , kein Timer!!
Interval : -
dieses Script dient dazu den Datenstring der von der "ETA" Heizung gesendet wird in einzelne Variablen zu zerlegen
Version: 1.0
Mistljo | 23.05.2008 | Umbau auf XML für MonitorListe
-
*/

include'ETA_functions.ips.php';
 
//'''Wenn Puffer leer, dann exit
$COM_String = GetValueString("COM.Port"); //"Com.Port" ist meine Register Variable  , ggf. anpassen!!!

if($COM_String=="") {
 exit;
}

//Variable Deklatation
$SummeDerNutzdaten = 0;

//Einstellwerte
if(substr($COM_String,0,2) == "MK") {
  IPS_Sleep(100);
  $Index = 256 * ord($COM_String{5}) + ord($COM_String{6});
  $Value = 256 * ord($COM_String{7}) + ord($COM_String{8});
  $MKVar = "ETA.Set.".$Index;
  if(!IPS_VariableExists($MKVar)) {    // wenn Variable fehlt: anlegen
      IPS_CreateVariable($MKVar, "Integer");
  }
  SetValueInteger($MKVar, $Value);
}

// Fehlermeldungen
if(substr($COM_String,0,2) == "IM") {
  SetValueString("Com",substr($COM_String,2));
  SetValueString("NEW_MESSAGE", substr($COM_String,4)); // übergabe an das Alarmscript
}

// MonitorListe neue Zeile
if(substr($COM_String,0,2) == "Mb") {

      //Ende der MonitorListe wurde erreicht
      if(ord($COM_String{2}) == 0 AND ord($COM_String{3}) == 0) {
         MonitorListe_ParameterHolenSTOP($ID);
      }  else {
          //DatenPrüfsumme testen
         $NutzdatenAnzahl =  ord($COM_String{2});
         $EmpfangenePruefsumme = ord($COM_String{3});
         // Summe der Nutzdaten
         for($i=4; $i <= $NutzdatenAnzahl+5; $i++) {
            $SummeDerNutzdaten = $SummeDerNutzdaten + ord($COM_String{$i});
         }
         $ErrechnetePruefsumme = $SummeDerNutzdaten%256;
         //Zeile in XML Datei einfügen
         if($EmpfangenePruefsumme == $ErrechnetePruefsumme) {
             if(!IPS_VariableExists('MonitorListeID')) {    // wenn Variable fehlt: anlegen
                  IPS_CreateVariable('MonitorListeID', "Integer");
                  }
             SetValueInteger('MonitorListeID', GetValueInteger("MonitorListeID")+1);

            $xml = simplexml_load_file('Monitorliste.xml');
            $Row = $xml->addChild('MonitorRow');
            $Row->addChild('ID', GetValueInteger("MonitorListeID"));
            $Row->addChild('Knoten', ord($COM_String{4}));
            $Row->addChild('HByte', ord($COM_String{5}));
            $Row->addChild('LByte', ord($COM_String{6}));
            $Row->addChild('Unknown9', ord($COM_String{7}));
            $Row->addChild('Unknown10', ord($COM_String{8}));
            $Row->addChild('Unknown11', ord($COM_String{9}));
            $Row->addChild('Unknown12', ord($COM_String{10}));
            $Row->addChild('Teiler', ord($COM_String{11}));
            $Row->addChild('IndexEbene', ord($COM_String{12}));

            $RowName = rtrim(substr($COM_String,13,32));
            $RowName = str_replace(" ", "_", $RowName);
            $RowName = str_replace("ä", "ae", $RowName);
            $RowName = str_replace("ö", "oe", $RowName);
            $RowName = str_replace("ü", "ue", $RowName);
            $RowName = str_replace("ß", "ss", $RowName);
            $RowName = str_replace("Ä", "Ae", $RowName);
            $RowName = str_replace("Ö", "Oe", $RowName);
            $RowName = str_replace("Ü", "Ue", $RowName);
            $Row->addChild('Name', $RowName);
            $xml->asXML('Monitorliste.xml');

            MonitorListe_weiterenParameterHolen($ID);
         }
         SetValueString ("MonitorListe" , substr($COM_String,13,32));
      }
}

 //Werte aus MonitorListe
if (strlen($COM_String) == $Anzahl *5 + 4 AND substr($COM_String,0,2) == "MD"){
    for ($i=01; $i<=$Anzahl; $i++){
      $Knoten = ord($COM_String{$i*5-1});
      $Index = ord($COM_String{$i*5+1}); //LByte
      $Wert = 256 * ord($COM_String{$i*5+2}) + ord($COM_String{$i*5+3});
      $IPSVar = "ETA_".MonitorXMLAuslesen(5, 0,$Knoten,$Index). "_". MonitorXMLAuslesen(4, 0,$Knoten,$Index) ;   //Bezeichnung der IPS Variable

      if($Wert >= 30000) {                 //Temperatur unter 0 C ?
        $Wert = $Wert - 65536;
      }
      $Wert = $Wert / MonitorXMLAuslesen(3, 0,$Knoten,$Index); //->Teiler aus XML File
    if(!IPS_VariableExists($IPSVar)) {    // wenn Variable fehlt: anlegen
      IPS_CreateVariable($IPSVar, "Float");
    }
    SetValueFloat($IPSVar, $Wert);   //Ausgabe der Temperatur/Pelletsvorrat
  }
}
?>


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : Datenanforderung_ETA.ips.php
Trigger  : -
Interval : -
Dieses Script schickt der ETA Steuerung den Startbefehlt um Monitor Daten zu schicken. z.B.: Kessel Temp.
Version: 1.0
Mistljo | 23.05.2008 | include ETA_functions.ips.php und umbau auf XML File (MonitorListe)
*/
include'ETA_functions.ips.php';

//Variable Deklatation
$TempDaten = '';
$TempPS = 0;

//Daten Bauen
$Daten ="{MC";                  //Startzeichen und Servicekennung
$Daten .= chr(1+($Anzahl*3));   //Anzahl der Nutzdatenbytes ( RefreshTime + Anzahl * 3 byte)
$PS = $Intervall;

for ($i=1; $i<=$Anzahl; $i++)   //Die n Anzahl Parameter
  {
  $a = "Para" . $i;
   $TempDaten .= chr(MonitorXMLAuslesen(1, $$a,0,0)) . chr($HighByte) . chr(MonitorXMLAuslesen(2, $$a,0,0));   //...jeweils 3 byte
  //Pruefsumme
  $TempPS = $TempPS +  MonitorXMLAuslesen(1, $$a,0,0) + MonitorXMLAuslesen(2, $$a,0,0);
  }
$PS = $PS + $TempPS;
$PS = $PS%256; //Modulo 256

$Daten .= chr($PS);
$Daten .= chr($Intervall);
$Daten .= $TempDaten;
$Daten .= "}";
ComPort_SendText($ID, $Daten);
?>


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : Datenanforderung_STOP_ETA.ips.php
Trigger  : -
Interval : -
Dieses Script schickt der ETA Steuerung den STOP Befehl um keine Daten mehr zu schicken.
Version: 1.0
Mistljo | 23.05.2008 | umbau auf include ETA_functions.ips.php
*/

include'ETA_functions.ips.php';
Datenanfodern_STOP($ID);

?>


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : ETA_functions.ips.php
Trigger  : -
Interval : -
Dieses Script dient zum Einstellen der gewünschten Monitor Daten und
beinhaltet auch alle für ETA benötigten Funktionen.
Version: 1.0
Mistljo | 23.05.2008 | neu erstellung
*/

 // Konfigurationsteil zum Anpassen *********************************************************************
$ID = 14223;  //Instances ID des COM-Ports, ist Anzupassen
$Anzahl =9;  // Anzahl der Auszulesenden Parameter
$Intervall = 5;  // RefreshTime , Steuerung schickt alle X Sekunden die Werte, Angabe in Sekunden (max. 255 Sekunden)
//Parameter als ID !! nachzugucken im XML File (derzeit)
//Die Steuerung erlaubt nur max. 20 Abfragen !!!

$Para1 = 15;
$Para2 = 16;
$Para3 = 17;
$Para4 = 18;
$Para5 = 19;
$Para6 = 20;
$Para7 = 21;
$Para8 = 22;
$Para9 = 23;
$Para10 = 24;
$Para11 = 25;
$Para12 = 26;
$Para13 = 27;
$Para14 = 28;
$Para15 = 29;
$Para16 = 30;
$Para17 = 31;
$Para18 = 32;
$Para19 = 33;
$Para20 = 34;

$HighByte = 0; //normalerweise immer 0 , sollte nicht geändert werden
// Ende Konfigurations Teil ******************************************************************************


//Ab hier nichts mehr ändern


 
 
// Einen weiteren Monitor Parameter schicken lassen
function MonitorListe_weiterenParameterHolen($ID)
   {
      $MonitorListeWeiter ="{MA";
      $MonitorListeWeiterBytes = chr(02) . chr(02) . chr(01) . chr(01);
      $MonitorListeEndZeichen = "}";
      //Zusammensetzen
      $Daten = $MonitorListeWeiter . $MonitorListeWeiterBytes . $MonitorListeEndZeichen;
      ComPort_SendText($ID, $Daten);
   }

  // End Signal zum Ofen, Keine Monitor Zeile mehr schicken
 function MonitorListe_ParameterHolenSTOP($ID)
   {
      $MonitorListeEnde = "{MO";
      $MonitorListeEndeBytes = chr(01) . chr(01);
      $MonitorListeEndZeichen = "}";
      //Zusammensetzen
      $Daten = $MonitorListeEnde . $MonitorListeEndeBytes . $MonitorListeEndZeichen;
      ComPort_SendText($ID, $Daten);
      SetValueString("COM.Port","");     //Eingangspuffer leeren
      SetValueInteger('MonitorListeID', 0);
   }
   
//Allgemeines STOP für den Ofen, keine Daten mehr senden
   function Datenanfodern_STOP($ID)
      {
      $Daten ="{ME";                //Startzeichen und Servicekennung
      $Daten .= chr(0);             //Anzahl der Nutzdatenbytes
      $Daten .= chr(0);             //Prfsumme
      $Daten .= "}";                //Stoppzeichen
      IPS_Sleep(100);
      ComPort_SendText($ID, $Daten);
      IPS_Sleep(100);
      SetValueString("COM.Port","");     //Eingangspuffer leeren
     }
//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
    
    
      $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;
            }
         }
      }
   }
?>


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : MonitorListe anfordern
Trigger  : -
Interval : -
Dieses Script schickt der ETA Steuerung den Start Befehl die Monitor Liste zu schicken
Es wird ein XML File erstellt "MonitorListe.xml", sollte diese schon vorhanden sein wird das Script abgebrochen!!!
Dieses Script sollte nur einmal am Anfang Ausgeführt werden oder bei Hardware Änderungen am ETA Ofen.
Version: 0.1
Mistljo | 23.05.2008 | neu erstellung
Known issues:
-
*/

include'ETA_functions.ips.php';

//leeres XML File
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<MonitorTable>
</MonitorTable>
XML;


//Wenn kein XML File vorhanden dann neues erstellen
   if (file_exists('Monitorliste.xml')) {
      echo "Monitor Liste bereits vorhanden";
   } else {
      $xml = new SimpleXMLElement($xmlstr);
      $xml->asXML('Monitorliste.xml');
      //Befehl schicken
            Datenanfodern_STOP($ID);
           $MonitorListeStart ="{MA";
           $MonitorListeStartBytes = chr(02) . chr(01) . chr(00) . chr(01);
           $MonitorListeEndZeichen = "}";
            //Zusammensetzen
            $Daten = $MonitorListeStart . $MonitorListeStartBytes . $MonitorListeEndZeichen;
            $MonitorListeStatus = false;
            ComPort_SendText($ID, $Daten);
   }
?>

Hallo mistljo,

super Sache. Ich habs mal getestet. Funktioniert auch soweit. Problem ist eigentlich nur, daß die abgefragte Liste leider nicht komplett ist. So gibt es z.b. den Index „73“ ( dieser zeigt an ob der Heizkreis in der Nachtabsenkung ist oder nicht). Nachdem ich den manuell in das XML File eingefügt habe hats dann geklappt.
Wenn du PHP Codes hier im Forum postest , dann fasse es bitte in PHP-Tags ein. Da ist es dann schön bunt und läßt sich besser lesen. :wink:



//'''Wenn Puffer leer, dann exit

if($COM_String=="") {
 exit;
}

Den Teil kannst und solltest Du auch weglassen, da das „exit“ einen Fehler erzeugt und auch die Variable im Cutchar immer überschrieben wird. Somit kannst du auch das löschen weglassen, weil dadurch das Empfansscript unnötig getriggert wird und leer durchläuft.

      SetValueString("COM.Port","");     //Eingangspuffer leeren

Eine Frage habe ich noch : Ist es möglich eine Indexliste der Einstellwerte abzufragen? Weil die Werte setzen ist ja mit dem Befehl „MJ“ möglich.

Gruß
Attain

Hi danke für die Tipps, werd ich mal umsetzen. Ich hoff der Code is halbwegs lesbar, PHP ist halt neu für mich.

Bzgl. der Einstellwerte, ja ich denke da gibts was, hab dein eine Inbetriebnahme Software die alle Daten auslesen kann, werd da mal mitsniffen. Meld mich sobald ich was hab.

Hab mal das mitgeschrieben, schein so in etwa wie die MonitorListe zu sein, frag mich aber bitte nicht was das für Daten sind. Hab sie mir nocht nicht wirklich angeschaut.


Request: 24.05.2008 17:47:44.59264

 7B 50 41 01 00 00 7D                              {PA...}       <--Start  

Answer: 24.05.2008 17:47:44.66264 (+0.0701 seconds)

 7B 50 62 0B 46 56 45 3D 22 30 2E 30 30 31 22 3B   {Pb.FVE="0.001";
 7D                                                }               

Request: 24.05.2008 17:47:44.67264 (+0.0100 seconds)

 7B 50 41 01 01 01 7D                              {PA...}         <-- nächste Zeile

Answer: 24.05.2008 17:47:44.69264 (+0.0200 seconds)

 7B 50 62 04 3E 5B 42 44 5D 7D                     {Pb.>[BD]}      

Request: 24.05.2008 17:47:44.70264 (+0.0100 seconds)

 7B 50 41 01 01 01 7D                              {PA...}         

Answer: 24.05.2008 17:47:44.72264 (+0.0200 seconds)

 7B 50 62 03 C4 42 47 3B 7D                        {Pb.ÄBG;}       

Request: 24.05.2008 17:47:44.75264 (+0.0100 seconds)

 7B 50 41 01 01 01 7D                              {PA...}         

Answer: 24.05.2008 17:47:44.77264 (+0.0200 seconds)

 7B 50 62 08 F1 54 50 3D 22 50 41 22 3B 7D         {Pb.ñTP="PA";}  

Request: 24.05.2008 17:47:44.77264 (+0.0000 seconds)

 7B 50 41 01 01 01 7D                              {PA...}         

Answer: 24.05.2008 17:47:44.84264 (+0.0701 seconds)

 7B 50 62 12 8A 44 45 3D 22 42 65 64 69 65 6E 74   {Pb.ŠDE="Bedient
 65 69 6C 20 30 22 3B 7D                           eil 0";}


...
...


Request: 24.05.2008 17:53:07.83964 (+0.0000 seconds)

 7B 50 41 01 01 01 7D                              {PA...}         

Answer: 24.05.2008 17:53:07.84964 (+0.0100 seconds)

 7B 50 62 00 00 7D 7B 50 62 00 00 7D 7B 50 62 00   {Pb..}{Pb..}{Pb.
 00 7D 7B 50 62 00 00 7D 7B 50 62 00 00 7D         .}{Pb..}{Pb..} <---- Übertragung ENDE