Original von MistlJo:
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : SCR_ComStringZerlegen.ips.php
Trigger : On Change "ETA_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.2
Mistljo | 23.05.2008 | Umbau auf XML für MonitorListe
Mistljo | 28.10.2010 | cleanup
-
*/
//Todo:
//Manchmal wird eine Variable "Anlagenkonfiguration" angelegt, warum?
//Teilweise werden Sonderzeichen zurückgeliefert (Umlaute oder <>) diese müssen noch gefiltert werden
// Prüfsummenprüfung ändern, Abfragen müssen mit fixer Länge abgefragt werden...
require 'SCR_EtaFunctions.ips.php';
$ETA_ComID = GetObjectID("ETA_COM_Port",""); //Instances ID des COM-Ports
//$buf .= $IPS_VALUE;
$COM_String = RegVar_GetBuffer(GetObjectID("ETA/Variablen/Allgemein/ETA_COM_RegisterVariable"));
$COM_String .= $IPS_VALUE;
//Variable Deklatation
$SummeDerNutzdaten = 0;
// ETA Fehlermeldungen
if(substr($COM_String,0,2) == "IM") {
write_error(substr($COM_String,4),1); // 2= General 1= ETA Alarm
}
// 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) {
ParameterHolenSTOPP($ETA_ComID);
SetValueInteger('MonitorListeID', 0);
write_error("Monitorliste wurde erstellt.",3);
SetValueBoolean('Datenabfrage',false);
} else {
//Todo:
//Prüfsumme stimmt nicht bei den Expert einstellungen
/* //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
*/
//Prüfsumme stimmt nicht bei den Expert einstellungen
//if($EmpfangenePruefsumme == $ErrechnetePruefsumme) {
//IfVarNotExistCreateNewOne('MonitorListeID',1,0);
SetValueInteger('MonitorListeID', GetValueInteger("MonitorListeID")+1);
$xml = simplexml_load_file('Monitorliste.xml');
$Row = $xml->addChild('MonitorRow');
//ID erstellen, und nullen vorne anhängen
if (strlen(GetValueInteger("MonitorListeID")) == 1) {
$Row->addChild('ID', "00" . GetValueInteger("MonitorListeID"));
} else if (strlen(GetValueInteger("MonitorListeID")) == 2) {
$Row->addChild('ID', "0" . GetValueInteger("MonitorListeID"));
} else if (strlen(GetValueInteger("MonitorListeID")) == 3) {
$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('Ueberschrift', ord($COM_String{7}));
$Row->addChild('Datentype', 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);
$Row->addChild('Name', utf8_encode($RowName));
$xml->asXML('Monitorliste.xml');
write_error("Neuer Wert: ID: ".GetValueInteger("MonitorListeID")." Name: ".$RowName ,3);
MonitorListe_weiterenParameterHolen($ETA_ComID);
//}
}
}
// ParameterListe neue Zeile
if(substr($COM_String,0,2) == "Mg") {
//Ende der ParameterListe wurde erreicht
if(ord($COM_String{2}) == 0 AND ord($COM_String{3}) == 0) {
ParameterHolenSTOPP($ETA_ComID);
SetValueInteger('ParameterListeID', 0);
write_error("Parameter Liste wurde erstellt.",3);
SetValueBoolean('Datenabfrage',false);
// **********Weiterführung der Abfrage
// ********** Parameter Index Liste wird geladen
write_error("Parameter Index Liste wird geladen...:",3);
//leeres XML File
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<ParameterIndexListe>
</ParameterIndexListe>
XML;
//Wenn kein XML File vorhanden dann neues erstellen
if (file_exists('ParameterIndexListe.xml')) {
echo "Parameter Index Liste bereits vorhanden";
} else {
write_error("Parameter Index Liste wird erstellt...",3);
$xml = new SimpleXMLElement($xmlstr);
$xml->asXML('ParameterIndexListe.xml');
//Befehl schicken
Datenanfodern_STOP($ETA_ComID);
$ParameterIndexListeStart ="{MH";
$ParameterIndexListeStartBytes = chr(01) . chr(00) . chr(00);
$ParameterIndexListeEndZeichen = "}";
//Zusammensetzen
$Daten = $ParameterIndexListeStart . $ParameterIndexListeStartBytes . $ParameterIndexListeEndZeichen;
$MonitorListeStatus = false;
ComPort_SendText($ETA_ComID, $Daten);
}
} 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
//ToDO:
//Prüfsumme stimmt nicht bei den Expert einstellungen
//if($EmpfangenePruefsumme == $ErrechnetePruefsumme) {
//IfVarNotExistCreateNewOne('EinstellwertListeID',1,0);
SetValueInteger('ParameterListeID', GetValueInteger("ParameterListeID")+1);
$xml = simplexml_load_file('ParameterListe.xml');
$Row = $xml->addChild('ParameterListRow');
$Row->addChild('ID', GetValueInteger("ParameterListeID"));
$Row->addChild('Knoten', ord($COM_String{4}));
$Row->addChild('Index_HByte', ord($COM_String{5}));
$Row->addChild('Index_LByte', ord($COM_String{6}));
$Row->addChild('Datentyp', ord($COM_String{7}));
$Row->addChild('Einheit', ord($COM_String{8}));
$Row->addChild('UN9', ord($COM_String{9}));
$Row->addChild('UN10', ord($COM_String{10}));
$Row->addChild('Teiler', ord($COM_String{11}));
$Row->addChild('min_Wert_HByte', ord($COM_String{12}));
$Row->addChild('min_Wert_LByte', ord($COM_String{13}));
$Row->addChild('max_Wert_HByte', ord($COM_String{14}));
$Row->addChild('max_Wert_LByte', ord($COM_String{15}));
$Row->addChild('std_Wert_HByte', ord($COM_String{16}));
$Row->addChild('std_Wert_LByte', ord($COM_String{17}));
$Row->addChild('akt_Wert_HByte', ord($COM_String{18}));
$Row->addChild('akt_Wert_LByte', ord($COM_String{19}));
$Row->addChild('Ebene', ord($COM_String{20}));
$RowName = rtrim(substr($COM_String,21,40));
$RowName = str_replace(" ", "_", $RowName);
$Row->addChild('Name', utf8_encode($RowName));
$xml->asXML('ParameterListe.xml');
write_error("Parameter Liste LOG: ".$RowName,3);
//}
//SetValueString ("MonitorListe" , substr($COM_String,13,32));
Parameter_Liste_weiterenParameterHolen($ETA_ComID);
}
}
// Paramenter Index Liste weiteren Wert holen
// Noch fehler in der Prüfsumme ( End Zeichen } wird übermittelt.
if(substr($COM_String,0,2) == "Mi") {
//Ende der ParamenterListe wurde erreicht
if(ord($COM_String{2}) == 0 AND ord($COM_String{3}) == 0) {
ParameterHolenSTOPP($ETA_ComID);
SetValueInteger('ParameterIndexListeID',0);
write_error("Parameter Index Liste fertig geladen.",3);
} 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) {
//IfVarNotExistCreateNewOne('EinstellwertListeID',1,0);
SetValueInteger('ParameterIndexListeID', GetValueInteger("ParameterIndexListeID")+1);
$xml = simplexml_load_file('ParameterIndexListe.xml');
$Row = $xml->addChild('ParameterListIndexRow');
$Row->addChild('ID', GetValueInteger("ParameterIndexListeID"));
$Row->addChild('Knoten', ord($COM_String{4}));
$Row->addChild('HByte', ord($COM_String{5}));
$Row->addChild('LByte', ord($COM_String{6}));
$RowName = rtrim(substr($COM_String,7,40));
$RowName = ltrim(substr($COM_String,7,40),"_");
$RowName = str_replace(" ", "_", $RowName);
$Row->addChild('Name', utf8_encode($RowName));
$xml->asXML('ParameterIndexListe.xml');
write_error("Parameter Index Liste LOG: ".$RowName,3);
//}
Parameter_Index_Liste_weiterenParameterHolen($ETA_ComID);
}
}
//Aktuelle Werte vom Ofen
if (GetValueBoolean('Datenabfrage') == true) {
if (substr($COM_String,0,2) == "MD"){
ETA_ParameterAuswahlAnalyse(); //neu
$tempBlockName = "ETA_MLP_". GetValueInteger('MonitorList_ParameterBlockZaehler');
$Anzahl = count($$tempBlockName);
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});
$VarID = intval(MonitorXMLAuslesen(4, 0,$Knoten,$Index));
$IPSVar = "ETA_Wert_".MonitorXMLAuslesen(4, 0,$Knoten,$Index)."_".MonitorXMLAuslesen(5, 0,$Knoten,$Index); //Bezeichnung der IPS Variable
if($Wert >= 30000 /*[Objekt #30000 existiert nicht]*/) { //Temperatur unter 0 C ?
$Wert = $Wert - 65536;
}
//->Teiler aus XML File
$tempTeiler = MonitorXMLAuslesen(3, 0,$Knoten,$Index);
if ((!$tempTeiler == 0) and (!$Wert == 0)) // sonst DIV durch 0 fehler
{
$Wert = $Wert / $tempTeiler;
}
//Erstellt für einen empfangen Wert eine neue Variable
if ((MonitorXMLAuslesen(8,$VarID,0,0) == 176) and (stristr(MonitorXMLAuslesen(6,$VarID,0,0),"Raum") != false)){ //Temperatur Variable, für Räume
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"~Temperature",false,true);
} elseif ((MonitorXMLAuslesen(8,$VarID,0,0) == 176) and (stristr(MonitorXMLAuslesen(6,$VarID,0,0),"Abgas") != false)){ //Temperatur Variable, Abgas
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Temperature.Abgas",false,true);
} elseif ((MonitorXMLAuslesen(8,$VarID,0,0) == 176) and (stristr(MonitorXMLAuslesen(6,$VarID,0,0),"Kessel") != false)){ //Temperatur Variable, 10 ° bis 100°, z.B Kessel
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Temperature.10bis100",false,true);
} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 176){ //Temperatur Variable, Normal
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"~Temperature",false,true);
} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 37){ // % Variable, unterscheidung zw. normal Prozent und Restsauerstoff
if (MonitorXMLAuslesen(5, 0,$Knoten,$Index) == "Restsauerstoff")
{
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Restsauerstoff.Prozent",false,true);
} else {
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Prozent",false,true);
}
} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 116){ // Tonnen Variable
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Tonnen",false,true);
} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 32){ // kg Variable
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.kg",false,true);
} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 85){ // Drehzahl Variable
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Drehzahl",false,true);
} else {
//print "Keine Variablen Datentype gefunden";
IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"",false,false);
}
//Übergabe der Werte an die ensprechende IPS Variable
//Überschreiben des Restsauerstoff wertes. Minus Werte sind immer Null
if (MonitorXMLAuslesen(5, 0,$Knoten,$Index) == "Restsauerstoff")
{
If ($Wert < 0) {
SetValueFloat($IPSVar, 0);
} else {
SetValueFloat($IPSVar, $Wert);
}
//Alle anderen Werte
} else {
SetValueFloat($IPSVar, $Wert);
}
//Live view
if (GetValueInteger(GetObjectID("ETA/Variablen/Allgemein/liveview_int")) >20)
{
SetValueString(GetObjectID("ETA/Live Daten"),"");
SetValueInteger(GetObjectID("ETA/Variablen/Allgemein/liveview_int"),0);
}
SetValueString(GetObjectID("ETA/Live Daten"),GetValueString(GetObjectID("ETA/Live Daten")).date("j M Y G:i:s").": ".$IPSVar.": ". $Wert."<BR/>");
SetValueInteger(GetObjectID("ETA/Variablen/Allgemein/liveview_int"),GetValueInteger(GetObjectID("ETA/Variablen/Allgemein/liveview_int"))+1);
//Wert Objekt einblenden
IPS_SetHidden(GetObjectID("ETA/Variablen/Aktuelle Werte/".$IPSVar), false);
}
Datenanfodern_STOP($ETA_ComID); //StopZeichen Senden -> Block x durchgelaufen
if (GetValueInteger('MonitorList_ParameterBlockZaehler') < $ParameterBlockAnzahl) {
SetValueInteger('MonitorList_ParameterBlockZaehler',GetValueInteger('MonitorList_ParameterBlockZaehler') + 1); //Zähler um eins erhöhen
//Start Bytes zusammenbauen und an COM übergeben
IPS_SetScriptTimer("SCR_Datenanforderung", $BlockIntervallTimer); //fürt das Datenanforderungs SCript nach x sekunden aus
} else {
SetValueInteger('MonitorList_ParameterBlockZaehler',0); //Zähler auf 0 setzen, damit wird wieder beim Block 1 begonnen
IPS_SetScriptTimer("SCR_Datenanforderung", $BlockIntervallTimer); //fürt das Datenanforderungs SCript nach x sekunden aus
}
} else {
write_error("Warning: Empfange Daten vom Ofen, obwohl die Abfrage ausgeschalten ist",1); // 2= General 1= ETA Alarm
SetValueBoolean(GetObjectID("ETA/ETA Status?"),true);
}
}
?>
unverändert…
…ich hatte es mal am Ende eingefügt(Z326). Aber dem Script fehlt mir bei Menge an Parametern der Durchblick…
Gruß Konny