Ошибки modbus_client

Добрый день. Запараллеливаю выключатели между собой на управление 1 источником света, в процессе выдаются такие ошибки:

Opening /dev/ttyRS485-6 at 9600 bauds (N, 8, 2)
[4A][05][00][03][FF][00][73][81]
Waiting for a confirmation...
<4A><01><01><02><C7><AD>
Message length not corresponding to the computed length (6 != 8)
ERROR occured!

Ищё вот это?

Opening /dev/ttyRS485-12 at 9600 bauds (N, 8, 2)
[4F][05][00][01][FF][00][D2][14]
Waiting for a confirmation...
<77><05><00><05><FF><00><97><6D>
Request for slave 119 ignored (not 79)
The responding slave 119 isn't the requested slave 79
ERROR occured!

Пример скрипта:

#!/bin/bash

STATUS=$(modbus_client -mrtu -b9600 -pnone -s2 /dev/ttyRS485-12 -a79 -t0x01 -r1 | grep Data | sed 's/Data://' | tr -d " \t\n\r") #0x01
 
 while true; do 

VAR=$(modbus_client -mrtu -b9600 -pnone -s2 /dev/ttyRS485-12 -a79 -t0x01 -r1 | grep Data | sed 's/Data://' | tr -d " \t\n\r") #0x01

echo $VAR

VAR1=$(modbus_client -mrtu -b9600 -pnone -s2 /dev/ttyRS485-12 -a119 -t0x01 -r5 | grep Data | sed 's/Data://' | tr -d " \t\n\r") #0x01
if [[ "$VAR" = "$STATUS" && "$VAR1" = "$STATUS" ]]; then
    echo "Equal"
else
    echo "not equqal"
    
    if [[ "$STATUS" = "0x00" ]]; then
        STATUS="0x01"
    else
        STATUS="0x00"
    fi

    
    modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-12 -a119 -t0x05 -r5 $STATUS
    modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-12 -a79 -t0x05 -r1 $STATUS
fi

 sleep 0.1; done

Добрывй день. Чем-то занят порт при опросе.

Ну явно что ответ от другого. Как доступ к порту расперделяется?

Никак, есть docker контейнер. К нему по SSH подключатеся другой контейнер с скриптами. Запускаю скрипт на исполнение, всё нормально, сихронизация (клавиш) работает. Останавливаю скрипт CTRL+C, запускаю вновь, и вот такой рез-т. Когда подожду неск. минут между запусками - всё ок.

И чтоже может значить вот это?

Opening /dev/ttyRS485-6 at 9600 bauds (N, 8, 2)
[4A][05][00][03][FF][00][73][81]
Waiting for a confirmation...
<4A><01><01><02><C7><AD>
Message length not corresponding to the computed length (6 != 8)
ERROR occured!

Поравил код, стало в разы стабильнее, но ошибка никуда не убегает, подскажите, что она может значить, и есть ли типовое решение?

Заменил сторочку кода.

#If [[ "$VAR" = "$STATUS" && "$VAR1" = "$STATUS" ]]; then
if [ "$VAR" = "$VAR1" ]; then

Кто-то отправил в шину запрос к устройству 4a на чтение coil. Сразу после этого уже рассматриваемый modbus_client отправляет запрос на запись coil но получает ответ на предыдущий, чужой запрос.
Так бывает когда на мастере шины отсутствует арбитраж. Нельзя одновременно из нескольких потоков использовать порт. Кто-то занял его - нельзя до получения ответа или истечения таймаута что-то писать.
Но, собственно, зачем такое решение?

Понял.
Есть WB-MGE v2 + Ralay 15 связок с разным кол-ом релейных модулей.
Случилось так что силовая часть приходит на 1 шкаф (грубо говоря), а кнопки управления приходят в 2 шкаф и надо сделать так чтобы при нажатии кнопки, состояние переходило в второй шкаф.

И поправив, код вроде бы даже начало всё работать.

Как настроить таймаут?

Если запустить 2 экземпляра socat - это решит проблему? В 1 канал спрашивать одно, в другой другое.

Для modbus_client - опция -o

Точно не поможет Будет хуже.
В шине должен быть один мастер, не больше. Либо, если “мастеров” несколько, неважно, процессы это или вообще разные хосты - они не должны занимать шину одновременно.

В wb-mqtt-serial огромная часть кода именно этим и занимается.

Данное ПО поддерживает DALI ? Можно ли её поставить на другую linux-машину, кроме wirenboard ? Можно выводить метрики в виде MQTT ?

Нет.

Лицензия не разрешает.

Относящиеся к опросу - да. GitHub - wirenboard/wb-mqtt-serial: Wiren Board MQTT serial protocol driver

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.