15.09.2013, 03:01 | #142 |
Junior Member
Регистрация: 15.09.2013
Сообщений: 13
Вес репутации: 0 |
Отписался в вышеописанном топике на предмет замены php
http://cyber-place.ru/showpost.php?p=6617&postcount=24 |
04.06.2014, 02:36 | #143 |
Senior Member
|
Re: Описание протокола "Умный дом"
По поводу реализации протокола modbus. Я тут попробовал простейший скрипт:
Код:
#!/bin/sh stty -F /dev/ttyATH0 9600 cs8 printf "\x10\x10\x00\x00\x00\x01\x02\x03\xE8\x66\xBE" > /dev/ttyATH0 read -n 8 -t 1 data < /dev/ttyATH0 Байтовую посылку можно формировать средствами js, в том числе вычислять crc. Потом передавать её в скрипт, а тот отошлёт на линию. Далее, принимаем данные и передаём их наверх для обработки. Для тестирования работы использовал симулятор: http://www.plcsimulator.org/ Проблема пока в том, как работать с байтами в скриптах, что в js, что в shell. Но это был бы самый простой и универсальный способ реализации протокола modbus, причём очень гибкий, т.к. не нужно ничего компилировать.
__________________
Россия навсегда! |
04.06.2014, 10:09 | #144 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Описание протокола "Умный дом"
А формула расчета crc есть?
|
04.06.2014, 20:09 | #145 |
Senior Member
|
Re: Описание протокола "Умный дом"
Есть конечно. На C функция выглядит так:
Код:
USHORT usMBCRC16( UCHAR * pucFrame, USHORT usLen ) { uint8_t ucCRCHi = 0xFF; uint8_t ucCRCLo = 0xFF; uint16_t iIndex; while ( usLen-- ) { iIndex = ucCRCLo ^ *( pucFrame++ ); ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[ iIndex ] ); ucCRCHi = aucCRCLo[ iIndex ]; } return ( USHORT )( ucCRCHi << 8 | ucCRCLo ); } Вот ещё один вариант: An example of a C language function performing Modbus CRC16 generation. А вот тут человек отписал, что он наваял рабочий пример. Но исходников не сохранилось. Вот тут есть пример, который можно переделать: Demo of CRC-16 Program of javascript. П.С. По крайней мере отослать любую последовательность байт можно. Осталось только найти способ принять данные. Делать это нужно по-байтно, т.к. длина посылки указана в одном из принимаемых байтов. Таким образом, кстати, можно было бы реализовать любой протокол.
__________________
Россия навсегда! Последний раз редактировалось uni; 04.06.2014 в 20:41. |
05.06.2014, 05:49 | #146 |
Senior Member
|
Re: Описание протокола "Умный дом"
Нашёл готовый код для crc16: http://jsperf.com/crc16
Вариант функции crcLoHi() делает то же, что и показанная выше функция на C. Теперь можно написать простейшую html-форму и посылать запросы в порт с разными функциями. Осталось только понять как байтовый массив принимать обратно.
__________________
Россия навсегда! |
05.06.2014, 06:35 | #147 |
Senior Member
|
Re: Описание протокола "Умный дом"
После отключения вывода в терминал и сброса параметров уже кое-что получается:
Код:
#!/bin/sh # Сброс параметров. stty -F /dev/ttyATH0 4:0:18b2:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 # Настройка. stty -F /dev/ttyATH0 raw 9600 cs8 # Тестовая посылка. printf "\x10\x10\x00\x00\x00\x01\x02\x03\xE8\x66\xBE" > /dev/ttyATH0 read -n 8 -t 1 data < /dev/ttyATH0 echo -n $data > cmd.dat hexdump -C cmd.dat Код:
00000000 10 01 02 88 10 |.....| 00000005 Код:
10 10 00 00 00 01 02 88 П.С.2. Похоже, что я не могу прочитать нулевой байт. Кроме того, данные смещаются почему-то.
__________________
Россия навсегда! Последний раз редактировалось uni; 05.06.2014 в 08:39. |
05.06.2014, 09:00 | #148 |
Senior Member
|
Re: Описание протокола "Умный дом"
Удалось получить ответ с нулевыми байтами при помощи dd, но в этом случае нужно заранее знать размер:
Код:
#!/bin/sh # Сброс параметров. stty -F /dev/ttyATH0 4:0:18b2:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 # Настройка. stty -F /dev/ttyATH0 raw 9600 cs8 # Тестовая посылка. printf "\x10\x10\x00\x00\x00\x01\x02\x03\xE8\x66\xBE" > /dev/ttyATH0 dd if=/dev/ttyATH0 of=ans.dat ibs=8 count=8 hexdump -C ans.dat Код:
root@OpenWrt:/www# ./ex.sh 0+8 records in 0+1 records out 00000000 10 10 00 00 00 01 02 88 |........| 00000008
__________________
Россия навсегда! |
05.06.2014, 11:07 | #149 |
Senior Member
|
Re: Описание протокола "Умный дом"
Похоже я нашёл обходной путь и решение проблемы приёма ответной посылки. Мы можем использовать утилиту timeout из coreutils-timeout (~20 Кб), чтобы выполнить dd в течении всего необходимого времени. Максимальный размер пакета modbus около 256 байт (точно не помню), поэтому мы просто выполняем приём и сброс данных в течении секунды. Данные, которые пришли, запишутся в файл, остальное время ничего не будет происходить.
Вот пример черновой версии скрипта: Код:
#!/bin/sh tty=/dev/ttyATH0 # Сброс параметров. stty -F $tty 4:0:18b2:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 # Настройка. stty -F $tty raw 9600 cs8 # Тестовая посылка. printf "\x10\x10\x00\x00\x00\x01\x02\x03\xE8\x66\xBE" > $tty timeout 0.2 dd if=$tty of=ans.dat count=256 2> /dev/null hexdump -C ans.dat Код:
root@OpenWrt:/www# ./ex.sh 00000000 10 10 00 00 00 01 02 88 |........| 00000008 Теперь можно писать интерфейс программки типа Modbus Pull и пытаться считывать данные из эмулятора устройства. Потом можно делать то же и с реальными modbus клиентами. Да, кстати, такой способ должен подойти и для любых других аналогичных протоколов. Может быть даже можно попробовать реализовать таким образом 1-Wire поверх uart'а. Не разбирался подробно ещё с этим вопросом. П.С. timeout тащит за собой librt и libpthread, так что на самом деле платим мы суммой в: 20 + 5 + 31 = 56 кило. Будем надеяться, что оно того стоит.
__________________
Россия навсегда! Последний раз редактировалось uni; 05.06.2014 в 11:29. |
05.06.2014, 11:18 | #150 |
Senior Member
|
Re: Modbus RTU
Теперь этого не нужно. Настоящие джедаи всё делают из shell'а
__________________
Россия навсегда! |
Здесь присутствуют: 4 (пользователей: 0 , гостей: 4) | |
|
|