Richtig.
Aufbau ist folgender:
Client-Socket -> Cutter -> Regitervariable -> Script
Du mußt 26 Integer Variablen anlegen, da 13 Frames 'a 2 Werte übertragen werden und die ID’s im Script eintragen.
Dann hast Du die „Rohdaten“. Temperaturen müssen noch durch 10 und Volumenstrom durch 100 geteilt werden.
<?
If ($IPS_SENDER == "RegisterVariable"){
########### Konfigurationsteil #####################
$debug = false;
$VarID = array(58154,15102,58433,38606,41837,50241,27447,10322,11975,39467,11221,58115,23138,32828);
// dies sind die ID's der Variablen in die die Werte geschrieben werden
$cs = 16; // durch den Cutter wird das erste Byte abgeschnitten, hier wird der Wert wieder dazu genommen
########### Konfigurationsteil Ende ################
if ($debug) IPS_LogMessage("VBus-Debug","Es sind ".count($VarID)." IPS-Variablen angegeben");
for ($i=00; $i<=06; $i++){
$cs += ord($IPS_VALUE{$i}); //Headerbytes zur Checksumme zusammenaddieren
}
$cs = ~$cs;//Checksumme invertieren
$cs &= 127;//MSB aus Checksumme entfernen
if ($debug) IPS_LogMessage("VBus-Debug","Berrechnete Checksumme Header: $cs , Empfangene Checksumme: ".ord($IPS_VALUE{7}));
if ( $cs == ord($IPS_VALUE{7})){ // Checksumme ok?
if ($debug) IPS_LogMessage("VBus-Debug","HeaderChecksumme OK!");
$Byte = array();
$AnzahlFrames = ord($IPS_VALUE{6});
if ($debug) IPS_LogMessage("VBus-Debug","Anzahl der ermittelten Frames: $AnzahlFrames " );
for ($i=01; $i<=$AnzahlFrames; $i++){ // DeltaSol BS+ hat 7 Datenframes
$cs = 0;
$Septett = ord($IPS_VALUE{$i * 6 + 6});
for ($j=00; $j<=03; $j++){ // es sind immer 4 Bytes in einem Frame
$DatenByte = ord($IPS_VALUE{$i * 6 + 2 + $j});
$Byte[$j] = $DatenByte + 128 * (($Septett >> $j) & 1); //das komplette Datenbyte aus dem Byte und dem Teil des Septett zusammenfügen
$cs += $DatenByte;// Bytes zur Checksumme addieren
}
$cs += $Septett; // septett dazuaddieren
$cs = ~$cs;//Checksumme invertieren
$cs &= 127;//MSB aus Checksumme entfernen
if ($debug) IPS_LogMessage("VBus-Debug","Berrechnete Checksumme Frame $i: $cs , Empfangene Checksumme: ".ord($IPS_VALUE{$i * 6 + 7}));
if ($cs == ord($IPS_VALUE{$i * 6 + 7})){ // prüfen ob Checksumme i.o.
if ($debug) IPS_LogMessage("VBus-Debug","Frame Checksumme OK!");
$Wert1 = $Byte[0] + $Byte[1]*256; // ein Wert besteht aus 2 Bytes
$Wert2 = $Byte[2] + $Byte[3]*256; // in einem Frame sind 2 Werte
SetValue($VarID[$i*2-2],$Wert1); // in IPS abspeichern
SetValue($VarID[$i*2-1],$Wert2);
if ($debug) IPS_LogMessage("VBus-Debug","Wert1 (".IPS_GetName($VarID[$i*2-2]).") vom Frame $i = $Wert1 , Wert2 (".IPS_GetName($VarID[$i*2-1]).")= $Wert2 ");
}
else {
IPS_LogMessage("VBus","Checksummenfehler im Frame $i >> ermittelte Summe: $cs empfangene Summe: ".ord($IPS_VALUE{$i * 6 + 6}));
return;
}
}
}
else IPS_LogMessage("VBus","Checksummenfehler Header >>Checksumme berrechnet: $cs Checksumme soll: ".ord($IPS_VALUE{7}));
}
else echo "Script kann nur von der Register Variablen getriggert werden!";
?>