Hallo,
ich habe gestern IPS auf 4.00 upgedatet. Seit dem funktioniert das Auslesescript nicht mehr. Die Ausführung wird nicht beendet und das Script endet in einem DEATH THREAD.
Nach einem Neustart kann das Script von Hand ausgeführt werden. Sobald der Timer das Script auslöst, endet die Ausführung in einem Death Thread.
Folgendes Script verwende ich:
<?
$ClientSocket_ID = 40431 /*[Client Socket SolarLog]*/;
$RegisterVariable_ID = 57089 /*[Hardware\SolarLog200\Register Variable SolarLog]*/ ;
//*************** ModBus-Adressen ***************
$adressen=array (
'datum_zeit' => array ('modbus adresse'=> '0D AC','id' =>16713,'nummer'=>'01'),
'leistung_ac' => array ('modbus adresse'=> '0D AE','id' =>49998,'nummer'=>'02'),
'leistung_dc' => array ('modbus adresse'=> '0D B0','id' =>59032,'nummer'=>'03'),
'spannung_ac' => array ('modbus adresse'=> '0D B2','id' =>20500,'nummer'=>'04'),
'spannung_dc' => array ('modbus adresse'=> '0D B3','id' =>48304,'nummer'=>'05'),
'ertrag_heute' => array ('modbus adresse'=> '0D B4','id' =>35996,'nummer'=>'06'),
'ertrag_gestern' => array ('modbus adresse'=> '0D B6','id' =>40175,'nummer'=>'07'),
'ertrag_monat' => array ('modbus adresse'=> '0D B8','id' =>44284,'nummer'=>'08'),
'ertrag_jahr' => array ('modbus adresse'=> '0D BA','id' =>54860,'nummer'=>'09'),
'ertrag_gesamt' => array ('modbus adresse'=> '0D BC','id' =>34078,'nummer'=>'10'),
'verbrauch_akt' => array ('modbus adresse'=> '0D BE','id' =>39900,'nummer'=>'11'),
'verbrauch_heute' => array ('modbus adresse'=> '0D C0','id' =>51563,'nummer'=>'12'),
'verbrauch_gestern' => array ('modbus adresse'=> '0D C2','id' =>39059,'nummer'=>'13'),
'verbrauch_monat' => array ('modbus adresse'=> '0D C4','id' =>30678,'nummer'=>'14'),
'verbrauch_jahr' => array ('modbus adresse'=> '0D C6','id' =>40035,'nummer'=>'15'),
'verbrauch_gesamt' => array ('modbus adresse'=> '0D C8','id' =>59999,'nummer'=>'16')
);
$sendetext='ab 16 00 00 00 06 01 04 xx xx 00 02';
// Nicht um 3:00 Uhr, da keine Verbindung hergestellt werden kann
IF ((date("H:i") > '03:00') AND (date("H:i") < '03:03')) //Zwischen 3:00 und 3:05 Uhr
return;
// ==================
switch ($_IPS['SENDER'])
{
case "TimerEvent": //Anfrage an SolarLog senden
case "Execute": //Ausführung
IPS_SetProperty($ClientSocket_ID, "Open",true); //I/O-Instanz aktivieren
IPS_ApplyChanges($ClientSocket_ID);
$s1=str_replace("ab", $adressen['datum_zeit']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['datum_zeit']['modbus adresse'],$s1));
$s2=str_replace("ab", $adressen['leistung_ac']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['leistung_ac']['modbus adresse'],$s2));
$s3=str_replace("ab", $adressen['leistung_dc']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['leistung_dc']['modbus adresse'],$s3));
$s4=str_replace("ab", $adressen['spannung_ac']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['spannung_ac']['modbus adresse'],$s4));
$s5=str_replace("ab", $adressen['spannung_dc']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['spannung_dc']['modbus adresse'],$s5));
$s6=str_replace("ab", $adressen['ertrag_heute']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_heute']['modbus adresse'],$s6));
$s7=str_replace("ab", $adressen['ertrag_gestern']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_gestern']['modbus adresse'],$s7));
$s8=str_replace("ab", $adressen['ertrag_monat']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_monat']['modbus adresse'],$s8));
$s9=str_replace("ab", $adressen['ertrag_jahr']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_jahr']['modbus adresse'],$s9));
$s10=str_replace("ab", $adressen['ertrag_gesamt']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_gesamt']['modbus adresse'],$s10));
$s11=str_replace("ab", $adressen['verbrauch_akt']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_akt']['modbus adresse'],$s11));
$s12=str_replace("ab", $adressen['verbrauch_heute']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_heute']['modbus adresse'],$s12));
$s13=str_replace("ab", $adressen['verbrauch_gestern']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_gestern']['modbus adresse'],$s13));
$s14=str_replace("ab", $adressen['verbrauch_monat']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_monat']['modbus adresse'],$s14));
$s15=str_replace("ab", $adressen['verbrauch_jahr']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_jahr']['modbus adresse'],$s15));
$s16=str_replace("ab", $adressen['verbrauch_gesamt']['nummer'],$sendetext); //Nummer eintragen
modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_gesamt']['modbus adresse'],$s16));
break;
case "RegisterVariable": //Auf Antwort warten und verarbeiten
$hexstring = strtohex($_IPS['VALUE']);
$arr_modbus_receive = str_split(strtohex($_IPS['VALUE']), 2);
$value = 0;
$hex = $arr_modbus_receive[11].$arr_modbus_receive[12].$arr_modbus_receive[9].$arr_modbus_receive[10];
$dec = hexdec($hex);
$max = pow(2, 4 * (strlen($hex) + (strlen($hex) % 2)));
$_dec = $max - $dec;
if($dec > $_dec) { $value = -$_dec;}
else {$value = $dec; }
$value=(float)$value;
switch ($arr_modbus_receive[0]) //Werte zur Adresse zuordnen
{
case 1: //Datum - Zeit
date_default_timezone_set('GMT');
$datum = date("d.m.y - H:i:s",$value);
setvalue($adressen['datum_zeit']['id'],$datum);
break;
case 2: //Leistung AC
setvalue($adressen['leistung_ac']['id'],$value);
break;
case 3: //Leistung DC
setvalue($adressen['leistung_dc']['id'],$value);
break;
case 4: //Spannung AC
setvalue($adressen['spannung_ac']['id'],$value);
break;
case 5: //Spannung DC
setvalue($adressen['spannung_dc']['id'],$value);
break;
case 6: //Ertrag Heute
setvalue($adressen['ertrag_heute']['id'],$value/1000);
break;
case 7: //Ertrag Gestern
setvalue($adressen['ertrag_gestern']['id'],$value/1000);
break;
case 8: //Ertrag Monat
setvalue($adressen['ertrag_monat']['id'],$value/1000);
break;
case 9: //Ertrag Jahr
setvalue($adressen['ertrag_jahr']['id'],$value/1000);
break;
case 10: //Ertrag Gesamt
setvalue($adressen['ertrag_gesamt']['id'],$value/1000);
break;
case 11: //Verbrauch Aktuell
setvalue($adressen['verbrauch_akt']['id'],$value/1000);
break;
case 12: //Verbrauch Heute
setvalue($adressen['verbrauch_heute']['id'],$value/1000);
break;
case 13: //Verbrauch Gestern
setvalue($adressen['verbrauch_gestern']['id'],$value/1000);
break;
case 14: //Verbrauch Monat
setvalue($adressen['verbrauch_monat']['id'],$value/1000);
break;
case 15: //Verbrauch Jahr
setvalue($adressen['verbrauch_jahr']['id'],$value/1000);
break;
case 16: //Verbrauch Gesamt
setvalue($adressen['verbrauch_gesamt']['id'],$value/1000);
//ClientSocket beim letzten Wert schliessen
IPS_SetProperty($ClientSocket_ID, "Open",false); //ClientSocket schliessen
IPS_ApplyChanges($ClientSocket_ID);
break;
}
break;
}
//*************** Funktionen ***************
function strtohex($string) {
$hexstr = unpack('H*', $string);
return strtoupper(array_shift($hexstr));}
function hextostr($hex) {
$str='';
$hex = str_replace(' ', '', $hex);
for ($i=0; $i < strlen($hex)-1; $i+=2) {
$str .= chr(hexdec($hex[$i].$hex[$i+1])); }
return $str;}
function dechex_lsb_msb($decvalue) {
$hexstr=dechex($decvalue);
for ($i = strlen($hexstr); $i < 8; $i++) {
$hexstr="0".$hexstr; }
return substr($hexstr, 4, 4).substr($hexstr, 0, 4);}
function modbus_send($ID, $hex) {
RegVar_SendText($ID, hextostr($hex));
IPS_Sleep(100);}
?>
Gruß Proxima