Hi,
dir Ursache habe ich noch nicht gefunden. Habe mir deswegen eine Notlösung einfallen lassen.
Grob zusammengefasst:
- Prüfen ob die ausgelesenen Daten OK sind
- wenn Daten nicht OK noch mal auslesen
- es gibt 5 Versuche pro Lesevorgang
Bis jetzt klappt es 100%.
Wenn du nicht mein ganzes Skript kopierst, musst du die Variable „sollDataLaenge“ an dein Skript anpassen.
Hier mein Skript:
$sleep = 100;
$serial = "000000000001";
$password = "(00000000)";
$ComPort = 38282 /*[USB-RS485-RS232_COM03]*/;
$maxNeustart = 5;
$Neustart = 0;
$sollDataLaenge = 350;
anfang:
if ($Neustart >= $maxNeustart) {
echo "MAXIMALE VERSUCHE VON $maxNeustart ERREICHT! Skript wurde abgebrochen!";
return;
}
$Neustart = $Neustart+1;
echo "=> Versuch $Neustart:
";
//Init
COMPort_SetOpen($ComPort, true);
IPS_ApplyChanges($ComPort);
$cmd = chr(0x2F).chr(0x3F).$serial.chr(0x21).chr(0x0D).chr(0x0A);
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
//ACK / Option Select Message senden ('Programming Mode')
$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63); //****************** Spannung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62); //****************** Strom
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000002()".chr(0x03).chr(0x61); //****************** Frequenz
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000003()".chr(0x03).chr(0x60); //****************** Wirkleistung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000004()".chr(0x03).chr(0x67); //****************** Blindleistung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000005()".chr(0x03).chr(0x66); //****************** Scheinleistung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000006()".chr(0x03).chr(0x65); //****************** Leistungsfaktor
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62); //****************** Gesamtleistung/Zählerstand
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000011()".chr(0x03).chr(0x63); //****************** Gesamtleistung/Zählerstand (Kopie von ...10)
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000020()".chr(0x03).chr(0x61); //****************** Energie in Rückwärtsrichtung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000021()".chr(0x03).chr(0x60); //****************** Energie in Rückwärtsrichtung (Kopie von ...20)
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000031()".chr(0x03).chr(0x61); //****************** Zeit (YYMMTT??hhmmss)
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000032()".chr(0x03).chr(0x62); //****************** Temperatur
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000034()".chr(0x03).chr(0x64); //****************** Seriennummer
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000035()".chr(0x03).chr(0x65); //****************** Baudrate
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000036()".chr(0x03).chr(0x66); //****************** Zähler-ID
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
COMPort_SendText($ComPort, $cmd);
COMPort_SetOpen($ComPort, false);
IPS_ApplyChanges($ComPort);
IPS_Sleep($sleep);
$data = RegVar_GetBuffer(46733 /*[Technik\Energiezähler RS485\Stromzähler 01\Register Variable]*/);
if (strlen($data) == $sollDataLaenge) {
$value = substr($data, strpos($data, "/")+1,3); //Hersteller (Antwort)
SetValueString(59160 /*[Technik\Energiezähler RS485\Stromzähler 01\Manufactur]*/,$value);
echo "Antwort Hersteller: $value
";
$value = substr($data, strpos($data, ":")+1,12); //Zähler-ID (Antwort)
echo "Antwort Zähler-ID: $value
";
SetValueString(10954 /*[Technik\Energiezähler RS485\Stromzähler 01\MeterID]*/,$value);
$value = substr($data, strpos($data, "00000000(")+9,4)/10; //Spannung / 10 V
echo "Spannung: $value V
";
SetValueFloat(31218 /*[Technik\Energiezähler RS485\Stromzähler 01\Spannung]*/,$value);
$value = substr($data, strpos($data, "00000001/")+9,4)/10; //Strom //Strom / 10 A
echo "Strom: $value A
";
SetValueFloat(51616 /*[Technik\Energiezähler RS485\Stromzähler 01\Strom]*/,$value);
$value = substr($data, strpos($data, "00000002(")+9,4)/10; //Frequenz / 10 HZ
echo "Frequenz: $value Hz
";
SetValueFloat(28965 /*[Technik\Energiezähler RS485\Stromzähler 01\Frequenz]*/,$value);
//SetValue(51097 /*[Objekt #51097 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000003(")+9,4)*10; //Wirkleistung x 10 W
echo "Wirkleistung: $value W
";
SetValueFloat(39073 /*[Technik\Energiezähler RS485\Stromzähler 01\Leistung]*/, $value);
$value = substr($data, strpos($data, "00000004(")+9,4)*10; //Blindleistung x 10 VAr (nur bei induktiver Last)
echo "Blindleistung: $value VAr
";
$value = substr($data, strpos($data, "00000005(")+9,4)*10; //Scheinleistung x 10 VA
echo "Scheinleistung: $value VA
";
$value = substr($data, strpos($data, "00000006(")+9,4)/1000; //Leistungsfaktor / 1000
echo "Leistungsfaktor: $value
";
$value = substr($data, strpos($data, "00000010(")+9,8)/1000; //Gesamtleistung/Zählerstand / 1000 kWh
//$value = str_replace(".",",",$value);
//$value = round(floatval($value),2);
echo "Zählerstand 1: $value kWh
";
SetValueFloat(27320 /*[Technik\Energiezähler RS485\Stromzähler 01\Zählerstand]*/, $value);
$value = substr($data, strpos($data, "00000010(")+9,8)/1000; //Gesamtleistung/Zählerstand / 1000 kWh (Kopie von ...10)
echo "Zählerstand 2: $value kWh
";
$value = substr($data, strpos($data, "00000020(")+9,8)/1000; //Energie in Rückwärtsrichtung / 1000 kWh
echo "Leistung auswärts 1: $value kWh
";
$value = substr($data, strpos($data, "00000021(")+9,8)/1000; //Energie in Rückwärtsrichtung / 1000 kWh (Kopie von ...20)
echo "Leistung auswärts 2: $value kWh
";
$tmp = substr($data, strpos($data, "00000031(")+9,14); //Zeit (YYMMDDxxhhmmss) xx = Tage seit Reset
$value = substr($tmp,4,2).".".substr($tmp,2,2).".20".substr($tmp,0,2)."; ".substr($tmp,8,2).":".substr($tmp,10,2).":".substr($tmp,12,2)."
";
echo "Zeit: $value";
$value = substr($data, strpos($data, "00000032(")+9,4)/1; //Temperatur / °C (ändert sich nicht)
echo "Temperatur: $value °C
";
SetValueFloat(12357 /*[Technik\Energiezähler RS485\Stromzähler 01\Temperatur]*/,$value);
$value = substr($data, strpos($data, "00000034(")+9,12); //Seriennummer
echo "Seriennummer: $value
";
$value = substr($data, strpos($data, "00000035(")+9,4)*1; //Baudrate
echo "Baudrate: $value (1=1200; 2=2400; 3=4800; 4=9600)
";
$value = substr($data, strpos($data, "00000036(")+9,12); //Zähler-ID
echo "Zähler-ID: $value
";
}else{
echo "=> Fehler Data nicht $sollDataLaenge Zeichen lang! Skriptneustart!
";
RegVar_SetBuffer(46733 /*[Technik\Energiezähler RS485\Stromzähler 01\Register Variable]*/, "");
goto anfang;
}
RegVar_SetBuffer(46733 /*[Technik\Energiezähler RS485\Stromzähler 01\Register Variable]*/, "");
echo "=> Skript wurde erfolgreich ausgeführt!";
return;