Ошибки чтения Modbus

Добрый день! После вмешательства по двум направлениям (замена по гарантии контроллера с 8.4.4 на 8.5, и переключение линий Modbus с базового порта RS485-2 на порты MOD1, MOD2 через WBIO-RS485-ISO) начали активно сыпаться ошибки, влияющие на работу системы в целом. По каналу датчика WBIO-DO-R10A-8 (MOD1, id:240:1) приходят сообщения о несуществующих изменениях. В логах присутствуют ошибки CRC по mqtt-serial.
Ранее все устройства были на одном порту RS485-2, но ввиду того, что объединены разные строения и схема включения получилась “звезда”, было принято решение разнести на разные порты. Включение/отключение терминатора на RS485-ISO результата не дает. Другие две перемычки установлены. Линии RS485 проложены витой парой в экране, экран заземлен с одной стороны на линиях, длиной превышающих 2м.
В чем может быть проблема?

приложен диагностический архив, доступен только сотрудникам поддержки
(283,5 КБ)

Добрый день.
Судя по

Feb 15 15:11:12 wirenboard-AXCFBMYW wb-mqtt-serial[487947]: WARNING: [serial client] Reading events failed: Serial protocol error: request timed out
Feb 15 15:11:12 wirenboard-AXCFBMYW wb-mqtt-serial[487947]: WARNING: [modbus] failed to read 6 input(s) @ 10264 of device modbus:30: Serial protocol error: malformed response: invalid crc
Feb 15 15:11:12 wirenboard-AXCFBMYW wb-mqtt-serial[487947]: WARNING: [modbus] failed to read 22 input(s) @ 250 of device modbus:158: Serial protocol error: malformed response: invalid crc
Feb 15 15:11:43 wirenboard-AXCFBMYW wb-mqtt-serial[487947]: WARNING: [serial client] Reading events failed: Serial protocol error: request timed out

И отсутствию ошибок таймаута - ответ проблема при приеме./
Для диагностики рекомендую несколько этапов:

  • первый. Отключить опрос всех портов, кроме одного и всех устройств на этом порту кроме одного.
  • В случае продолжения возникновения ошибок на этом порту - отключить от него шину и подключить устройство коротким отдельным кабелем к порту.
  • В случае продолжения ошибок - остановить wb-mtt-serial и опросить устройство modbus_client, в цикле с сотню раз.

таким образом будет понятна причина.

Идея понятна. Прошу подсказать по этапу 1, как это удобнее сделать - устройств не так уж мало в итоге. И в части опроса modbus_client - как это организовать правильно?

Дополнение: сильно смущает тот факт, что ошибки crc со статусом warning в логах присутствуют практически по всем портам

В веб-интерфейсе выключить “лишние” порты, просто сняв галочку “Включить порт”.
На порту - для всех устройств кроме одного также выключить “опрашивать”.

Например так Нестабильная работа модулей подключенных по RS-485 - #14 от пользователя BrainRoot

Отключил все порты, оставил только RS485-2, на котором поочередно включал опрос по одному устройству с интервалом в несколько минут. Из 6 устройств по пяти пришли ошибки:

18-02-2026 20:55:08.735 WARNING: [modbus] failed to read 2 input(s) @ 101 of device modbus:49: Serial protocol error: malformed response: invalid crc
18-02-2026 20:54:58.573 WARNING: [modbus] failed to read 2 input(s) @ 101 of device modbus:49: Serial protocol error: malformed response: invalid crc

18-02-2026 20:59:21.132 WARNING: [modbus] failed to read 2 input(s) @ 270 of device modbus:213: Serial protocol error: malformed response: invalid crc
18-02-2026 20:59:00.900 WARNING: [modbus] failed to read 2 input(s) @ 270 of device modbus:213: Serial protocol error: malformed response: invalid data size
18-02-2026 20:58:32.296 WARNING: [modbus] failed to read 2 input(s) @ 270 of device modbus:213: Serial protocol error: malformed response: invalid data size

18-02-2026 21:07:35.564 WARNING: [modbus] failed to read 2 input(s) @ 270 of device modbus:21: Serial protocol error: malformed response: invalid data size
18-02-2026 21:06:42.033 WARNING: [modbus] failed to read 2 input(s) @ 270 of device modbus:21: Serial protocol error: malformed response: invalid crc

18-02-2026 21:11:10.872 WARNING: [modbus] failed to read 8 coil(s) @ 0 of device modbus_io:196:1: Serial protocol error: request timed out

18-02-2026 21:12:20.583 WARNING: [modbus] failed to read 2 input(s) @ 270 of device modbus:50: Serial protocol error: malformed response: invalid crc
18-02-2026 21:12:06.472 WARNING: [modbus] failed to read 2 input(s) @ 270 of device modbus:50: Serial protocol error: malformed response: invalid data size

После все устройства на том же порту последовательно по адресам были просканированы скриптом:

for i in {1..200}
do
echo “count $i $(modbus_client -mrtu -b115200 -pnone -s2 /dev/ttyRS485-1 -a156 -t0x03 -r104 -c2 | grep Data:)”
done

Везде отзыв стабильно вида

count 200 Data: 0xfffe 0xfffe

Строк без “data” нет

Давайте проверим как раз на 156 устройстве первой шины.
Это WB-UPS v3.
Судя по логу из диагархива

Feb 15 06:00:47 wirenboard-AXCFBMYW wb-mqtt-serial[487947]: WARNING: [modbus] failed to read 8 input(s) @ 2 of device modbus:156: Serial protocol error: malformed response: invalid crc
...
Feb 15 06:02:07 wirenboard-AXCFBMYW wb-mqtt-serial[487947]: WARNING: [serial client] Reading events failed: Serial protocol error: request timed out
Feb 15 06:04:10 wirenboard-AXCFBMYW wb-mqtt-serial[487947]: WARNING: [modbus] failed to read 1 coil(s) @ 0 of device modbus:156: Serial protocol error: malformed response: invalid crc

часть ошибок - таймаут, то есть мастер отправил и ничего не получил в ответ.
Не получил, скорее всего потому что слейв принял с ошибкой. То есть принятый с ошибкой пакет игнорируется.
Вторая часть - ошибки crc. То есть слейв получил, без ошибок, ответил - но ответ принят мастером с ошибкой.
Для того чтобы оценить в каком месте пакета ошибка - нужно посмотреть именно байты ответа.

Вот тут неверно немного, команда нужна 4.
Поправил, поменяйте пожалуйста на

for i in {1..100}; do echo "count $i $(modbus_client --debug -mrtu -b115200 -pnone -s2 /dev/ttyRS485-1 -a156 -t0x04 -r104 -c2 )"; done

Хочется увидеть ошибку. Очень неплохо - если попробуете несколько раз ее получить, при остановленном wb-mqtt-seral, конечно.
Альтернатива - включить Debug в wb-mqtt-serial ну и выгрузить лог с ошибкой в файл.

У меня возникает подозрения что где-то шины соединяются между собой или наводят друг на друга. Вряд ли, конечно.
Тут способ проверить - подключить тот же WB-UPS единственным устройством на порт и попробовать.

Не уверен, что устройство с ID156 - оптимальный выбор, поскольку находится рядом с контроллером.
Вероятность соединения шин между собой - околонулевая, они от контроллера в разные стороны идут.

Но там другой нюанс есть. Обе этих витых пары, используемых для линий RS485, используются не только для этого ввиду дефицита пар. Там еще цифровые сигналы от охранной системы Paradox “ходят”, причем там линия на обе “витые" пары” одна. Сигналы там, насколько я понимаю, аналогичны RS485.

Стоит проверить - просто отключить и оценить, повлияет ли.

Ну, как раз удобно - можно отключить шину дальше и проверить - изменится ли поведение.

Физический доступ к устройствам - только в выходные. Оба предложения проверим.Еще что-то можно предпринять, для детализации картины?

Пожалуй на этом этапе все.