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

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

Модератор: immortal

LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Ср апр 08, 2015 1:26 pm

что за функция CRC_MODBUS ?
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Ср апр 08, 2015 1:38 pm

Victor_S писал(а):Ребята, все эти вещи я понял и сам, и разумеется перепробовал. Вся фишка в том, что мне нужно в массив $Datam = array($address,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01); подставить не строковое представление, а шестнадцатеричное в конкретном формате, иначе crc считает не правильно.
$address=base_convert($this->getProperty('Address'), 16, 10);
так не работает? может быть оно остаётся в строковом формате... тогда так:
$address=(int)base_convert($this->getProperty('Address'), 16, 10);
будет точно число
а насчёт шестнадцатеричной записи $address=0x5e; могу сказать, что это тоже самое, что написать $address=94; т.е. присвоится тоже самое число, независимо от представления.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Ср апр 08, 2015 2:03 pm

sergejey писал(а):$address=base_convert($this->getProperty('Address'), 16, 10);
так не работает? может быть оно остаётся в строковом формате...
Не может быть, а точно в string.
Из документации: string base_convert ( string $number , int $frombase , int $tobase ), т.е всегда возвращает результат преобразования в виде строки.
sergejey писал(а):а насчёт шестнадцатеричной записи $address=0x5e; могу сказать, что это тоже самое, что написать $address=94; т.е. присвоится тоже самое число, независимо от представления.
Про функцию CRC_MODBUS, спросил как раз по этой же причине. Хотел убедится какие параметры на вход она принимает и что с ними делает дальше. Т.е. если все параметры в hex, то не совсем корректно пихать туда dec.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

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

Сообщение Victor_S » Ср апр 08, 2015 2:07 pm

Вот эта функция:
function CRC_Modbus($Data){

$len=count($Data);
$Sum=0xFFFF;
$cou = 0;
while ($len--){
$Sum^= $Data[$cou];
for ($shift_cnt=0; $shift_cnt<8; $shift_cnt++) {
if (($Sum&0x1)==1) $Sum=(($Sum>>1)^0xA001);
else $Sum>>=1;
}
$cou++;

}

return $Sum;
}

Я понимаю что можно получить число, но оно будет вида 5е. Если передать в таком виде crc читает неверно. Может в самой функции чего подкрутить?
Т.е. если делать так:
$address=0x5e;
$Datam=array($address,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01);
т.е array(0x5e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01); - все OK
а так array(5e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01); - фигня!

Можете поэксперементировать сами, подставив вместо конкретного значения результаты всех предложенных функций:

function CRC_Modbus($Data){

$len=count($Data);
$Sum=0xFFFF;
$cou = 0;
while ($len--){
$Sum^= $Data[$cou];
for ($shift_cnt=0; $shift_cnt<8; $shift_cnt++) {
if (($Sum&0x1)==1) $Sum=(($Sum>>1)^0xA001);
else $Sum>>=1;
}
$cou++;

}

return $Sum;
}
$address=0x5e;
$addr = dechex((string)$address);

# Инициализация соединения, передача пароля(111111)
$Datam = array($address,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01);
$crcmodbus = CRC_MODBUS($Datam);
$crc = str_split(dechex($crcmodbus), 2);
$cmdInit = '\x'.$addr.'\x01\x01\x01\x01\x01\x01\x01\x01\x'.$crc[1].'\x'.$crc[0];
echo "<br> ".$cmdInit;
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

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

Сообщение Victor_S » Ср апр 08, 2015 2:13 pm

Еще до кучи, :), вопросец...
Когда пытаюсь работающий код скрипта использовать как метод класса/объекта, получаю вот такое сообщение при тесте:
Warning: dio_write() expects parameter 1 to be resource, null given in C:\_majordomo\htdocs\modules\objects\objects.class.php(536) : eval()'d code on line 33

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

Warning: dio_read() expects parameter 1 to be resource, null given in C:\_majordomo\htdocs\modules\objects\objects.class.php(536) : eval()'d code on line 35
Pv: - -
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Ср апр 08, 2015 2:41 pm

LutsenkoDenis писал(а):
sergejey писал(а):а насчёт шестнадцатеричной записи $address=0x5e; могу сказать, что это тоже самое, что написать $address=94; т.е. присвоится тоже самое число, независимо от представления.
Про функцию CRC_MODBUS, спросил как раз по этой же причине. Хотел убедится какие параметры на вход она принимает и что с ними делает дальше. Т.е. если все параметры в hex, то не совсем корректно пихать туда dec.
Если я не ошибаюсь, то разницы для параметров нет никакой, будь то hex или dec. Т.е. hex/dec это вообще не типы, а способ записи значений. Тип у них один int.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

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

Сообщение Victor_S » Ср апр 08, 2015 2:57 pm

sergejey писал(а): hex/dec это вообще не типы, а способ записи значений. Тип у них один int.
Вот в этом то как раз и вся засада...мне нужно каким-то образом сказать что данная переменная будет содержать hex значение типа int...:)
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Ср апр 08, 2015 2:58 pm

sergejey писал(а):Если я не ошибаюсь, то разницы для параметров нет никакой, будь то hex или dec. Т.е. hex/dec это вообще не типы, а способ записи значений. Тип у них один int.
Ну вообще да, но вот этот случай с crc_modbus как раз довольно показателен.. :)
Вот код, который ответит на все вопросы :)

Код: Выделить всё

$testValue = 94;
$address=0x5e;
$hexAddr = dechex($testValue);

$Datam = array($testValue,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01);
var_dump($Datam);
echo "<br />";
$Datam = array($address,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01);
var_dump($Datam);
echo "<br />";
$Datam = array($hexAddr,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01);
var_dump($Datam);
echo "<br />";
echo "<br />"; 
У нас есть число 94 (DEC). Это же число переведенное в HEX, и это же самое число записанное руками сразу в HEX.
При инициализации массива все переводится в int. Вот тут возникает ошибка, т.к. результат функции dechex строка с результатом 5e и она вставляется в массив именно как строка.

С учетом того, что в данном случае при инициализации массива все переводится в int, то можно либо все элементы массива записать сразу в int либо только тот который нужен.

И заменить код с

Код: Выделить всё

$cmdInit = '\x'.$addr.'\x01\x01\x01\x01\x01\x01\x01\x01\x'.$crc[1].'\x'.$crc[0];
на

Код: Выделить всё

$cmdInit = '\x'.dechex($addr) .'\x01\x01\x01\x01\x01\x01\x01\x01\x'.$crc[1].'\x'.$crc[0];
За это сообщение автора LutsenkoDenis поблагодарил:
Victor_S (Ср апр 08, 2015 3:09 pm)
Рейтинг: 1.16%
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

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

Сообщение Victor_S » Ср апр 08, 2015 3:10 pm

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

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

Сообщение Victor_S » Ср апр 08, 2015 3:12 pm

не... просто в свойство объекта Address сразу писать десятичный адрес, т. .е. то что и требовалось. Никакой код менять не нужно.
Ответить