В приложении скрины
весь протокол связи соединения со счетчиком меркурий
Модератор: immortal
В приложении скрины
в итоге то данные от счетчика получаете? какой модели счетчик? данные реальны?
Меркурий 230.
Код: Выделить всё
//$ot = $this->object_title;
//setTimeOut($ot.'_updateValue','callMethod("'.$ot.'.GetValues");',10);
$address252 = '193.233.6.156';
$service_port252 =' 20252';
$device252 = '0E';
/* Создаём сокет TCP/IP. */
$socket252 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket252,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
if ($socket252 === false) {
echo "Не удалось выполнить socket_create(): причина: " . socket_strerror(socket_last_error()) . "<br>";
} else {
echo "OK.<br>";
}
echo "Пытаемся соединиться с '$address252' на порту '$service_port252'...";
$result = socket_connect($socket252, $address252, $service_port252);
if ($result === false) {
echo "Не удалось выполнить socket_connect().\nПричина: ($result) " . socket_strerror(socket_last_error($socket)) . "<br>";
} else {
echo "OK.<br>";
}
if (!function_exists('send')) {
function send ($socket252, $hex = "") {
echo "Отправляем запрос ".$hex;
$in = hex2bin($hex);
echo " ".$in." ";
socket_write($socket252, $in, strlen($in));
echo "OK.<br>";
}
}
//
//function send($socket252, $hex = "")
//{
// echo "Отправляем запрос ".$hex;
// $in = hex2bin($hex);
// echo " ".$in." ";
// socket_write($socket252, $in, strlen($in));
// echo "OK.<br>";
//}
if (!function_exists('read')) {
function read ($socket252)
{
echo "Читаем ответ:\n\n";
$out = socket_read($socket252, 2048);
echo bin2hex($out)."<br>";
return $out;
}
}
//function read($socket252)
//{
//// echo "Читаем ответ:\n\n";
/// $out = socket_read($socket252, 2048);
// echo bin2hex($out)."<br>";
// return $out;
//}
if (!function_exists('dd')) {
function dd ($data = "")
{
$result = "";
$data2 = "";
for ( $j = 0; $j < count($data); $j++ )
{
$data2 = dechex(ord($data[0]));
if ( strlen($data2) == 1 )
$result = "0".$data2;
else
$result .= $data2;
}
return $result;
}
}
//function dd($data = "")
//{
// $result = "";
// $data2 = "";
// for ( $j = 0; $j < count($data); $j++ )
// {
// $data2 = dechex(ord($data[0]));
// if ( strlen($data2) == 1 )
// $result = "0".$data2;
// else
// $result .= $data2;
// }
// return $result;
//}
if (!function_exists('merc_gd')) {
function merc_gd($socket252, $cmd, $factor = 1, $total = 0)
{
send($socket252, $cmd);
$result = read($socket252);
$ret = array();
$start_byte = 1;
if ( $total != 1 )
{
for ( $i = 0; $i < 4; $i++ )
{
if ( dechex(ord($result[$start_byte + $i * 3])) >= 40 )
$result[$start_byte + $i * 3] = chr(dechex(ord($result[$start_byte + $i * 3])) - 40);
if ( strlen($result) > $start_byte + 2 + $i * 3 )
$ret[$i] = hexdec(dd($result[$start_byte + $i * 3]).dd($result[$start_byte + $i * 3 + 2]).dd($result[$start_byte + $i * 3 + 1]))*$factor;
}
}
else
$ret[0] = hexdec(dd($result[$start_byte+1]).dd($result[$start_byte]).dd($result[$start_byte+3]).dd($result[$start_byte+2]))*$factor;
return $ret;
}}
if (!function_exists('crc16_modbus')) {
function crc16_modbus($msg)
{
$data = pack('H*',$msg);
$crc = 0xFFFF;
for ($i = 0; $i < strlen($data); $i++)
{
$crc ^=ord($data[$i]);
for ($j = 8; $j !=0; $j--)
{
if (($crc & 0x0001) !=0)
{
$crc >>= 1;
$crc ^= 0xA001;
}
else $crc >>= 1;
}
}
return sprintf('%04X', $crc);
}}
if (!function_exists('calcCRC')) {
function calcCRC($device252,$msg)
{
$mess = $device252.$msg;
$crc = crc16_modbus($mess);
return $mess.$crc[2].$crc[3].$crc[0].$crc[1];
}}
send($socket252, calcCRC($device252,"0101010101010101"));
read($socket252);
# Сила тока по фазам
# =====================================================
$Ia = merc_gd($socket252,calcCRC($device252,"081621"), 0.001);
$It = $Ia[0] + $Ia[1] + $Ia[2];
echo "Ia: $Ia[0] - $Ia[1] - $Ia[2] IaT:$It<br>";
$classname='Mercury';
$objname=$classname.'_test';
addClassObject($classname,$objname);
if ($Ia[0]) {sg($objname.'.Ia1',$Ia[0]); $sql['Ia1']=$Ia[0];}
if ($Ia[1]) {sg($objname.'.Ia2',$Ia[1]); $sql['Ia2']=$Ia[1];}
if ($Ia[2]) {sg($objname.'.Ia3',$Ia[2]); $sql['Ia3']=$Ia[2];}
if ($It) {sg($objname.'.IaT',$It); $sql['IaT']=$It;}
# Мощность по фазам
# =====================================================
$Pv = merc_gd($socket252,calcCRC($device252,"081600"), 0.01);
if ( round($Pv[0], 2) != round($Pv[1] + $Pv[2] + $Pv[3], 2) )
$error = "error"; else $error = "";
echo "Pv: $Pv[0] - $Pv[1] - $Pv[2] - $Pv[3] $error<br>";
if ($error == "")
{
sg($objname.'.PvT',round($Pv[0],0));
sg($objname.'.Pv1',$Pv[1]);
sg($objname.'.Pv2',$Pv[2]);
sg($objname.'.Pv3',$Pv[3]);
$sql['PvT']=round($Pv[0],0);
$sql['Pv1']=$Pv[1];
$sql['Pv2']=$Pv[2];
$sql['Pv3']=$Pv[3];
}
# Cosf по фазам
# =====================================================
$Cos = merc_gd($socket252,calcCRC($device252,"081630"), 0.001);
echo "Cos: $Cos[0] - $Cos[1] - $Cos[2] - $Cos[3]<br>";
if ($Cos[0]) {sg($objname.'.CosT',$Cos[0]); $sql['CosT']=$Cos[0];}
if ($Cos[0]) {sg($objname.'.Cos1',$Cos[1]); $sql['Cos1']=$Cos[1];}
if ($Cos[0]) {sg($objname.'.Cos2',$Cos[2]); $sql['Cos2']=$Cos[2];}
if ($Cos[0]) {sg($objname.'.Cos3',$Cos[3]); $sql['Cos3']=$Cos[3];}
# Напряжение по фазам
# =====================================================
$Uv = merc_gd($socket252,calcCRC($device252,"081611"), 0.01);
echo "Uv: $Uv[0] - $Uv[1] - $Uv[2]<br>";
if ($Uv[0]) {sg($objname.'.Uv1',round($Uv[0],0));$sql['Uv1']=round($Uv[0],0);}
if ($Uv[0]) {sg($objname.'.Uv2',round($Uv[1],0));$sql['Uv2']=round($Uv[1],0);}
if ($Uv[0]) {sg($objname.'.Uv3',round($Uv[2],0));$sql['Uv3']=round($Uv[2],0);}
# Показания электроэнергии
# =====================================================
$Tot = merc_gd($socket252,calcCRC($device252,"050000"), 0.001, 1);
echo "Total: $Tot[0]<br>";
if ($Tot[0]) {sg($objname.'.Total',round($Tot[0],0)); $sql['Total']=round($Tot[0],0);}
$Tot = merc_gd($socket252,calcCRC($device252,"050001"), 0.001, 1);
echo "Total T1: $Tot[0]<br>";
if ($Tot[0]) {sg($objname.'.Total1',$Tot[0]); $sql['Total1']=$Tot[0];}
$Tot = merc_gd($socket252,calcCRC($device252,"050002"), 0.001, 1);
echo "Total T2: $Tot[0]<br>";
if ($Tot[0]) {sg($objname.'.Total2',$Tot[0]);$sql['Total2']=$Tot[0];}
echo "Закрываем сокет...";
socket_close($socket252);
echo "OK.\n\n";
Счетчик то трехфазный... Заметил еще что серийный номер определяется неправильно. Мой 07054850, а в программе 754850directman66 писал(а): ↑Пт ноя 02, 2018 11:51 amС двухфазными пока не тестировал, чуть позже займусь. Пока в приоритете другие задачи и нет опытного образца.
Выкладываю сценарий, по которому забираются данные с 3х фазного счетчика. Если вам удастся его адаптировать под 2х фазный - сообщите, что изменили, внесем правки.
Код: Выделить всё
//$ot = $this->object_title; //setTimeOut($ot.'_updateValue','callMethod("'.$ot.'.GetValues");',10); $address252 = '193.233.6.156'; $service_port252 =' 20252'; $device252 = '0E'; /* Создаём сокет TCP/IP. */ $socket252 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket252,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0)); if ($socket252 === false) { echo "Не удалось выполнить socket_create(): причина: " . socket_strerror(socket_last_error()) . "<br>"; } else { echo "OK.<br>"; } echo "Пытаемся соединиться с '$address252' на порту '$service_port252'..."; $result = socket_connect($socket252, $address252, $service_port252); if ($result === false) { echo "Не удалось выполнить socket_connect().\nПричина: ($result) " . socket_strerror(socket_last_error($socket)) . "<br>"; } else { echo "OK.<br>"; } if (!function_exists('send')) { function send ($socket252, $hex = "") { echo "Отправляем запрос ".$hex; $in = hex2bin($hex); echo " ".$in." "; socket_write($socket252, $in, strlen($in)); echo "OK.<br>"; } } // //function send($socket252, $hex = "") //{ // echo "Отправляем запрос ".$hex; // $in = hex2bin($hex); // echo " ".$in." "; // socket_write($socket252, $in, strlen($in)); // echo "OK.<br>"; //} if (!function_exists('read')) { function read ($socket252) { echo "Читаем ответ:\n\n"; $out = socket_read($socket252, 2048); echo bin2hex($out)."<br>"; return $out; } } //function read($socket252) //{ //// echo "Читаем ответ:\n\n"; /// $out = socket_read($socket252, 2048); // echo bin2hex($out)."<br>"; // return $out; //} if (!function_exists('dd')) { function dd ($data = "") { $result = ""; $data2 = ""; for ( $j = 0; $j < count($data); $j++ ) { $data2 = dechex(ord($data[0])); if ( strlen($data2) == 1 ) $result = "0".$data2; else $result .= $data2; } return $result; } } //function dd($data = "") //{ // $result = ""; // $data2 = ""; // for ( $j = 0; $j < count($data); $j++ ) // { // $data2 = dechex(ord($data[0])); // if ( strlen($data2) == 1 ) // $result = "0".$data2; // else // $result .= $data2; // } // return $result; //} if (!function_exists('merc_gd')) { function merc_gd($socket252, $cmd, $factor = 1, $total = 0) { send($socket252, $cmd); $result = read($socket252); $ret = array(); $start_byte = 1; if ( $total != 1 ) { for ( $i = 0; $i < 4; $i++ ) { if ( dechex(ord($result[$start_byte + $i * 3])) >= 40 ) $result[$start_byte + $i * 3] = chr(dechex(ord($result[$start_byte + $i * 3])) - 40); if ( strlen($result) > $start_byte + 2 + $i * 3 ) $ret[$i] = hexdec(dd($result[$start_byte + $i * 3]).dd($result[$start_byte + $i * 3 + 2]).dd($result[$start_byte + $i * 3 + 1]))*$factor; } } else $ret[0] = hexdec(dd($result[$start_byte+1]).dd($result[$start_byte]).dd($result[$start_byte+3]).dd($result[$start_byte+2]))*$factor; return $ret; }} if (!function_exists('crc16_modbus')) { function crc16_modbus($msg) { $data = pack('H*',$msg); $crc = 0xFFFF; for ($i = 0; $i < strlen($data); $i++) { $crc ^=ord($data[$i]); for ($j = 8; $j !=0; $j--) { if (($crc & 0x0001) !=0) { $crc >>= 1; $crc ^= 0xA001; } else $crc >>= 1; } } return sprintf('%04X', $crc); }} if (!function_exists('calcCRC')) { function calcCRC($device252,$msg) { $mess = $device252.$msg; $crc = crc16_modbus($mess); return $mess.$crc[2].$crc[3].$crc[0].$crc[1]; }} send($socket252, calcCRC($device252,"0101010101010101")); read($socket252); # Сила тока по фазам # ===================================================== $Ia = merc_gd($socket252,calcCRC($device252,"081621"), 0.001); $It = $Ia[0] + $Ia[1] + $Ia[2]; echo "Ia: $Ia[0] - $Ia[1] - $Ia[2] IaT:$It<br>"; $classname='Mercury'; $objname=$classname.'_test'; addClassObject($classname,$objname); if ($Ia[0]) {sg($objname.'.Ia1',$Ia[0]); $sql['Ia1']=$Ia[0];} if ($Ia[1]) {sg($objname.'.Ia2',$Ia[1]); $sql['Ia2']=$Ia[1];} if ($Ia[2]) {sg($objname.'.Ia3',$Ia[2]); $sql['Ia3']=$Ia[2];} if ($It) {sg($objname.'.IaT',$It); $sql['IaT']=$It;} # Мощность по фазам # ===================================================== $Pv = merc_gd($socket252,calcCRC($device252,"081600"), 0.01); if ( round($Pv[0], 2) != round($Pv[1] + $Pv[2] + $Pv[3], 2) ) $error = "error"; else $error = ""; echo "Pv: $Pv[0] - $Pv[1] - $Pv[2] - $Pv[3] $error<br>"; if ($error == "") { sg($objname.'.PvT',round($Pv[0],0)); sg($objname.'.Pv1',$Pv[1]); sg($objname.'.Pv2',$Pv[2]); sg($objname.'.Pv3',$Pv[3]); $sql['PvT']=round($Pv[0],0); $sql['Pv1']=$Pv[1]; $sql['Pv2']=$Pv[2]; $sql['Pv3']=$Pv[3]; } # Cosf по фазам # ===================================================== $Cos = merc_gd($socket252,calcCRC($device252,"081630"), 0.001); echo "Cos: $Cos[0] - $Cos[1] - $Cos[2] - $Cos[3]<br>"; if ($Cos[0]) {sg($objname.'.CosT',$Cos[0]); $sql['CosT']=$Cos[0];} if ($Cos[0]) {sg($objname.'.Cos1',$Cos[1]); $sql['Cos1']=$Cos[1];} if ($Cos[0]) {sg($objname.'.Cos2',$Cos[2]); $sql['Cos2']=$Cos[2];} if ($Cos[0]) {sg($objname.'.Cos3',$Cos[3]); $sql['Cos3']=$Cos[3];} # Напряжение по фазам # ===================================================== $Uv = merc_gd($socket252,calcCRC($device252,"081611"), 0.01); echo "Uv: $Uv[0] - $Uv[1] - $Uv[2]<br>"; if ($Uv[0]) {sg($objname.'.Uv1',round($Uv[0],0));$sql['Uv1']=round($Uv[0],0);} if ($Uv[0]) {sg($objname.'.Uv2',round($Uv[1],0));$sql['Uv2']=round($Uv[1],0);} if ($Uv[0]) {sg($objname.'.Uv3',round($Uv[2],0));$sql['Uv3']=round($Uv[2],0);} # Показания электроэнергии # ===================================================== $Tot = merc_gd($socket252,calcCRC($device252,"050000"), 0.001, 1); echo "Total: $Tot[0]<br>"; if ($Tot[0]) {sg($objname.'.Total',round($Tot[0],0)); $sql['Total']=round($Tot[0],0);} $Tot = merc_gd($socket252,calcCRC($device252,"050001"), 0.001, 1); echo "Total T1: $Tot[0]<br>"; if ($Tot[0]) {sg($objname.'.Total1',$Tot[0]); $sql['Total1']=$Tot[0];} $Tot = merc_gd($socket252,calcCRC($device252,"050002"), 0.001, 1); echo "Total T2: $Tot[0]<br>"; if ($Tot[0]) {sg($objname.'.Total2',$Tot[0]);$sql['Total2']=$Tot[0];} echo "Закрываем сокет..."; socket_close($socket252); echo "OK.\n\n";