Код: Выделить всё
#!/usr/bin/env php
<?
require_once 'connect.php';
function merc_rd($result1, $factor = 1, $total = 0)
{
$ret = array();
if ( $total != 1 )
{
for ( $i = 0; $i < 4; $i++ )
{
if ( dechex(ord($result1[1 + $i * 3])) >= 40 )
$result1[1 + $i * 3] = chr(dechex(ord($result1[1 + $i * 3])) - 40);
if ( strlen($result1) > 3 + $i * 3 )
$ret[$i] = hexdec(dd($result1[1 + $i * 3]).dd($result1[1 + $i * 3 + 2]).dd($result1[1 + $i * 3 + 1]))*$factor;
}
}
else
$ret[0] = hexdec(dd($result1[2]).dd($result1[1]).dd($result1[4]).dd($result1[3]))*$factor;
return $ret;
}
function dd($data = "")
{
$result1 = "";
$data2 = "";
for ( $j = 0; $j < count($data); $j++ )
{
$data2 = dechex(ord($data[0]));
if ( strlen($data2) == 1 )
$result1 = "0".$data2;
else
$result1 .= $data2;
}
return $result1;
}
// Read answer from device with 500ms timeout
function rd($fp)
{
$result = '';
$c = '';
#stream_set_blocking($fp,0);
$timeout=microtime(1)+0.5;
while (microtime(1)<$timeout) {
$c=fgetc($fp);
if($c === false){
usleep(5);
continue;
}
$result .= $c;
}
return $result;
}
// Parameters for port
#======================================================
exec('/bin/stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -parenb -cstopb');
#======================================================*
# Open port *
#======================================================*
$fp = fopen("/dev/ttyUSB0", "r+");
if (!$fp) {
echo "Error opening port";
die();
}
stream_set_blocking($fp,0);
# ------------------Тут будет начало цикла---------------*
#========================================================*
# Инициализация соединения, передача пароля *
# 0x5e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xc7,0xe2 *
#========================================================*
$command = explode(',', '0x5e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xc7,0xe2');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
#======================================================*
# Дата и время по счетчику *
# 0x5e,0x04,0x00,0x12,0xd2 *
#======================================================*
$command = explode(',', '0x5e,0x04,0x00,0x12,0xd2');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$mon=dechex(ord($result[6]));
*********************
дальше идет запрос напряжения по фазам, силы тока по фазам, мощности активной и реактивной, cosF, показания счетчика, общего и по тарифам, потребления за текущий год по тарифам.
*********************
затем потребление за текущий месяц:
switch ($mon) {
case 1:
#======================================================*
# Потребленная энергия за месяц 1, общая *
# 0x5e,0x05,0x31,0x00,0x16,0x5d *
#======================================================*
$command = explode(',', '0x5e,0x05,0x31,0x00,0x16,0x5d');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1Tcurm = merc_rd($result, 0.001, 1);
#======================================================*
# Потребленная энергия за месяц 1, тариф1 *
# 0x5e,0x05,0x31,0x01,0xd7,0x9d *
#======================================================*
$command = explode(',', '0x5e,0x05,0x31,0x01,0xd7,0x9d');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1T1curm = merc_rd($result, 0.001, 1);
#======================================================*
# Потребленная энергия за месяц 1, тариф2 *
# 0x5e,0x05,0x31,0x02,0x97,0x9c *
#======================================================*
$command = explode(',', '0x5e,0x05,0x31,0x02,0x97,0x9c');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1T2curm = merc_rd($result, 0.001, 1);
break;
case 2:
...
Все это пока запоминаем в переменных
дальше, первого января, определяем потребление за предыдущий год, и если его нет в базе - записываем:
$cur_min = date("i");
$cur_h = date("G");
$cur_d = date("j");
$cur_m = date("n");
$cur_y = date("Y");
$prev_y = $cur_y - 1;
if ($cur_d==1 and $cur_m==1 and $cur_h==2 and (10 <= $cur_min or $cur_min >= 15)) {
$result_sql = $link->query("SELECT * FROM `archive` WHERE `ID`=1 AND `Month`=13 AND `Year`=$prev_y");
if ($result_sql->num_rows === 0) {
#======================================================*
# Потребленная энергия за предыдущий год, общая *
# 0x5e,0x05,0x20,0x00,0x1a,0x0d *
#======================================================*
$command = explode(',', '0x5e,0x05,0x20,0x00,0x1a,0x0d');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1Tpy = merc_rd($result, 0.001, 1);
#======================================================*
# Потребленная энергия за предыдущий год, тариф1 *
# 0x5e,0x05,0x20,0x01,0xdb,0xcd *
#======================================================*
$command = explode(',', '0x5e,0x05,0x20,0x01,0xdb,0xcd');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1T1py = merc_rd($result, 0.001, 1);
#======================================================*
# Потребленная энергия за предыдущий год, тариф2 *
# 0x5e,0x05,0x20,0x02,0x9b,0xcc *
#======================================================*
$command = explode(',', '0x5e,0x05,0x20,0x02,0x9b,0xcc');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1T2py = merc_rd($result, 0.001, 1);
$result_sql = $link->query("INSERT INTO `archive`(`ID`, `Year`, `Month`, `Tot`, `Tot1`, `Tot2`) VALUES (1,$prev_y,13,$v1Tpy[0],$v1T1py[0],$v1T2py[0])");
}
*************
дальше каждый месяц первого числа скрипт проверяет наличие в архиве записей за предыдущие 11 месяцев(эта информация хранится в счетчиках) и при ее отсутствии записывает в базу:
if ($cur_d==1 and $cur_h==2 and (10 <= $cur_min or $cur_min >= 15)) {
if ($cur_m <> 1) {
$y = $cur_y;
$result_sql = $link->query("SELECT * FROM `archive` WHERE `ID`=1 AND `Month`=1 AND `Year`=$y");
if ($result_sql->num_rows === 0) {
#======================================================*
# Потребленная энергия за месяц 1, общая *
# 0x5e,0x05,0x31,0x00,0x16,0x5d *
#======================================================*
$command = explode(',', '0x5e,0x05,0x31,0x00,0x16,0x5d');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1Tm01 = merc_rd($result, 0.001, 1);
#======================================================*
# Потребленная энергия за месяц 1, тариф1 *
# 0x5e,0x05,0x31,0x01,0xd7,0x9d *
#======================================================*
$command = explode(',', '0x5e,0x05,0x31,0x01,0xd7,0x9d');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1T1m01 = merc_rd($result, 0.001, 1);
#======================================================*
# Потребленная энергия за месяц 1, тариф2 *
# 0x5e,0x05,0x31,0x02,0x97,0x9c *
#======================================================*
$command = explode(',', '0x5e,0x05,0x31,0x02,0x97,0x9c');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1T2m01 = merc_rd($result, 1, 1);
$result_sql = $link->query("INSERT INTO `archive`(`ID`, `Year`, `Month`, `Tot`, `Tot1`, `Tot2`) VALUES (1,$y,1,$v1Tm01[0],$v1T1m01[0],$v1T2m01[0])");
}
}
if ($cur_m <> 2) {
if ($cur_m > 2) $y = $cur_y;
if ($cur_m < 2) $y = $cur_y - 1;
$result_sql = $link->query("SELECT * FROM `archive` WHERE `ID`=1 AND `Month`=2 AND `Year`=$y");
if ($result_sql->num_rows === 0) {
#======================================================*
# Потребленная энергия за месяц 2, общая *
# 0x5e,0x05,0x32,0x00,0x16,0xad *
#======================================================*
$command = explode(',', '0x5e,0x05,0x32,0x00,0x16,0xad');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1Tm02 = merc_rd($result, 0.001, 1);
#======================================================*
# Потребленная энергия за месяц 2, тариф1 *
# 0x5e,0x05,0x32,0x01,0xd7,0x6d *
#======================================================*
$command = explode(',', '0x5e,0x05,0x32,0x01,0xd7,0x6d');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1T1m02 = merc_rd($result, 0.001, 1);
#======================================================*
# Потребленная энергия за месяц 2, тариф2 *
# 0x5e,0x05,0x32,0x02,0x97,0x6c *
#======================================================*
$command = explode(',', '0x5e,0x05,0x32,0x02,0x97,0x6c');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
$v1T2m02 = merc_rd($result, 0.001, 1);
$result_sql = $link->query("INSERT INTO `archive`(`ID`, `Year`, `Month`, `Tot`, `Tot1`, `Tot2`) VALUES (1,$y,2,$v1Tm02[0],$v1T1m02[0],$v1T2m02[0])");
}
}
...
затем завершение соединения со счетчиком и запись в базу "мгновенных значений из переменных:
#*---------------------------------------------------------------------------------------------------------------------------*
#======================================================*
# Завершение соединения *
# 0x5e,0x02,0xb8,0x11 *
#======================================================*
$command = explode(',', '0x5e,0x02,0xb8,0x11');
$c = "";
for ($i=0; $i < count($command); $i++) {$c .= chr(intval($command[$i],16));}
fwrite($fp, $c);
$result = rd($fp);
#-----------------------------*
$result_sql = $link->query("INSERT INTO `momentVars`(`ID`, `Date`, `U1`, `U2`, `U3`, `I1`, `I2`, `I3`, `P0`, `P1`, `P2`, `P3`, `S0`, `S1`, `S2`, `S3`, `cosF0`, `cosF1`, `cosF2`, `cosF3`, `Tot`, `Tot1`, `Tot2`, `Tcur_m`, `T1cur_m`, `T2cur_m`, `Tcur_y`, `T1cur_y`, `T2cur_y`) VALUES (1,null,$v1U[0],$v1U[1],$v1U[2],$v1I[0],$v1I[1],$v1I[2],$v1p0,$v1p1,$v1p2,$v1p3,$v1s0,$v1s1,$v1s2,$v1s3,$v1cosf[0],$v1cosf[1],$v1cosf[2],$v1cosf[3],$v1tot[0],$v1tot1[0],$v1tot2[0],$v1Tcurm[0],$v1T1curm[0],$v1T2curm[0],$v1Tcy[0],$v1T1cy[0],$v1T2cy[0])");
*************
Дальше все повторяется для Ввода №2.
...
После этого ежедневно очищается таблица мгновенных значений от "старых" записей
#-----------------------------*
if ($cur_h==1 and (10 <= $cur_min or $cur_min >=15)) {
$result_sql = $link->query("DELETE FROM `momentVars` WHERE `Date` < DATE_SUB(NOW(), INTERVAL 7 DAY)");
}
#-----------------Тут будет конец цикла-----------------*
fclose($fp);
?>