Modbus шлюз своими руками

Modbus шлюз своими руками

Сообщение ElectronicsInFocus » Пт ноя 11, 2016 8:30 am

Сделал недавно WiFi-шлюз MODBUS TCP-RTU на esp8266.
Позволяет вести обмен (в пределах дальности работы wifi-сети) с MODBUS-RTU устройствами используя любой клиент MODBUS-TCP (в т.ч. majordomo с модулем modbus).

Поскольку решение получилось удачным, делюсь им с сообществом.
Шлюз — небольшая плата, которую нужно подключить к сегменту сети MODBUS RTU с устройствами, которые будете опрашивать. Также на шлюз нужно подать питание. Всё. Шлюз подключится к wifi-точке доступа и будет ждать подключений к нему по MODBUS TCP.

Шлюз очень простой и дешёвый в изготовлении.
Для сборки нужно всего несколько копеечных деталей:
1. Модуль на esp8266 (любой, у которого выведены ножки GPIO13, GPIO15, GPIO01, GPIO03). Flash от 512Кб.
2. Трансивер нужного вам физического интерфейса со стороны MODBUS RTU устройства. Например, если вам нужен RS485, то можно использовать любой из аналогов max485, совместимый с 3.3в лог. уровнями. Например, подходящие трансиверы RS485.
3. Источник питания 3.3в 500мА для питания п.1 и п.2 — на ваш вкус.
4. Несколько резисторов 1К для необходимых подтяжек ног esp8266.
В качестве ПО — прошивка nodemcu и скрипт на LUA.

Поскольку я веду блог на youtube, всё достаточно подробно описал и показал в нём. Я подключал к majordomo электросчётчик SDM220 с MODBUS RTU поверх RS485.

Готов ответить на ваши вопросы. И, конечно же, приглашаю всех на мой канал.

Re: WiFi-шлюз для опроса MODBUS RTU устройств

Сообщение shemnik69 » Пт ноя 11, 2016 3:42 pm

Re: WiFi-шлюз для опроса MODBUS RTU устройств

Сообщение shemnik69 » Пт ноя 11, 2016 6:49 pm

Для массового использования прошу Вас указаить способ програмирования ESP?
скрипт с сайта почемуто? не скачивается.
Если только копированием через редактор.
какой способ скачивания и прошивки использовать?

PS/ Работает. Скопировал, внёс в ESPlorer. Ок

Источник

Modbus шлюз своими руками

Долго мучил сторонний шлюз 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 (не «коверкая» роутер).

Читайте также:  Вентиляция конька гибкой черепицы своими руками

Одна ардуина имеет другая К ардуине с подключен температурный датчик. Значение температуры заносится в регистр 1. Т.к. температура имеет дробное значение, а регистры целочисленные чтобы сохранить дробую часть, я умножил это значение на 100 и привел его к целочисленному. На web странице я не делал обратного преобразования.
Поэтому вместо значения например: 27.45 будет видно 2745.

На просто в регистр 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 к шлюзу.

Для ардуино используется библиотека simple-modbus
в архиве:
— Тестовые программы для ардуины
— Web страница
— Шлюзовый сервер
— Исходники шлюза

В общем все крутится и светится
Тест постоянного чтения в течении 8 часов прошел удачно
Корректная работа в браузерах: Opera, Mozilla, Chrome (IE работает «криво»)

Буду рад прокомментировать если у кого-то возникнут вопросы.

02.09.13
— изменен алгоритм работы шлюза v 03a и web клиента
— обновлена библиотека для arduino SimpleModbusSlave ver 5

Источник

Modbus TCP / RTU RS-485 + WEB server

Активный участник сообщества

Создание файла диска в make_webfs_rs485.bat или с помощью WEBFS22.exe, установив опции каталогов и других переменных.

1) При прошивке всегда ставим размер Flash 512 Кбайт (4Mbit)! Реальный размер определяется автоматически самой прошивкой.
2) Если Flash на модуле более 512 Кбайт, то после подключения к AP «ESP8266» требуется заливка диска программой WEBFS22.exe или эксплорером набрав http://192.168.4.1/fsupload. Можно записать WEBFiles.bin и программатором по адресу 0x80000.

При первом старте, после прошивки программы или сбросу установок, имеем AP станцию:
SSID/Name: ESP8266
Password: 0123456789
Режим доступа к AP по умолчанию ‘OPEN’.
Имя AP и её пароль является именем и паролем для входа на «защищенные» страницы сервера и используется для записи диска по http://192.168.4.1/fsupload.

Настройки Web и прочие аналогично обсуждаемому в теме «Разработка ‘библиотеки’ малого webсервера на esp8266».

ESP имеет встроенное устройство Modbus. Номер этого устройства задается на странице настройки. Описание modbus переменных вложено на первой странице по ссылке «Info» или смотрите WebVars_RS485.xlsx (он вложен в архив). Данное устройство имеет 1000 ячеек для обмена между интерфейсами. Доступ к ним возможен из Modbus TCP, со стороны Modbus RTU RS-485 и через Web. Пример обращения из Web к переменным дан в http://192.168.4.1/sample.htm (ссылка в Web: «Debug and Test» -> Page Sample).

Варианты подключения полудуплексного интерфейса по UART (RS-485) к ESP8266:
1) К микросхеме драйвера шины RS-485 — без развязки: ADM3072E или SN65HVD12D, с развязкой: ADM2483BRWZ, и т.д. Тогда используются 3 сигнала от ESP: RX, TX, WR/RD_ENABLE
2) Напрямую c внешним устройством, как RX и TX. Линия TX, при больших скоростях, может потребовать дополнительной подтяжки к +3.3В, т.к. во время приема переключается как вход. Сигнал WR/RD_ENABLE не используется.
3) Напрямую c внешним устройством по одному проводу. Линия TX соединяется с RX. Сигнал WR/RD_ENABLE не используется. Но вешнее устройство тоже должно уметь работать по одному проводу.

Сигнал WR/RD_ENABLE (направление передачи) выставляется в «1» когда идет передача c вывода TX. Всё остальное время (чтение данных с RS-485) на нем «0».

Читайте также:  Как разрисовать беседку своими руками

Далее пытаемся из ESP8266 сделать «Панель Оператора» с макросами и обращениями к шине RS-485 как master. Пока реализована простая схема работы с «транзакторами», но прорабатывается как и что сделать для расширенного варианта и приветствуются разные предложения по этому вопросу.


Пример работы с внутренними переменными Modbus:

Источник

Реализация MODBUS RTU сервера с помощью интерфейсного модуля Fastwel и программного обеспечения CoDeSys

В данной статье рассмотрена интеграция программируемого логического контроллера CPM713 компании Fastwel, работающего на базе протокола MODBUS TCP, с панелью оператора Weintek, поддерживающей последовательный вариант протокола MODBUS RTU/ASCII, с помощью интерфейсного модуля NIM742 и готовой библиотеки адаптированной среды CoDeSys для Fastwel.

Промышленные протоколы на базе сетей Ethernet приобретают все большую популярность. Использование данной технологии в промышленных системах имеет преимущества, например, возможность гибкой модернизации и масштабирования системы, простоту построения архитектуры и невысокую стоимость создания сетей [1]. Однако внедрение новых технологий в область АСУ ТП происходит достаточно медленно, поэтому до сих пор многими устройствами используются традиционные промышленные сети на базе последовательных шин.

При создании автоматизированных систем нередко требуется наладить обмен данными между устройствами, поддерживающими различные протоколы обмена данными или различные модификации одного и того же протокола.

Так, контроллер CPM713 компании Fastwel использует для передачи данных протокол MODBUS TCP на базе сетей Ethernet [2]. При работе с данным контроллером возникла задача передавать и получать данные с панели оператора MT6100i компании Weintek, поддерживающей последовательный протокол MODBUS RTU/ASCII (рис. 1).


Рисунок 1. Интеграция контроллера Fastwel I/O с операторской панелью Weintek

Использование бесшовной интеграции всегда является более приоритетным, чем использование сторонних шлюзов. Поэтому для решения данной задачи был взят интерфейсный модуль NIM742 компании Fastwel, позволяющий подключать устройства с интерфейсом RS-232C и работать с ними через пользовательскую программу контроллера CPM713.

Модуль NIM742 совместно с пользовательской программой контроллера CPM713 реализует работу подчиненного узла Modbus RTU. NIM742 подключается в общую линейку модулей и по шине FBUS обменивается данными с контроллером CPM713 (рис.2). Для обеспечения работы NIM742 с протоколом MODBUS RTU используется библиотека CoDeSys FastwelModbusServer.lib, входящая в пакет адаптации Fastwel.


Рисунок 2. Контроллер CPM71x с подключенными модулями

Подключение устройств

Для конфигурирования и программирования контроллера CPM713 и интерфейсного модуля NIM742 использовались следующие компоненты и аксессуары:

• кабель для конфигурирования ACS00019, входящий в комплект поставки контроллера,
• бесплатный программный пакет CoDeSys фирмы 3S Smart Software Solutions с адаптационным пакетом Fastwel CoDeSys Adaptation для работы с Fastwel.

Для работы с панелью оператора Weintek MT6100i понадобились:

• соединительные кабели для конфигурирования, которые также входят в комплект поставки,
• бесплатное программное обеспечение для конфигурирования EasyBuilder 8000.

Подключение интерфейсного модуля к панели оператора осуществляется с помощью соединительного кабеля. Данный кабель можно изготовить самостоятельно, используя информацию о назначении контактов, представленную в руководстве по эксплуатации панели Weintek (рис. 3). Для связи с модулем NIM742 использовался порт COM3 [RS-232] операторской панели, использующий трех контактное подключение для передачи данных: TxD (передача), RxD (прием) и GND (земля).


Рисунок 3. Назначение контактов панели Weintek 6100i разъема female SUB-D COM3[RS-232]

На рисунке 4 изображена схема подключения контактов модуля NIM742 к порту COM3 панели оператора [3, 4]. При подключении необходимо иметь в виду, что контакт передачи данных TxD интерфейсного модуля должен подключаться к контакту приема данных RxD панели оператора, а контакт RxD соответственно к TxD панели.


Рисунок 4. Подключение модуля NIM742 к порту COM3 панели оператора.

Таким образом, для осуществления связи между панелью оператора и модулем NIM742 необходимо подключить контакты TxD и RxD с 8-м и 7-м контактами SUB-D разъема, а землю модуля соединить с 5-м контактом (рис. 5).


Рисунок 5. Схема подключения NIM742 и панели оператора Weintek MT6100i.

Настройка панели оператора

Экранная форма панели оператора создается и конфигурируется с помощью бесплатного программного обеспечения EasyBuilder8000. При создании нового проекта необходимо указать модель используемой панели Weintek (рис 6).


Рисунок 6. Создание нового проекта в EasyBuilder8000

Далее, при создании проекта необходимо отредактировать системные настройки и указать список устройств, с которыми связывается панель оператора (рис. 7). В нашем случае это будет подчиненное устройство Modbus RTU [5].

Читайте также:  Зеркало с лампочками вокруг своим руками


Рисунок 7. Системные настройки проекта

Для используемого нами клиента настраиваются следующие параметры: расположение ПЛК, тип связи, COM порт, скорость и режим работы (рис. 8). Эти данные также будут указаны в рабочей программе ПЛК.


Рисунок 8. Настройки нового устройства

После ввода всех параметров коммуникации необходимо добавить на экранную форму элементы управления и отображения: битовые индикаторы, переключатели, цифровые индикаторы и т.д. На рисунке 9 представлен внешний вид готового тестового проекта.


Рисунок 9. Тестовый проект экрана панели

Данные элементы отображения и управления связываются с переменными MODBUS. Адресация переменных Modbus RTU указана в руководстве по подключению панели Weintek к ПЛК (рис. 10).


Рисунок 10. Таблица адресов переменных Modbus

В протоколе MODBUS поддерживаются переменные четырех типов:

• дискретный вход (Discrete Input, 1 бит);
• дискретный выход (Coil, 1 бит);
• аналоговый вход (Input Register, 16 бит);
• аналоговый выход (Holding Register, 16 бит).

Для доступа к конкретной переменной также необходимо указать адрес в сети MODBUS.

В зависимости от типа переменной, для доступа к данным используются функции с кодами 0х, 1х, 3х, 4х. Код 0x соответствует типу Coil, который является выходной переменной для записи значения в битовую переменную. Адрес 1x считывает состояние битовой переменной Discrete Input. Адрес 3x соответствует Input Register и используется для считывания состояния аналоговой переменной. Адрес 4x записывает аналоговую переменную Holding Register.

Таким образом, адрес первого переключателя будет 0x1 (рис. 11), второго 0х2 и так далее. Адреса всех элементов рабочего экрана мнемосхемы представлены в таблице 1.


Рис. 11. Задание адресов к элементам рабочей мнемосхеме

Таблица 1. Адреса элементов экрана рабочей схемы:

Программа для ПЛК

Тестовый проект для CPM713 базируется на готовом примере для FastwelModbusServer.lib, входящего в адаптацию CoDeSys для Fastwel. Данная библиотека реализует высокую скорость работы, универсальна и проста в реализации, поэтому при организации обмена данными по протоколу Modbus RTU рекомендуется использовать именно ее. FastwelModbusServer.lib реализует функциональность подчиненного узла сети MODBUS RTU/ASCII через доступные пользовательской программе порты контроллера. В том числе, для организации доступа к сети MODBUS RTU через порт модуля NIM742.

Для организации обмена данными между пользовательским приложением и модулями ввода-вывода требуется добавить конфигурацию системы ввода-вывода согласно физическому подключению к контроллеру. В тестовом проекте мы использовали только модуль NIM742, и конфигурация контроллера представлена на рисунке 12.


Рис. 12. Список используемых модулей

Библиотека FastwelModbusServer имеет единственную функцию FwModbusServerInit(), которая предназначена для инициализации и конфигурирования сервера. При вызове данной функции пользователь задает коммуникационные параметры узла сети и описывает области данных, которые будут отображаться на пространстве адресов сервера MODBUS. Инициализация сервера происходит только из обработчика системного события OnInit, который инициализирует Modbus сервер один раз, после включения питания и до того, как основная пользовательская программа будет запущена.

Параметры обмена данными через COM-порт указываются в самой функции в области задания локальных переменных (рис. 13). Здесь Port – номер порта, BaudRate – скорость обмена данными, StopBit — длина стопового бита, Parity – режим контрольного бита, ByteSize – количество бит в кадре, NodeAddress – адрес устройства в сети Modbus.


Рис. 13. Задание параметров COM-порта

Данные, которыми обменивается основная программа с панелью оператора, задаются в пользовательских типах данных PLC_PRG_IN (то, что получается по сети) и PLC_PRG_OUT (то, что отправляется в сеть). Эти переменные представляют собой массив из четырех переменных типа WORD, двойного слова DWORD и вещественное число REAL (рис. 14).


Рис. 14. Переменные для обмена данными по сети Modbus

После того, как экранная форма и программа были загружены в соответствующие устройства, панель оператора в режиме мастера опрашивает контроллер CPM713. Рабочий экран панели оператора в режиме исполнения представлен на рисунке 15.


Рис. 15. Рабочий экран операторской панели в режиме исполнения

Далее, при необходимости с помощью средств CoDeSys можно собирать данные, получаемые контроллером CPM713 по сети MODBUS TCP, и перенаправлять их на панель оператора по протоколу MODBUS RTU. Таким образом, с помощью средств CoDeSys и интерфейсного модуля NIM742 может быть создана бесшовная интеграция протоколов MODBUS RTU и MODBUS TCP.

Источник

Оцените статью