![]() |
![]() |
#1 |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Долго мучил сторонний шлюз 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. Причина: обновление |
![]() |
![]() |
Здесь присутствуют: 3 (пользователей: 0 , гостей: 3) | |
|
|