Probleme mit Solarlog 50 (auslesen)

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);}
?>
`

Wäre es nicht einfacher, wenn du unsere integrierte ModBus Anbindung nutzt?

paresy

Ich habe dieses Script leider nicht selber geschrieben und dementsprechend nicht so fit in der Scriptsprache. Gibt es denn mit der integrierten ModBus Anbindung ein fertige Lösung für den Solarlog die ich übernehmen könnte?

Ähmm, soweit ich weiß hat der Solar-Log 50 keine API Schnittstelle. Deswegen hab ich vor 2 Jahren alle Anlagen auf den Solar-Log Base 15 umgestellt. Dort könnte ich Dir weiterhelfen. Die Base Reihe hat eine Modbus und JSON Schnittstelle. Dafür wünsche ich mir auch ein Modul / IP-Symcon Unterstützung @paresy :slight_smile: