Вопрос знатокам PHP под Win

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Вопрос знатокам PHP под Win

Сообщение Victor_S » Чт апр 09, 2015 8:46 am

Уточнения по предыдущему вопросу, где получаю разные результаты...
Как оказалось, вот такой формат команды работает нормально:
dio_write($fd, "\x5e\x01\x01\x01\x01\x01\x01\x01\x01\xc7\xe2", 11);
а такой приводит к ошибке:
dio_write($fd, '\x5e\x01\x01\x01\x01\x01\x01\x01\x01\xc7\xe2', 11);
т.е. нужно в функции использовать именно двойные кавычки ", а не '.
В чем тут фишка? И ка это отразить в данной конструкции:
dio_write($fd, gg('M236v1.cInit'), 11);
если данное свойство мы устанавливаем командой:
$cmdInit = '\x'.$addr.'\x01\x01\x01\x01\x01\x01\x01\x01\x'.$crc[1].'\x'.$crc[0];
$this->setProperty('cInit',$cmdInit);
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Вопрос знатокам PHP под Win

Сообщение LutsenkoDenis » Чт апр 09, 2015 9:28 am

Про кавычки: Если указывать переменную в двойных кавычках, то php будет проверять всю строку на наличие в ней переменных, что занимает время, а в одинарных кавычках интерпретируется просто как последовательность символов, как текст.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Вопрос знатокам PHP под Win

Сообщение Victor_S » Чт апр 09, 2015 9:41 am

Суть проблемы я уже уловил...:) пока ничего не могу придумать как обойти ее...
Смысл в том, что "\x5e\x01\x01\x01\x01\x01\x01\x01\x01\xc7\xe2" это не просто строковая переменная которую мы отправляем в порт, а последовательность hex символов, о чем говорят двойные кавычки и символы \х. Разбирая ее php отправляет не всю строку как она есть, а последовательность hex символов 5е,01,01,01,01,01,01,01,01,с7,е2.
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Вопрос знатокам PHP под Win

Сообщение Victor_S » Чт апр 09, 2015 10:21 am

В общем пока выкрутился так:
$cmdInit = '0x'.$addr.',0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x'.$crc[1].',0x'.$crc[0];
$this->setProperty('cInit',$cmdInit);
-------------------------
$command = explode(',', gg('M236v1.cInit'));
$c="";
for($i=0; $i < count($command); $i++){$c .= chr($command[$i]);}
dio_write($fd,$c, 11);
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Вопрос знатокам PHP под Win

Сообщение Victor_S » Чт апр 09, 2015 12:16 pm

В общем застопорился я на этапе невозможности выполнить данный скрипт из Majordomo. Просто из браузера все работает. Тут без помощи Сергея никак...:(

<?
include_once("./config.php");
include_once("./lib/loader.php");

$db=new mysql(DB_HOST, '', DB_USER, DB_PASSWORD, DB_NAME); // connecting to database

header ('Content-Type: text/html; charset=utf-8');


// BUS Type: RS485 or CAN
define('BUS', 'RS485');
exec('mode '.gg('M236v1.port').': baud='.gg('M236v1.baud').' data=8 stop=1 parity=n xon=off');
$fd = dio_open(gg('M236v1.port'), O_RDWR);
//$fd = fopen("COM3", "r+");
/*
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(50000);
flush();
dio_write($fd, $cmd, 6);
// fwrite($fd, $cmd);
usleep($sleep_time);
$result = dio_read($fd, 64);
// $result = fread($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 = 200000;

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;
}

# Инициализация соединения, передача пароля
$command = explode(',', gg('M236v1.cInit'));
$c="";
for($i=0; $i < count($command); $i++){$c .= chr($command[$i]);}
dio_write($fd,$c, 11);
//fwrite($fd,$c);
usleep($sleep_time);
$result = dio_read($fd, 15);
//$result = fread($fd, 15);

// Общее потребление
$command = explode(',', gg('M236v1.cTot'));
$c="";
for($i=0; $i < count($command); $i++){$c .= chr($command[$i]);}
$Tot = merc_gd($c, 0.001, 1);
echo "Total: $Tot[0]\r\n";
sg('M236v1.Tot',$Tot[0]);

# Мощность по фазам
# =====================================================
$command = explode(',', gg('M236v1.cPv'));
$c="";
for($i=0; $i < count($command); $i++){$c .= chr($command[$i]);}
$Pv = merc_gd($c, 0.01);
echo "Pv: $Pv[0] - $Pv[1] - $Pv[2] \r\n";
sg('M236v1.P1',$Tot[2]);
sg('M236v1.P2',$Tot[1]);
sg('M236v1.P3',$Tot[0]);

# Завершение соединения
$command = explode(',', gg('M236v1.cClose'));
$c="";
for($i=0; $i < count($command); $i++){$c .= chr($command[$i]);}
dio_write($fd, $c, 4);
//fwrite($fd, $c);
usleep($sleep_time);
$result = dio_read($fd, 8);
//$result = fread($fd, 8);
dio_close($fd);
//fclose($fd);
$db->Disconnect(); // closing database connection
?>

----------------------------------------
ошибку выдает такую:
Warning: dio_write() expects parameter 1 to be resource, null given in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(139) : eval()'d code on line 24

Warning: dio_read() expects parameter 1 to be resource, null given in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(139) : eval()'d code on line 27
Total: 0
Warning: dio_write() expects parameter 1 to be resource, null given in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(139) : eval()'d code on line 24

Warning: dio_read() expects parameter 1 to be resource, null given in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(139) : eval()'d code on line 27
Pv: - -

Т.е. проблема с $fd = dio_open(gg('M236v1.port'), O_RDWR);
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Вопрос знатокам PHP под Win

Сообщение Victor_S » Пт апр 10, 2015 2:19 pm

Апну тему в плане своих вопросов к Сергею...;)
Корректен ли синтаксис данных строк в сценариях Majordomo:
exec('mode '.gg('M236v1.port').': baud='.gg('M236v1.baud').' data=8 stop=1 parity=n xon=off');
$fd = dio_open(gg('M236v1.port'), O_RDWR);

Вроде добил весь код по взаимодействию со счетчиками, в браузере все отлично работает, а из-под МД не хочет...:(
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Вопрос знатокам PHP под Win

Сообщение Victor_S » Пт янв 15, 2016 1:17 pm

Столкнулся с новой проблемой...
Когда значение общей потребляемой мощности переваливает за 7кВт то это значение принимает совершенно непонятный вид, в пределах 7кВт - все нормально отображается.
Проиллюстрирую картинкой:
mercury.jpg
mercury.jpg (76.57 КБ) 6066 просмотров
Если сложить активную мощность по фазам, должно получиться 7408,9Вт, а имеем 49351,9Вт???
То же по реактивной мощности, должно быть 7589,6ВА, а имеем 49532,6ВА???
Значения получаем следующим образом:
-----------------------------------------------
# Мощность по фазам активная, Вт
# =====================================================
$command = explode(',', gg('M236v2.cPv'));
$c="";
for($i=0; $i < count($command); $i++){$c .= chr($command[$i]);}
$Pv = merc_gd($c, 0.01);
//echo "Pv: $Pv[0] - $Pv[1] - $Pv[2] - $Pv[3]\r\n"."<br>";
sg('M236v2.P',round($Pv[0],1));
sg('M236v2.P1',round($Pv[1],1));
sg('M236v2.P2',round($Pv[2],1));
sg('M236v2.P3',round($Pv[3],1));
# Мощность по фазам реактивная, ВА
# =====================================================
$command = explode(',', gg('M236v2.cSva'));
$c="";
for($i=0; $i < count($command); $i++){$c .= chr($command[$i]);}
$Sva = merc_gd($c, 0.01);
//echo "Sva: $Sva[0] - $Sva[1] - $Sva[2] - $Sva[3]\r\n"."<br>";
sg('M236v2.S',round($Sva[0],1));
sg('M236v2.S1',round($Sva[1],1));
sg('M236v2.S2',round($Sva[2],1));
sg('M236v2.S3',round($Sva[3],1));
----------------------------
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;
}
----------------------------------------------
По всей видимости ошибка где-то в этом месте...:)
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;

Поскольку данную функцию писал не я, а сам не великий знаток php, прошу помощи зала...:)
Ответить