ik zit een beetje vast.
Zijn er mensen die ervaring hebben met het uitlezen met modbus-tcp?
Ik wil mijn data uitlezen van mijn Solaredge inverter.
Ik weet dat er kant en klare oplossingen zijn op internet maar ik wil het zelf schrijven.
Om een of andere manier krijg ik geen output.
Modbus over tcp heb ik ingeschakeld op mijn inverter, heb ik getest met een werkend python scriptje en die geeft output.
(opm.: mochten er mensen zijn die willen weten hoe je modbus-tcp enabled opSolaredge wil ik dit met harte wel uitleggen)
Aan de code is te zien dat ik veel opties heb uitgeprobeerd....
in het sunspec pdf staat ook in de appendix dat er 2 methodes zijn (met en zonder offset 40001 wat erg verwarrend is)
<?php
$id = 1; //1
$fc = 3;
$offset = 0; //70, ...107
$length = 122; //39, ..3
//Appendix A – Supported MODBUS Request Methods
//SolarEdge has implemented two methods of the MODBUS request procedure:
//MODBUS request without explicit addressing – supported by communication board CPU version 2.478 and above. For example:
//$offset_h = floor($offset/256);
//$offset_l = $offset-$offset_h*256;
//MODBUS request with explicit register addressing - supported by all communication board CPU versions. For example:
$offset_h = floor(($offset+40000)/256);
$offset_l = ($offset+40000)-$offset_h*256;
$length_h = floor($length/256);
$length_l = $length-$length_h*256;
//$crc = crc16(chr(0).chr($id).chr(0).chr($fc).chr($offset_h).chr($offset_l).chr($length_h).chr($length_l));
$crc = crc16(chr($id).chr($fc).chr($offset_h).chr($offset_l).chr($length_h).chr($length_l));
$crc_h = floor($crc/256);
$crc_l = $crc-$crc_h*256;
if ($id<10) {$id0 = "0";} else {$id0 = "";}
if ($fc<10) {$fc0 = "0";} else {$fc0 = "";}
if ($offset_h<10) {$offset_h0 = "0";} else {$offset_h0 = "";}
if ($offset_l<10) {$offset_l0 = "0";} else {$offset_l0 = "";}
if ($length_h<10) {$length_h0 = "0";} else {$length_h0 = "";}
if ($length_l<10) {$length_l0 = "0";} else {$length_l0 = "";}
if ($crc_h<10) {$crc_h0 = "0";} else {$crc_h0 = "";}
if ($crc_l<10) {$crc_l0 = "0";} else {$crc_l0 = "";}
//$senddata = chr(0).chr($id).chr(0).chr($fc).chr($offset_h).chr($offset_l).chr($length_h).chr($length_l).chr($crc_l).chr($crc_h);
$senddata = chr($id).chr($fc).chr($offset_h).chr($offset_l).chr($length_h).chr($length_l).chr($crc_l).chr($crc_h);
//without crc ...
//$senddata = chr($id).chr($fc).chr($offset_h).chr($offset_l).chr($length_h).chr($length_l);
$senddata2 = $id0.dechex($id)." ".$fc0.dechex($fc)." ".$offset_h0.dechex($offset_h).$offset_l0.dechex($offset_l)." ".$length_h0.dechex($length_h).$length_l0.dechex($length_l)." ".$crc_l0.dechex($crc_l).$crc_h0.dechex($crc_h);
//$senddata = "11 03 006B 0003 7687";
//$senddata = "1103006B00037687";
//print $senddata."<br />\n";
print $senddata2."<br />\n";
//print dechex($id)." ".dechex($fc)." ".dechex($offset_h).dechex($offset_l)." ".dechex($length_h).dechex($length_l)." ";
//print dechex($crc_l).dechex($crc_h);
//set_time_limit(0);
$fp = fsockopen("192.168.0.192", 502, $errno, $errstr, 3);
if(!$fp)
{
print "can\'t connect modbus tcp device<br />\n";
die();
}
else{
print "Connected to modbus<br />\n";
//11 03 0046 0027 xxxx //request 40070 +27 xxxx is crc check
//stream_set_timeout($socketHandler, 2);
write($fp, $senddata);
//write($fp, $senddata,strlen($senddata));
//set_socket_blocking($fp,true);
//fputs($fp, $senddata);
$response = '';
while (!feof($fp)) {
//echo fgets($fp, 128);
//stream_set_timeout($socketHandler, 2);
//$line[] = fgets($fp, 128);
$line[] = fgets($fp);
//echo fgets($fp);
//echo fread($fp,255);
//$response = stream_get_contents($fp);
//$line[] = fread($fp);
//$response .= fgets($fp, 128); // If you expect an answer
}
print $response;
foreach ($line as $key => $value) {
print $key+$offset.":".intval($value)."<br />\n";
}
}
fclose($fp);
function crc16($data) {
$crc16 = 0xFFFF;
for ($i = 0; $i < strlen($data); $i++)
{
$crc16 ^=ord($data[$i]);
for ($j = 8; $j !=0; $j--)
{
if (($crc16 & 0x0001) !=0)
{
$crc16 >>= 1;
$crc16 ^= 0xA001;
}
else
$crc16 >>= 1;
}
}
return $crc16;
}
?>