Сообщение
Victor_S » Пн апр 06, 2015 11:43 am
Счетчики Меркурий 236, но до соединения не доходит, проблема в открытии порта.
Пробую так:
<?
// BUS Type: RS485 or CAN
define('BUS', 'RS485');
###### WIN32 WORKAROUND
// Helper function
function getmicrotime(){
list($usec, $sec) = explode(' ',microtime());
return ((float)$usec + (float)$sec);
}
// usleep alias function for windows
function msleep($micro_seconds=0) {
$stop = getmicrotime() + ($micro_seconds / 1000);
while (getmicrotime() <= $stop) {
// loop
}
return true;
}
/*
function usleep_win($msec) {
$usec = $msec * 1000;
socket_select($read = NULL, $write = NULL, $sock = array(socket_create (AF_INET, SOCK_RAW, 0)), 0, $usec);
}
*/
function usleep_win($msec) {
usleep($msec * 1000);
}
exec('mode com3: baud=9600 data=8 stop=1 parity=n xon=off');
$fd = dio_open('COM3', O_RDWR);
###### WIN32 WORKAROUND
##### FOR LINUX BOX
//dio_fcntl($fd, F_SETFL, O_SYNC);
/*
dio_tcsetattr($fd, array(
'baud' => 9600,
'bits' => 8,
'stop' => 1,
'parity' => 0
));
*/
##############
function merc_gd($cmd, $factor = 1, $total = 0)
{
global $fd;
global $sleep_time;
usleep_win(50);
flush();
dio_write($fd, $cmd, 6);
usleep_win($sleep_time);
$result = dio_read($fd, 64);
$ret = array();
if ( BUS == "CAN" )
$start_byte = 7;
else
$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;
}
$sleep_time = 200;
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;
}
# Инициализация соединения, передача пароля
dio_write($fd, "\x00\x01\x01\x01\x01\x01\x01\x01\x01\x77\x81", 11);
usleep_win($sleep_time);
$result = dio_read($fd, 15);
$n = 0;
$total_cnt = 90;
$total_cnt1 = 1080;
while ( $n == 0 )
{
# Сила тока по фазам
# =====================================================
$Ia = merc_gd("\x00\x08\x16\x21\x4F\x9E", 0.001);
echo "Ia: $Ia[0] - $Ia[1] - $Ia[2]";
$It = $Ia[0] + $Ia[1] + $Ia[2];
# Мощность по фазам
# =====================================================
$Pv = merc_gd("\x00\x08\x16\x00\x8F\x86", 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";
# Cosf по фазам
# =====================================================
$Cos = merc_gd("\x00\x08\x16\x30\x8F\x92", 0.001);
echo "Cos: $Cos[0] - $Cos[1] - $Cos[2] - $Cos[3]";
# Напряжение по фазам
# =====================================================
$Uv = merc_gd("\x00\x08\x16\x11\x4F\x8A", 0.01);
echo "Uv: $Uv[0] - $Uv[1] - $Uv[2]";
$total_cnt++;
if ( $total_cnt >= 90 )
{
// Общее потребление
$Tot = merc_gd("\x00\x05\x00\x00\x10\x25", 0.001, 1);
echo "Total: $Tot[0]";
$Tot = merc_gd("\x00\x05\x00\x01\xD1\xE5", 0.001, 1);
echo "Total T1: $Tot[0]";
$Tot = merc_gd("\x00\x05\x00\x02\x91\xE4", 0.001, 1);
echo "Total T2: $Tot[0]";
// За текущие сутки
$Tot = merc_gd("\x00\x05\x40\x00\x21\xE5", 0.001, 1);
echo "Total cur: $Tot[0]";
// За текущие сутки (Тариф 1)
$Tot = merc_gd("\x00\x05\x40\x01\xE0\x25", 0.001, 1);
echo "Total cur T1: $Tot[0]";
// За текущие сутки (Тариф 2)
$Tot = merc_gd("\x00\x05\x40\x02\xA0\x24", 0.001, 1);
echo "Total cur T2: $Tot[0]";
$total_cnt = 0;
}
$total_cnt1++;
if ( $total_cnt1 >= 1080 )
{
// За предыдущие сутки
$Tot = merc_gd("\x00\x05\x50\x00\x2C\x25", 0.001, 1);
echo "Total prev: $Tot[0]";
// За предыдущие сутки (Тариф 1)
$Tot = merc_gd("\x00\x05\x50\x01\xED\xE5", 0.001, 1);
echo "Total prev T1: $Tot[0]";
// За предыдущие сутки (Тариф 2)
$Tot = merc_gd("\x00\x05\x50\x02\xAD\xE4", 0.001, 1);
echo "Total prev T2: $Tot[0]";
$total_cnt1 = 0;
}
sleep(10);
}
# Завершение соединения
dio_write($fd, "\x00\x02\x80\x71", 4);
usleep_win($sleep_time);
$result = dio_read($fd, 8);
dio_close($fd);
?>
И так:
<?php
exec('mode COM3: baud=9600 data=8 stop=1 parity=n xon=off');
// Несмотря на настройки, порт правильно не откравается, перед запуском скрипта надо запустить родной софт
// причины такого поведения пока не выяснены
$f = fopen("COM3","r+");
$i=0;
$cmd = array(0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x77,0x81); // Команда "Мгновенные значения"
$c="";
for($i=0; $i < count($cmd); $i++){$c .= chr($cmd[$i]);} // Сформировать строку символов для посылки в COM-порт
fwrite($f,$c);
$result=fread($f,15);
echo "1: $result";
fclose($f);
?>