18.05.2013, 10:08 | #1 |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 |
Smart Home modbus web project
Долго мучил сторонний шлюз Modbus RTU - Modbus TCP и в конце-концов решил написать свой шлюзовый сервер Modbus RTU - TCP Client. Хочу сразу отметить на стороне TCP клиента, сервер использует свой протокол и не является Modbus TCP протоколом!
шлюз TCP to Modbus RTU ------------------------- Программа написана специально для работы с Arduino по протоколу Modbus RTU. Для слэйв устройств является мастером, для TCP клиентов соответственно - сервером. Используются только 2-е функции Modbus RTU: - Modbus function code 0x03 (03) - чтение всех регистров - Modbus function code 0x10 (16) - запись всех регистров (в данном проекте запись идет только одного регистра) Получает запросы от клиента (php) по TCP протоколу и преобразует полученную строку параметров в протокол Modbus RTU для обмена со слэйв устройством. Программа работает максимум с 20-ю регистрами на устройство. Пока думаю хватит Итак для затравки картинка web страницы. Конечно страница больше тестовая и полностью не отражает работу умного дома. Но на данном этапе я и не стремился делать все и сразу. Это как пример реализации управления, мониторинга. Дальше нужна только фантазия... Что можно делать. - Опрашивать устройства меняя их ID. - Устанавливать значения регистров, при установке checkbox в "авто" - в реальном режиме постоянно читать состояние устройства, опрос идет раз в сек. Слева в полях на сером фоне показаны текущие значения состояния регистров (не редактируются). Справа - заносятся новые значения. Кнопка "очистить" - очищает эти поля. Строится все по такой схеме: Схема для подключения Arduino по RS485 Вот еще вариант подключения с обвязкой Схема для подключения датчика температуры к Arduino Экспериментировал с 2-мя ардуинами. Ардуины подключены к роутеру через max485. В роутер вмонтирован преобразователь ttl-rs232 далее подключен преобразователь rs232-rs485. Возможно подключение к роутеру через преобразователь USB-RS485 (не "коверкая" роутер). Одна ардуина имеет ID=1, другая ID=2. К ардуине с ID=1 подключен температурный датчик. Значение температуры заносится в регистр 1. Т.к. температура имеет дробное значение, а регистры целочисленные чтобы сохранить дробую часть, я умножил это значение на 100 и привел его к целочисленному. На web странице я не делал обратного преобразования. Поэтому вместо значения например: 27.45 будет видно 2745. На ID=2 просто в регистр 0 раз в секунду записывается счетчик (для наглядности динамики), если в регистр 1 записать не нулевое значение счетчик сбрасывается в 0. Регистр 9 на обоих ардуинах привязан к тестовому светодиоду led13. Все это легко понять посмотрев простые тестовые скетчи к Arduino. Разумеется Вы можете привязать регистры к любым вх/выходам Arduino, в том числе аналоговым. В ардуинах я задейсвовал по 10 регистров-переменных. Соответственно Web страница написана тоже под 10 регистров. Шлюз написан на поддержку максимум 20 регистров. Регистры представляют собой массив переменных из uint16_t. Хоть тип переменной uint16_t, принимает знач. без знака, перевод знака происходит в шлюзе, путем привидения переменной к типу int16_t (целочисленное значение со знаком). Поэтому вы можете записывать как отрицательные, так и положительные значения не превышая абсолютное значение 32767. Web страница использует JavaScript (JQuery) и технологию AJAX, что позволило не перезагружать страницу и дает эффект как будто вы работаете в программе. Данные принимаются от Web клиента в формате JSON строки. PHP интерпретатор передает эти данные шлюзу через сокет, ответные данные от шлюза передаются обратно Web клиенту (браузеру). Протокол обмена между php и шлюзом подробно описан в readme.txt к шлюзу. Для повторения потребуется: - Установка OpenWrt на роутер - Установка USB диска - Установка Web сервера Для ардуино используется библиотека simple-modbus в архиве: - Тестовые программы для ардуины - Web страница - Шлюзовый сервер - Исходники шлюза В общем все крутится и светится Тест постоянного чтения в течении 8 часов прошел удачно Корректная работа в браузерах: Opera, Mozilla, Chrome (IE работает "криво") Буду рад прокомментировать если у кого-то возникнут вопросы. 02.09.13 - изменен алгоритм работы шлюза v 03a и web клиента - обновлена библиотека для arduino SimpleModbusSlave ver 5 Последний раз редактировалось andr128; 02.09.2013 в 07:50. Причина: обновление |
21.05.2013, 12:01 | #2 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Огромное спасибо!
Буду пробовать Пакеты в архиве для какой версии ? |
21.05.2013, 17:04 | #3 |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 |
Компилировал для mr3020 (пакет программ под trunk r33482), но думаю заведется и на 703.
установка: скопировать в /tmp opkg install /tmp/libmodbus_3.0.2-2_ar71xx.ipk opkg install /tmp/mbserv_1.0.0-3_ar71xx.ipk Последний раз редактировалось andr128; 26.05.2013 в 20:52. |
24.05.2013, 18:24 | #4 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
А что такое Master Modbus (ID=0) ?
А можно обойтись без переходников rs232 ? |
24.05.2013, 22:00 | #5 | |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 |
id=0 по положению модбас это адрес мастера.
Цитата:
modbus_configure(speed, ID_Slave, numpin_set_for_max485, MB_REGS, tab_reg); speed - скорость обмена, стандартный ряд 9600 .. ID_Slave - идентификатор устройства numpin_set_for_max485 - pin для управления max485, если не используется (в случае подкл. напрямую) нужно ставить 0 или 1, тогда не будет исп. упр. пин. MB_REG - кол-во используемых регистров tab_reg - массив регистров (значений регистров) Сама концепция modbus rtu подразумевает работу по rs485. Но все зависит от ваших желаний. Можно организовать работу по эфиру или через переходник USB-RS485 ,а на ардуино использовать max485, для преобразования uart в rs485, в этом случае сеть строится конечно по проводам. Последний раз редактировалось andr128; 24.05.2013 в 22:18. |
|
24.05.2013, 22:21 | #6 | |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Цитата:
|
|
24.05.2013, 22:31 | #7 | |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Цитата:
Последний раз редактировалось stD; 24.05.2013 в 22:34. |
|
25.05.2013, 07:53 | #8 |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 |
Подключить можно, но нужно как-то управлять режимом переключения RX-TX в MC MAX485. Можно попробовть собрать такую схему.
http://www.cyber-place.ru/showthread.php?t=296&page=5 |
25.05.2013, 12:29 | #9 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
А у Тебя к UARTу роутера подключен преобразователь ttl-rs232, как ты им управляешь?
Обьясни поподробнее пожалуйста! |
25.05.2013, 21:38 | #10 |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 |
Я не совсем понял вопрос.
К роутеру к UART подключен преобразователь TTL-RS232 далее RS232-RS485. Преобразователь RS232-RS485 аппаратно сам переключает режим. Собственно в первом посту я это описал. Преобразователь TTL-RS232 используется лишь как промежуточное звено т.к. преобразователей TTL-RS485 с аппаратным переключением направления в продаже я не встречал. Есть либо USB-RS485, либо RS232-RS485. Еще раз повторюсь, что можно собрать самому ссылки на схемы я приводил выше. Последний раз редактировалось andr128; 25.05.2013 в 21:58. |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|