Modbus_client + wi-fi мост

Добрый вечер!

Может у кого уже есть опыт использования modbus_client c wi-fi мостом?


wb-mqtt-serial работает, а modbus_client пишет timout error

modbus_client --debug -mtcp -p8899 192.168.1.81 -a19 -r80 -t3 -c 1 -o5000

а это потому что Wi-Fi мост не Modbus TCP. Тут есть путаница: можно просто байтики Modbus RTU завернуть в TCP-сокет (так видимо делает по-умолчанию ваш мост, в таком режиме работает wb-mqtt-serial), а можно преобразовывать Modbus RTU в отдельный бесполезный протокол Modbus TCP.

modbus_client -mtcp как раз обращается по Modbus TCP к мосту, а тот посылает этот запрос как есть по RS-485 нашим устройстам, которые не знают, что с таким делать.

У того же USRiot есть в старших моделях (w610) опция преобразования в Modbus TCP, но с ней у вас wb-mqtt-serial не будет работать.

Чтобы общаться через modbus_client по Modbus RTU-over-TCP, проще всего запустить рядом socat и создать виртуальный последовательный порт в системе.

Добрый день!

Как решали проблему падения wb-mqtt-serial, если с socat упал или не успел запуститься во время работы wb-mqtt-serial?
Вроде как wb-mqtt-serial сам не перезапускается, причем systemd не в курсе о том, что сервис упал:

Jun 21 13:18:50 wirenboard-AFK2C6PD systemd[1]: Stopping LSB: MQTT Driver for serial devices...
Jun 21 13:18:50 wirenboard-AFK2C6PD wb-mqtt-serial[6693]: start-stop-daemon: warning: failed to kill 3597: No such process
Jun 21 13:18:50 wirenboard-AFK2C6PD systemd[1]: Stopped LSB: MQTT Driver for serial devices.
Jun 21 13:18:50 wirenboard-AFK2C6PD systemd[1]: Starting LSB: MQTT Driver for serial devices...
Jun 21 13:18:50 wirenboard-AFK2C6PD systemd[1]: Started LSB: MQTT Driver for serial devices.

Zeta, добрый день!
Да, пока через init.d работает – рестарт штатно не сделать. Надо писать Unit для systemd , и запускать через него. Пример, к сожалению, не подскажу.

Так а зачем вам mqtt-serial запускать с сокатом? Он же из коробки умеет тип порта tcp и всё делает сам, причём аккуратно.

mqtt-serial не умеет писать массивы данных, например в RAM WB-MIR. Поэтому, если удаленно нужно сменить в ИК команду, нужно останавливать mqtt-serial и запускать socat + modbus_client.

Идея была в том, чтобы socat всегда держал удаленный порт. Это похволило бы прозрачно общаться mqtt-serial и modbus_client, но работает нестабильно. Придется изменить логику тогда.
В идеале ввести поддержку записи массивов в mqtt-serial, но там неизвестный код, который может отнять неопределенное количество времени.

А сколько реально вам нужно команд в WB-MIR? Или запись в RAM не из-за ограничения на количество команд в памяти MIR?

Запись в RAM необходима для записи в ячейку ROM. Там сначала переносится содержимое из ROM для редактирования в RAM, а затем обратно.
Удобно, когда задать или поправить набор команд для ИК можно удаленно.