Код: Выделить всё
<?
// BUS Type: RS485 or CAN
define('BUS', 'CAN');
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, "x00x01x01x01x01x01x01x01x01x77x81", 11);
usleep_win($sleep_time);
$result = dio_read($fd, 15);
$n = 0;
$total_cnt = 90;
$total_cnt1 = 1080;
while ( $n == 0 )
{
# Сила тока по фазам
# =====================================================
$Ia = merc_gd("x00x08x16x21x4Fx9E", 0.001);
echo "Ia: $Ia[0] - $Ia[1] - $Ia[2]";
$It = $Ia[0] + $Ia[1] + $Ia[2];
# Мощность по фазам
# =====================================================
$Pv = merc_gd("x00x08x16x00x8Fx86", 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("x00x08x16x30x8Fx92", 0.001);
echo "Cos: $Cos[0] - $Cos[1] - $Cos[2] - $Cos[3]";
# Напряжение по фазам
# =====================================================
$Uv = merc_gd("x00x08x16x11x4Fx8A", 0.01);
echo "Uv: $Uv[0] - $Uv[1] - $Uv[2]";
$total_cnt++;
if ( $total_cnt >= 90 )
{
// Общее потребление
$Tot = merc_gd("x00x05x00x00x10x25", 0.001, 1);
echo "Total: $Tot[0]";
$Tot = merc_gd("x00x05x00x01xD1xE5", 0.001, 1);
echo "Total T1: $Tot[0]";
$Tot = merc_gd("x00x05x00x02x91xE4", 0.001, 1);
echo "Total T2: $Tot[0]";
// За текущие сутки
$Tot = merc_gd("x00x05x40x00x21xE5", 0.001, 1);
echo "Total cur: $Tot[0]";
// За текущие сутки (Тариф 1)
$Tot = merc_gd("x00x05x40x01xE0x25", 0.001, 1);
echo "Total cur T1: $Tot[0]";
// За текущие сутки (Тариф 2)
$Tot = merc_gd("x00x05x40x02xA0x24", 0.001, 1);
echo "Total cur T2: $Tot[0]";
$total_cnt = 0;
}
$total_cnt1++;
if ( $total_cnt1 >= 1080 )
{
// За предыдущие сутки
$Tot = merc_gd("x00x05x50x00x2Cx25", 0.001, 1);
echo "Total prev: $Tot[0]";
// За предыдущие сутки (Тариф 1)
$Tot = merc_gd("x00x05x50x01xEDxE5", 0.001, 1);
echo "Total prev T1: $Tot[0]";
// За предыдущие сутки (Тариф 2)
$Tot = merc_gd("x00x05x50x02xADxE4", 0.001, 1);
echo "Total prev T2: $Tot[0]";
$total_cnt1 = 0;
}
sleep(10);
}
# Завершение соединения
dio_write($fd, "x00x02x80x71", 4);
usleep_win($sleep_time);
$result = dio_read($fd, 8);
dio_close($fd);
?>