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

Довольно часто. Да, регистр читается. Вывел в устройство 10 регистров. Смотрю в devices. Часть из них красная (с ошибкой), часть нормальная. Ошибка может висеть минуту или больше. Потом нормально, значение меняется. Другие регистры становятся красными. Это касается всех регистров. Один не пробовал оставлять. Но уверен, картина будет та же.

Попробуйте поставить большое значение guard_interval_us (описание по ссылке выше).

Что бы небыло путаницы, сначала хочу определиться в терминологии.
В GitHub (/etc/wb-mqtt-serial.conf) для Порта указывается:
Мин. интервал опроса каждого регистра для устройств, подключенных к порту, mc
“poll_interval”:
Я понимаю это так, poll_interval - время отведённое на опрос регистра. Если за это время программа не успела прочитать регистр, то будет ошибка (или не правильное значение). Верно?
А вот в Serial Device Driver Configuration несколько по-другому комментируется данный параметр.
Desired poll interval (ms) - Эта опция указывает интервал между двумя последовательными опросами каждого канала (или общую продолжительность цикла опроса).
Время самого опроса входит в этот параметр? Что такое цикл опроса?
Это время опроса + пауза между опросами. Так?
В общем я прописал такие значения:
В сети два Modbus устройства. Значения одинаковые для двух устройств.
“poll_interval”: 2000
“delay_ms”: 100
“guard_interval_us”: 100000
Ошибки стали появляться на много реже. И пропадают быстрее.

Служба техподдержки, вы где?

Неверно. То, о чём вы говорите, называется, кажется, response_timeout - то есть время ожидания ответа после запроса регистра.

Верно. Это время, которое говорит, что не надо читать чаще, чем раз в столько-то секунд. То есть если всё идеально, и это не конфликтует с другими настройками, то регистр будет читаться ровно, допустим, раз в две секунды (а не чаще, хотя теоретически могло бы).

На контроллере WirenBoard-6 на порту /dev/ttyRS485-1 подключено два устройства.
Задача вывести в консоль их адреса.
Останавливаю сервис: systemctl stop wb-mqtt-serial
Выполняю команду:
for i in {1…247}; do modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -r0x80 -s2 -pnone; done 2>/dev/null | grep Data:

Команда ошибки не выдаёт. Отрабатывает быстро. В консоль ничего не выводится.
Почему?

А почему так? Должно быть только две точки.

Опечатка. В команде только две набирал. Ещё есть варианты?

Выполните

for i in {1..247}; do modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -r0x80 -s2 -pnone; done 2>/dev/null

и покажите вывод.

Вот результат выполнения команды. от 1 до 5

. Устройства висят на адресе 1 и 4. Команда выдаёт нормальную ошибку по этим адресам <01><83><03><01><31>
Вопрос. Почему мы задаём регистр 80? (-r0x80)
Если написать -r0x00, то с этого регистра считываются нормальные данные.

Пришлите, пожалуйста, вывод этой команды.

Так это чтение регистра holding 0x80. Во всех наших устройствах он есть, в нём хранится адрес устройства. У вас подключены устройства нашего производства? В чужих такого регистра может и не быть.

У меня подключены устройства не вашего производства. Я так и понял сразу что нет такого регистра.

На всякий случай результат работы команды с регистром -r0x00

Я забыл, что речь идёт не про наши устройства.

Если вы используете наш скрипт, то он делает буквально следующее: пытается со всех адресов запросить регистр 0x80 - он есть во всех наших устройствах, и в нём содержится как раз адрес устройства.
Если устройства у вас другие, то вписывайте их регистр, и уберите часть команды, которая оставляет только содержимое регистра. Получится, например,

for i in {1..247}; do modbus_client -mrtu /dev/ttyRS485-1 --debug -a$i -t3 -r123 -s2 -pnone; done