Добрый день. Запараллеливаю выключатели между собой на управление 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!
Кто-то отправил в шину запрос к устройству 4a на чтение coil. Сразу после этого уже рассматриваемый modbus_client отправляет запрос на запись coil но получает ответ на предыдущий, чужой запрос.
Так бывает когда на мастере шины отсутствует арбитраж. Нельзя одновременно из нескольких потоков использовать порт. Кто-то занял его - нельзя до получения ответа или истечения таймаута что-то писать.
Но, собственно, зачем такое решение?
Понял.
Есть WB-MGE v2 + Ralay 15 связок с разным кол-ом релейных модулей.
Случилось так что силовая часть приходит на 1 шкаф (грубо говоря), а кнопки управления приходят в 2 шкаф и надо сделать так чтобы при нажатии кнопки, состояние переходило в второй шкаф.
И поправив, код вроде бы даже начало всё работать.
Точно не поможет Будет хуже.
В шине должен быть один мастер, не больше. Либо, если “мастеров” несколько, неважно, процессы это или вообще разные хосты - они не должны занимать шину одновременно.
В wb-mqtt-serial огромная часть кода именно этим и занимается.