Ошибки invalid crc при работе с ТЕРМ-2000 по modbus

Здравствуйте! Согласно информации от моих коллег, вместо РТМ-2000, производитель предлагает контроллер ТЕРМ-2000, который с первого взгляда является копией РТМ-2000, но на самом деле является другим устройством. Новые устройства - новые проблемы.

На линии ничего, кроме него нет. Подключали и профибасом, и витой парой, расстояние метр, а то и меньше. И с сопротивлением, и без (сейчас с сопротивлением на обоих концах). Пробовал разные настройки, сейчас поставил самые лояльные, по моему мнению: скорость 4800 baud, response timeout 2000 ms, guard interval 100000 us, пробовал разные значения.

Проблема следующая: раз в какое-то чтение, все регистры по очереди загораются красным, затем обратно чернеют.

В логах при этом Serial protocol error: malformed response: invalid crc:

Фрагмент логов
20-01-2025 17:46:54.007	WARNING: [modbus] failed to read 1 holding(s) @ 101 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:53.940	WARNING: [modbus] failed to read 1 holding(s) @ 100 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:53.856	WARNING: [modbus] failed to read 1 holding(s) @ 72 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:53.760	WARNING: [modbus] failed to read 1 holding(s) @ 55 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:53.667	WARNING: [modbus] failed to read 1 holding(s) @ 54 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:53.572	WARNING: [modbus] failed to read 1 holding(s) @ 53 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:51.851	WARNING: [modbus] failed to read 1 holding(s) @ 34 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:51.747	WARNING: [modbus] failed to read 1 holding(s) @ 33 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:51.657	WARNING: [modbus] failed to read 1 holding(s) @ 32 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:51.562	WARNING: [modbus] failed to read 1 holding(s) @ 134 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:51.562	WARNING: [modbus] failed to read 1 holding(s) @ 134 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:47.930	WARNING: [modbus] failed to read 1 holding(s) @ 39 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:47.826	WARNING: [modbus] failed to read 1 holding(s) @ 38 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:47.726	WARNING: [modbus] failed to read 1 holding(s) @ 37 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:47.640	WARNING: [modbus] failed to read 1 holding(s) @ 36 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:47.555	WARNING: [modbus] failed to read 1 holding(s) @ 35 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:44.017	WARNING: [modbus] failed to read 1 holding(s) @ 48 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:43.912	WARNING: [modbus] failed to read 1 holding(s) @ 47 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:43.805	WARNING: [modbus] failed to read 1 holding(s) @ 46 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:43.722	WARNING: [modbus] failed to read 1 holding(s) @ 45 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:43.722	WARNING: [modbus] failed to read 1 holding(s) @ 45 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:43.636	WARNING: [modbus] failed to read 1 holding(s) @ 44 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:43.542	WARNING: [modbus] failed to read 1 holding(s) @ 39 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:20.495	WARNING: [modbus] failed to read 1 holding(s) @ 33 of device modbus:120: Serial protocol error: malformed response: invalid crc
20-01-2025 17:46:20.391	WARNING: [modbus] failed to read 1 holding(s) @ 32 of device modbus:120: Serial protocol error: malformed response: invalid crc

Что ещё можно попробовать, чтобы заставить сие изделие читаться хотя бы без ошибок?

ЗЫ, инструкция (но там я не нашёл даже параметров чётности): https://teploresource.ru/wp-content/uploads/2023/02/Паспорт-ТЕРМ-2000.pdf

Добрый день.

Ну, как минимум устройство получает запрос и что-то отвечает.
Целесообразно для начала проверить что GND устройства и контроллера соединены хорошо.
Если тут проблема нет - тогда включить Debug для wb-mqtt-serial - и глянуть - чем отличается ответ, вместе с CRC от ожидаемого.
Ну и если ошибки будут в произвольных мтестах - то подключить логанализатор и посмотреть что именно передается.

GND точно соединено, специально акцентировал на этом внимание монтажника.

Вот фрагмент, его достаточно?

Фрагмент логов
|21-01-2025 20:18:08.061|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265521332: Wait until 2265521332|
|---|---|
|21-01-2025 20:18:08.061|DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 78 03 02 f0 38 60 5c|
|21-01-2025 20:18:08.027|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265521298: Wait until 2265521398|
|21-01-2025 20:18:08.020|DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us|
|21-01-2025 20:18:08.004|DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 65 00 01 9f bc|
|21-01-2025 20:18:08.003|DEBUG: [port] /dev/ttyRS485-2: Sleep 50000 us|
|21-01-2025 20:18:07.954|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265521224: Wait until 2265521224|
|21-01-2025 20:18:07.953|DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 78 03 02 f0 38 60 5c|
|21-01-2025 20:18:07.953|DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 78 03 02 f0 38 60 5c|
|21-01-2025 20:18:07.927|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265521198: Wait until 2265521298|
|21-01-2025 20:18:07.910|DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us|
|21-01-2025 20:18:07.894|DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 64 00 01 ce 7c|
|21-01-2025 20:18:07.893|DEBUG: [port] /dev/ttyRS485-2: Sleep 50000 us|
|21-01-2025 20:18:07.844|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265521114: Wait until 2265521114|
|21-01-2025 20:18:07.843|DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 78 03 02 ff ce e5 ea|
|21-01-2025 20:18:07.827|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265521097: Wait until 2265521197|
|21-01-2025 20:18:07.801|DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us|
|21-01-2025 20:18:07.785|DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 48 00 01 0f b5|
|21-01-2025 20:18:07.785|DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 48 00 01 0f b5|
|21-01-2025 20:18:07.785|DEBUG: [port] /dev/ttyRS485-2: Sleep 50000 us|
|21-01-2025 20:18:07.735|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265521006: Wait until 2265521006|
|21-01-2025 20:18:07.735|DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 78 03 02 00 28 25 90|
|21-01-2025 20:18:07.727|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265520997: Wait until 2265521097|
|21-01-2025 20:18:07.645|DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us|
|21-01-2025 20:18:07.628|DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 37 00 01 3e 6d|
|21-01-2025 20:18:07.628|DEBUG: [port] /dev/ttyRS485-2: Sleep 50000 us|
|21-01-2025 20:18:07.626|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265520897: Wait until 2265520997|
|21-01-2025 20:18:07.579|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265520849: Wait until 2265520849|
|21-01-2025 20:18:07.579|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265520849: Wait until 2265520849|
|21-01-2025 20:18:07.578|DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 78 03 02 00 28 25 90|
|21-01-2025 20:18:07.536|DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us|
|21-01-2025 20:18:07.526|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265520797: Wait until 2265520897|
|21-01-2025 20:18:07.522|DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 36 00 01 6f ad|
|21-01-2025 20:18:07.519|DEBUG: [port] /dev/ttyRS485-2: Sleep 50000 us|
|21-01-2025 20:18:07.469|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265520740: Wait until 2265520740|
|21-01-2025 20:18:07.469|DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 78 03 02 00 28 25 90|
|21-01-2025 20:18:07.428|DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us|
|21-01-2025 20:18:07.428|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265520698: Wait until 2265520797|
|21-01-2025 20:18:07.428|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265520698: Wait until 2265520797|
|21-01-2025 20:18:07.412|DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 35 00 01 9f ad|
|21-01-2025 20:18:07.411|DEBUG: [port] /dev/ttyRS485-2: Sleep 50000 us|
|21-01-2025 20:18:07.362|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265520632: Wait until 2265520632|
|21-01-2025 20:18:07.361|DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 78 03 02 00 28 25 90|
|21-01-2025 20:18:07.327|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265520598: Wait until 2265520698|
|21-01-2025 20:18:07.319|DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us|
|21-01-2025 20:18:07.302|DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 34 00 01 ce 6d|
|21-01-2025 20:18:07.302|DEBUG: [port] /dev/ttyRS485-2: Sleep 50000 us|
|21-01-2025 20:18:07.252|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265520523: Wait until 2265520523|
|21-01-2025 20:18:07.252|DEBUG: [serial client] </dev/ttyRS485-2 4800 8 N 1>2265520523: Wait until 2265520523|
|21-01-2025 20:18:07.252|DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 78 03 02 00 0a a5 89|
|21-01-2025 20:18:07.227|DEBUG: [serial client] </dev/ttyRS485-1 19200 8 N 1>2265520498: Wait until 2265520598|
|21-01-2025 20:18:07.211|DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us|
|21-01-2025 20:18:07.195|DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 33 00 01 7f ac|
|21-01-2025 20:18:07.194|DEBUG: [port] /dev/ttyRS485-2: Sleep 50000 us|

Мало, тут ошибок-то и нету.

Да, извиняюсь, как-то мало скопировалось

wb-mqtt-serial_20250122T144835.log (303,2 КБ)

Ну, смотрим в лог.
Видим что

2025-01-22T11:48:33.997Z [wb-mqtt-serial] DEBUG: [port] /dev/ttyRS485-2: Sleep 20000 us
2025-01-22T11:48:34.027Z [wb-mqtt-serial] DEBUG: [port] /dev/ttyRS485-2: Sleep 50000 us
2025-01-22T11:48:34.027Z [wb-mqtt-serial] DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 6f 00 01 bf be
2025-01-22T11:48:34.043Z [wb-mqtt-serial] DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us

У устройства 120 запрошен 1 holding с адреса 0x6f (111)
2025-01-22T11:48:34.079Z [wb-mqtt-serial] DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 8e 78 03 02 00 00 25
После чего мастер ожидал ответа 16,5мс и дождался:
8e 78 03 02 00 00 25

Предположу что ответ должен был быть “78 03 02 00 00 25 XX”
Так как он в любом случае начинается с адреса устройства, затем функция и количество байт. Ну и сами байты. И, если посчитать CRC то он должен выглядеть так: 0x8e 0x25.
То есть “78 03 02 00 00 25 8e”
И это после 70мс ожидания, то есть точно можно исключить что вернулся хвост от предыдущего сообщения.

Аналогичное с запросом ответом

2025-01-22T11:48:33.872Z [wb-mqtt-serial] DEBUG: [port] /dev/ttyRS485-2: ReadFrame: e3 78 03 02 00 00 25
2025-01-22T11:48:33.836Z [wb-mqtt-serial] DEBUG: [port] /dev/ttyRS485-2: Sleep 16667 us
2025-01-22T11:48:33.820Z [wb-mqtt-serial] DEBUG: [port] /dev/ttyRS485-2: Write: 78 03 00 6d 00 01 1e 7e

“0xe3” никак не может быть результатом от предыдущего запроса, не сходится.
Соответственно: Устройство отвечает располагая байты не в том порядке. Причем иногда.
Думаю что в его прошивке ошибки.

Понял, спасибо.

Будем пробовать разбираться с производителем.

Ну баг ведь явный и воспроизводимый. Напишите им, дайте ссылку на эту тему. А так как баг - сразу возьмут в разработку и выпустят фикс прошивки.

столкнулся с похожей ошибкой только на модуле map6s. Использую их несколько, и от одного периодически приходят пакеты с некорректным CRC. рядом стоит такой же, подключен в тот же порт на контроллере и никаких ошибок нет. пробовал подключать по новой (менял провода с тем что работает корректно), не помогает. Лучше создать отдельную тему?

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