Hallo Zusammen,
bisher hatte ich einen Solarlog 200 und habe dieses Script unten zum Auslesen der aktuellen Daten benutzt. Das hat bisher super funktioniert. Jetzt habe ich weil der Solarlog defekt war auf einen Solar Log 50 umgestellt. Modbus TCP Port soll nach Anleitung nach wie vor 502 sein. Es klappt aber nicht. Als Fehlermeldung kommt:
undefined offeset: 11 in /var/lib/symcon/scripts/53452.ips.php on line 33
In Line 33 findet sich aber nur:
$hex = $arr_modbus_receive[11].$arr_modbus_receive[12].$arr_modbus_receive[9].$arr_modbus_receive[10];
Ich vermute mal es stimmt was nicht mit der Kommunikation. Hat irgendjemand eine Idee?
SCRIPT
`<?
$ClientSocket_ID = 56802;
$RegisterVariable_ID = 17029;
//***************modbusadressen
$adressen=array (
‚pv_akt_ertrag‘=> array (‚modbus adresse‘=> ‚0D AE‘ ,‚id‘ =>35411,‚nummer‘=>‚01‘),
‚pv_akt_verbrauch‘=> array (‚modbus adresse‘=> ‚0D BE‘,‚id‘ =>40833 ,‚nummer‘=>‚02‘),
‚pv_akt_netz‘=> array (‚modbus adresse‘=> ‚00 00‘,‚id‘ =>33886 ,‚nummer‘=>‚03‘), //adr nur Platzhalter für array notwendig?
‚pv_tagesertrag‘=> array (‚modbus adresse‘=> ‚0D B4‘,‚id‘ =>51844,‚nummer‘=>‚04‘),
‚pv_tagesverbrauch‘=> array (‚modbus adresse‘=> ‚0D C0‘,‚id‘ =>47822,‚nummer‘=>‚05‘));
$sendetext='ab 16 00 00 00 06 01 04 xx xx 00 02';
switch ($IPS_SENDER)
{case „TimerEvent“: // sendet anfrage an solar-log
case „Execute“:
IPS_SetProperty($ClientSocket_ID, „Open“,true); //I/O Instanz soll aktiviert sein.
IPS_ApplyChanges($ClientSocket_ID);
$s1=str_replace(„ab“, $adressen[‚pv_akt_ertrag‘][‚nummer‘],$sendetext);//nummer eintragen
modbus_send($RegisterVariable_ID, str_replace(„xx xx“, $adressen[‚pv_akt_ertrag‘][‚modbus adresse‘],$s1));
$s2=str_replace(„ab“, $adressen[‚pv_akt_verbrauch‘][‚nummer‘],$sendetext);//nummer eintragen
modbus_send($RegisterVariable_ID, str_replace(„xx xx“, $adressen[‚pv_akt_verbrauch‘][‚modbus adresse‘],$s2));
$s4=str_replace(„ab“, $adressen[‚pv_tagesertrag‘][‚nummer‘],$sendetext);//nummer eintragen
modbus_send($RegisterVariable_ID, str_replace(„xx xx“, $adressen[‚pv_tagesertrag‘][‚modbus adresse‘],$s4));
$s5=str_replace(„ab“, $adressen[‚pv_tagesverbrauch‘][‚nummer‘],$sendetext);//nummer eintragen
modbus_send($RegisterVariable_ID, str_replace(„xx xx“, $adressen[‚pv_tagesverbrauch‘][‚modbus adresse‘],$s5));
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;
//zuordnung der werte zur adresse
switch ($arr_modbus_receive[0])
{case 1://aktueller Ertrag
$pv_E=($value);
setvalue($adressen['pv_akt_ertrag']['id'],$value); break;
case 2://akttueller Verbrauch
$pv_V=($value);
setvalue($adressen['pv_akt_verbrauch']['id'],$value); break;
case 3://akt Netzbezug bzw Netzeinspeisung
$akt_netz=(($pv_E) - ($pv_V));
setvalue($adressen['pv_akt_netz']['id'],$akt_netz); break;
case 4://Tagesertrag
$summe_ertrag=($value/1000);
setvalue ($adressen['pv_tagesertrag']['id'], $summe_ertrag); break;
case 5://Tagesverbrauch
$summe_verbrauch=($value/1000);
setvalue ($adressen['pv_tagesverbrauch']['id'], $summe_verbrauch); break;
// socket schliessen
IPS_SetProperty($ClientSocket_ID, "Open",false); //I/O Instanz soll aktiviert sein.
IPS_ApplyChanges($ClientSocket_ID);
break; }
break;
}
//******** fc’s*********************************************
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(40);}
?>
`