Дружим WirenBoard с Arduino (slave) по ModBus

Решил тут прикрутить к системе WirenBoard старый код, работающий на Arduino.
Пока лень его переписывать (а может и оставлю его, ибо там хвосты идут в не самых надежных местах, так надежнее) , потому решил связать все по ModBus (RS-485). Прошу оценить насколько это можно пускать в продакшн. Ибо я не силен в ModBus. Прошу поправить, если где не прав.

Итак, имеем Arduino Nano и модуль RS485 MAX485CSA , хотим взаимодействовать с Arduino по протоколу ModBus. В данном случае arduino выступает в роли slave и делится информацией с WirenBoard по ModBus.

1). Программируем arduino.
Я использовал код https://github.com/emelianov/modbus-esp8266 и модуль для modbus slave (кстати оно же должно работать для ESP32, но я не пробовал).

Мой скетч для демонстрации работы :

#include <ModbusRTU.h>
#define SLAVE_ID 22
ModbusRTU mb;

void setup() {
  Serial.begin(9600,SERIAL_8N2); //2 stop bits !
  Serial.println("Setup");

  mb.begin(&Serial, 10);  //это 10й пин, который будет подключен на DE+RE
  mb.setBaudrate(9600);
  mb.slave(SLAVE_ID);

// Задаем тестовые значения

mb.addCoil(1); //0x1
mb.addHreg(2); //0x3
mb.addIreg(3); //0x4

mb.Coil(1,1); //0x1
mb.Hreg(2,222); //0x3
mb.Ireg(3,444); //0x4

}

void loop() {
  mb.task();
  yield();
}

2). Соединяем по схеме


TX1 (arduino) → DI (RS-485 TTL Converter)
RX0 (arduino) → RO (RS-485 TTL Converter)
D10 (arduino) → DE+RE (RS-485 TTL Converter)
5V (arduino) → VCC (RS-485 TTL Converter)
GND (arduino) → GND (RS-485 TTL Converter)
A(RS-485 TTL Converter) → A (WirenBoard RS-485)
B(RS-485 TTL Converter) → B (WirenBoard RS-485)

*** питание с WirenBoard не брал, правильно ли?
upd: производитель рекомендует брать еще общую землю Дружим WirenBoard с Arduino (slave) по ModBus - #2 от пользователя Explorerol

3). Добавляем устройство в WirenBoard
в папке /usr/share/wb-mqtt-serial/templates
создаем файл
config-arduino-bridge.json
с содержанием:
(в данном коде 3 канала для примера, каждый для своего типа )

        {
            "device_type": "ARDUINO-Bridge",
            "device": {
                "name": "ARDUINO",
                "id": "arduino",
                "max_read_registers": 0,
                "response_timeout_ms": 1,
                "frame_timeout_ms": 12,
                "channels": [
                    {
                        "name": "TEST COIL",
                        "reg_type": "coil",
                        "address": 1,
                        "type": "switch"
                    },
                    {
                        "name": "TEST HREG",
                        "reg_type": "holding",
                        "address": 2,
                        "type": "value"
                    },
                    {
                        "name": "TEST IREG",
                        "reg_type": "input",
                        "address": 3,
                        "type": "value"
                    }
                ]
            }
        }

где поле address - это адрес соответствующего регистра из скетча, а типы соответственно:
coil,holding,input - mb.Coil, mb.Hreg, mb.Ireg регистры.

Больше про шаблоны почитать тут Драйвер wb-mqtt-serial: шаблоны — Wiren Board
про ModBus тут: Протокол Modbus — Wiren Board
также полезная тема Работа с устройствами Wiren Board без контроллера — Wiren Board

4). Добавляем наше новое устройство в UI
В Web UI Wirenboard в разделе Settings → Configs → /etc/wb-mqtt-serial.conf (Serial Device Driver Configuration)
добавляем новое устройство “ARDUINO-Bridge” , включаем его и задаем slave id (в скетче прописано 22, это значение задается произвольно, но не должно пересекаться с имеющимся). Сохраняемся.
Новое устройство должно появится в разделе Devices

P.S. для отладки можно использовать встроенную утилиту modbus_client ,
для этого в консоли WirenBoard выполняем
service wb-mqtt-serial stop (после этого UI перестанет работать. Для запуска опять выполнить: service wb-mqtt-serial start)

# modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a22 -t0x01 -r1
    SUCCESS: read 1 of elements:
          Data: 0x01
# modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a22 -t0x03 -r2
    SUCCESS: read 1 of elements:
          Data: 0x00de 
# modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a22 -t0x04 -r3
    SUCCESS: read 1 of elements:
          Data: 0x01bc
2 Likes

Здравствуйте! Да, в целом все правильно.

Если устройства запитаны от разных источников питания, то рекомендуется еще отдельно соединить GND (минусы) питания устройств: RS-485:Физическое подключение — Wiren Board

Также рекомендую прочитать информацию про подключение сторонних устройств к контроллеру по Modbus: Как подключить Modbus RTU-устройство стороннего производителя к контроллеру Wirenboard? — Wiren Board

1 Like

Отлично. Только еще сделать хранение адреса Modbus во флешке Ардуины, ну и обработчик изменения по Modbus чтоб не задавать для каждой при прошивке.

У меня пока в планах использовать arduino исключительно в качестве slave. Например те же температурные датчики I2C. Повесить через такой slave контроллер, а данные отдавать уже головному модулю WB.
Также 1-wire , которые проводами раскиданы по площади, хочу обезопасить WB6 и повесить их на отдельную дуину. Ибо дуин у меня много, а контроллер жалко и долго ждать в мои края.
Правильно ли я мыслю?
Нормально ли будут работать правила WB в такой связке с arduino ?

Ну тут скорее больше повысить надежность работы шины 1-wire и системы в целом. Если один датчик перестает работать, то перестанет работать вся шина 1-wire. А также это позволит снизить длину шины 1-wire и лучше диагностировать проблемы с датчиками, что хорошо. Шина RS-485 более помехозащищенная и позволяет передавать данные на большие расстояния. Поэтому в целом все правильно делаете.

Правила будут работать уже с топиками MQTT, а в топики MQTT данные записывает/читает по сети RS-485 драйвер wb-mqtt-serial. Если шина RS-485 будет надежно работать, то проблем не будет.

1 Like

Да, вполне нормально. У меня почти аналогичный проектик есть, только на Ардуинке веб-сервер, с поиском-отображением-привязкой 1-wire устройств.
Советую использовать watchdog и позабититься как о диагностике (вывести в регистр напряжение питания, uptime) так и о защите (обложить диодами или стабилитронами шины)

Мсье знает толк в.
:clap:

О да. Разбор-формирование http на сях… Жаль, забросил тогда еще в полуготовом виде, когда уперся в доступную флеш.

Ну - вообще оно не для того, мягко говоря.

И, да, вочдоги это чрезвычайно вредная практика. Оно просто не должно виснуть! Если виснет софтина, надо отлаживать ее до честной победы, при этом вочдог сильно затрудняет отладку.

Как практика, чтобы “не забыть” - очень даже неплохо.

Та же ардуинка с парой шин 1-wire у меня висла пару раз при грозе. Хотя - входы были защищены, шины в заземленном экране. А так работала стабильно.

Это - другое! (ц)
После отладки вочдог по таймауту цикла вполне поощряется. Хотя вот под боком уже больше 12 лет тикают часики на 328p - даже в грозу пока не висли…

А есть схемка рабочая? Ибо я больше прогер, чем электронщик. Я так понимаю хорошо бы купить отдельно WBE2-I-RS485-ISO , хотя бы на время отладки. Но мне его ждать теперь 2 недели.

А так, как я понял, можно подвязывать ардуинки/ESP32 слейвами в общую ModBus → mqtt.

Питать , буду от MW 5V , WB отдельно, дуины отдельно, землю беру общую + AB.

Пока на столе, схема из первого поста рабочая. Только земли rs485 соединить.
Потом все равно электронщика звать, не на соплях же это пускать в прод. :slight_smile:

Сам модулек на max485 - он достаточно “защищен” Про супрессоры, диоды надо будет думать уже при разработке платки.

Да, можно.