Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Открытый проект умного дома

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.09.2013, 05:51   #141
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Победил, но другим способом.
andr128 вне форума   Ответить с цитированием
Старый 15.09.2013, 03:01   #142
ZigFisher
Junior Member
 
Регистрация: 15.09.2013
Сообщений: 13
Вес репутации: 0
ZigFisher is an unknown quantity at this point
По умолчанию

Отписался в вышеописанном топике на предмет замены php
http://cyber-place.ru/showpost.php?p=6617&postcount=24
ZigFisher вне форума   Ответить с цитированием
Старый 04.06.2014, 02:36   #143
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию 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, причём очень гибкий, т.к. не нужно ничего компилировать.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 04.06.2014, 10:09   #144
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Описание протокола "Умный дом"

А формула расчета crc есть?
Admin вне форума   Ответить с цитированием
Старый 04.06.2014, 20:09   #145
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию 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 );

}
Для неё нужны 2 таблицы ещё. Я думаю, что на js можно попробовать реализовать вычисление crc16.

Вот ещё один вариант: An example of a C language function performing Modbus CRC16 generation.

А вот тут человек отписал, что он наваял рабочий пример. Но исходников не сохранилось.

Вот тут есть пример, который можно переделать: Demo of CRC-16 Program of javascript.

П.С. По крайней мере отослать любую последовательность байт можно. Осталось только найти способ принять данные. Делать это нужно по-байтно, т.к. длина посылки указана в одном из принимаемых байтов.
Таким образом, кстати, можно было бы реализовать любой протокол.
__________________
Россия навсегда!

Последний раз редактировалось uni; 04.06.2014 в 20:41.
uni вне форума   Ответить с цитированием
Старый 05.06.2014, 05:49   #146
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: Описание протокола "Умный дом"

Нашёл готовый код для crc16: http://jsperf.com/crc16
Вариант функции crcLoHi() делает то же, что и показанная выше функция на C. Теперь можно написать простейшую html-форму и посылать запросы в порт с разными функциями. Осталось только понять как байтовый массив принимать обратно.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 05.06.2014, 06:35   #147
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию 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
В результате получаем почему-то 5 байт пока:
Код:
00000000  10 01 02 88 10                                    |.....|
00000005
А должно быть:
Код:
10 10 00 00 00 01 02 88
П.С. Странное поведение для read. Если нельзя по-нормальному стабильно прочитать ответ, то этот способ не будет работать.

П.С.2. Похоже, что я не могу прочитать нулевой байт. Кроме того, данные смещаются почему-то.
__________________
Россия навсегда!

Последний раз редактировалось uni; 05.06.2014 в 08:39.
uni вне форума   Ответить с цитированием
Старый 05.06.2014, 09:00   #148
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию 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
Т.е. теоретически это работает. Нужно только успевать читать ответ по-байтно в зависимости от функции, т.к. признака конца посылки у нас нет.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 05.06.2014, 11:07   #149
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию 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
Жалко, что приходится тратить аж 20 кило на timeout, но другого способа пока не видно.

Теперь можно писать интерфейс программки типа Modbus Pull и пытаться считывать данные из эмулятора устройства. Потом можно делать то же и с реальными modbus клиентами.

Да, кстати, такой способ должен подойти и для любых других аналогичных протоколов. Может быть даже можно попробовать реализовать таким образом 1-Wire поверх uart'а. Не разбирался подробно ещё с этим вопросом.

П.С. timeout тащит за собой librt и libpthread, так что на самом деле платим мы суммой в: 20 + 5 + 31 = 56 кило. Будем надеяться, что оно того стоит.
__________________
Россия навсегда!

Последний раз редактировалось uni; 05.06.2014 в 11:29.
uni вне форума   Ответить с цитированием
Старый 05.06.2014, 11:18   #150
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: Modbus RTU

Цитата:
Сообщение от andr128 Посмотреть сообщение
А я вот все думал над этой темой и решил все-же применить промышленный протокол MODBUS RTU.

...

Единственный не приятный момент, для написания сервера или клиента на Си нужно делать кросс-компиляцию под роутер.
Хотя настоящих джидаев это не остановит
Теперь этого не нужно. Настоящие джедаи всё делают из shell'а
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 4 (пользователей: 0 , гостей: 4)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:07. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика