Modbus групповое считывание регистров

Мне кажется, я понял как воспроизвести ошибку:
Вот лог, когда на слейве 16 регистров

01-03-2024 09:10:16.898	DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 80 03 0c 0c a4 0c 9e 0c c2 0c c2 00 00 00 e7 2f a5
01-03-2024 09:10:16.852	DEBUG: [port] /dev/ttyRS485-1: Sleep 695 us
01-03-2024 09:10:16.850	DEBUG: [port] /dev/ttyRS485-1: Write: 80 03 00 02 00 06 7a 19
01-03-2024 09:10:16.849	DEBUG: [port] /dev/ttyRS485-1: Sleep 10 us
01-03-2024 09:10:16.835	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726985: Wait until 254727000
01-03-2024 09:10:16.735	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726885: Wait until 254727000
01-03-2024 09:10:16.634	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726785: Wait until 254727000
01-03-2024 09:10:16.543	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726684: Wait until 254727000
01-03-2024 09:10:16.434	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726584: Wait until 254727000
01-03-2024 09:10:16.434	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726584: Wait until 254727000
01-03-2024 09:10:16.340	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726484: Wait until 254727000
01-03-2024 09:10:16.241	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726384: Wait until 254727000
01-03-2024 09:10:16.139	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726284: Wait until 254727000
01-03-2024 09:10:16.040	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726184: Wait until 254727000
01-03-2024 09:10:15.942	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726084: Wait until 254727000
01-03-2024 09:10:15.942	DEBUG: [serial port driver] channel '1' of device 'wb-modbus-0-1' <-- 3240
01-03-2024 09:10:15.942	DEBUG: [register] new val for <modbus:128:holding: 1>: ca8
01-03-2024 09:10:15.942	DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 80 03 0c 0c a8 0c a2 0c 9c 0c c0 0c c0 00 00 94 d7
01-03-2024 09:10:15.892	DEBUG: [port] /dev/ttyRS485-1: Sleep 695 us
01-03-2024 09:10:15.892	DEBUG: [port] /dev/ttyRS485-1: Sleep 695 us
01-03-2024 09:10:15.892	DEBUG: [port] /dev/ttyRS485-1: Write: 80 03 00 01 00 06 8a 19
01-03-2024 09:10:15.892	DEBUG: [port] /dev/ttyRS485-1: Sleep 10 us
01-03-2024 09:10:15.892	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254726040: Wait until 254726040
01-03-2024 09:10:15.892	DEBUG: [serial port driver] channel '0' of device 'wb-modbus-0-1' <-- 3245
01-03-2024 09:10:15.892	DEBUG: [register] new val for <modbus:128:holding: 0>: cad
01-03-2024 09:10:15.892	DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 80 03 0c 0c ad 0c a8 0c a2 0c 9c 0c c0 0c c0 f1 25
01-03-2024 09:10:15.852	DEBUG: [port] /dev/ttyRS485-1: Sleep 695 us
01-03-2024 09:10:15.852	DEBUG: [port] /dev/ttyRS485-1: Write: 80 03 00 00 00 06 db d9
01-03-2024 09:10:15.849	DEBUG: [port] /dev/ttyRS485-1: Sleep 10 us
01-03-2024 09:10:15.849	DEBUG: [port] /dev/ttyRS485-1: Sleep 10 us
01-03-2024 09:10:15.844	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725994: Wait until 254726000
01-03-2024 09:10:15.744	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725894: Wait until 254726000
01-03-2024 09:10:15.643	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725794: Wait until 254726000
01-03-2024 09:10:15.544	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725693: Wait until 254726000
01-03-2024 09:10:15.443	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725593: Wait until 254726000
01-03-2024 09:10:15.353	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725493: Wait until 254726000
01-03-2024 09:10:15.243	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725393: Wait until 254726000
01-03-2024 09:10:15.143	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725293: Wait until 254726000
01-03-2024 09:10:15.043	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725193: Wait until 254726000
01-03-2024 09:10:15.043	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725193: Wait until 254726000
01-03-2024 09:10:14.946	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254725093: Wait until 254726000
01-03-2024 09:10:14.946	DEBUG: [serial port driver] channel '5' of device 'wb-modbus-0-1' <-- 3262

image
данные вроде обновляются, но посмотрите как это происходит - контроллер формирует запрос на считывание 6 регисров и перебирает стартовый адрес. И записывает изменение только этого регистра.
А теперь на слейве только 6 регистров

01-03-2024 09:14:37.325	DEBUG: [port] /dev/ttyRS485-1: Sleep 695 us
01-03-2024 09:14:37.307	DEBUG: [port] /dev/ttyRS485-1: Write: 80 03 00 04 00 06 9a 18
01-03-2024 09:14:37.307	DEBUG: [port] /dev/ttyRS485-1: Sleep 10 us
01-03-2024 09:14:37.307	DEBUG: [port] /dev/ttyRS485-1: Sleep 20000 us
01-03-2024 09:14:37.307	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254987438: Wait until 254987438
01-03-2024 09:14:37.307	DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 80 83 02 90 d9
01-03-2024 09:14:36.233	DEBUG: [port] /dev/ttyRS485-1: Sleep 695 us
01-03-2024 09:14:36.228	DEBUG: [port] /dev/ttyRS485-1: Write: 80 03 00 03 00 06 2b d9
01-03-2024 09:14:36.228	DEBUG: [port] /dev/ttyRS485-1: Sleep 10 us
01-03-2024 09:14:36.228	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254986378: Wait until 254986378
01-03-2024 09:14:36.228	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254986378: Wait until 254986378
01-03-2024 09:14:36.228	DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 80 83 02 90 d9
01-03-2024 09:14:35.178	DEBUG: [port] /dev/ttyRS485-1: Sleep 695 us
01-03-2024 09:14:35.178	DEBUG: [port] /dev/ttyRS485-1: Write: 80 03 00 02 00 06 7a 19
01-03-2024 09:14:35.178	DEBUG: [port] /dev/ttyRS485-1: Sleep 10 us
01-03-2024 09:14:35.178	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254985315: Wait until 254985315
01-03-2024 09:14:35.178	DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 80 83 02 90 d9
01-03-2024 09:14:34.129	DEBUG: [port] /dev/ttyRS485-1: Sleep 695 us
01-03-2024 09:14:34.129	DEBUG: [port] /dev/ttyRS485-1: Write: 80 03 00 01 00 06 8a 19
01-03-2024 09:14:34.129	DEBUG: [port] /dev/ttyRS485-1: Sleep 10 us
01-03-2024 09:14:34.129	DEBUG: [port] /dev/ttyRS485-1: Sleep 10 us
01-03-2024 09:14:34.129	DEBUG: [serial client] </dev/ttyRS485-1 115200 8 N 1>254984259: Wait until 254984259
01-03-2024 09:14:34.129	DEBUG: [serial port driver] channel '0' of device 'wb-modbus-0-1' <-- 3492
01-03-2024 09:14:34.129	DEBUG: [register] new val for <modbus:128:holding: 0>: da4
01-03-2024 09:14:34.129	DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 80 03 0c 0d a4 0d 9f 0d 99 0d 93 0d b7 0d b7 ef 01
01-03-2024 09:14:33.062	DEBUG: [port] /dev/ttyRS485-1: Sleep 695 us
01-03-2024 09:14:33.061	DEBUG: [port] /dev/ttyRS485-1: Write: 80 03 00 00 00 06 db d9

image

контроллер так же пытается перебрать регистры, но после 0 адреса получает ошибку и соответственно, другие регистры не обновляет

Довольно интересно. Благодарю, отличный дебаг!
Так, то есть планировщик драйвера в очередь опроса ставит, получается регистры по одному все равно. Причем только в случае когда указана явная задержка между опросами.

Тут то же.
В общем понятно что требуется исправлять: Драйвер не должен планировать групповое чтение если на устройстве нет непрерывных регистров.

на мой взгляд, драйвер работает некорректно. В документации везде написано об оптимизации запросов, но я этого не наблюдаю. Именно поэтому вручную задается минимальное кол-во считываемых регистров. Без этого параметра регистры читаются по одному, несмотря на то, что идут по порядку.
когда можно ожидать исправления и как о выходе можно будет узнать?

Какой-то ответ будет?

В чем некорректность?
В параметрах указано - минимальное чтение 6 (например) регистров.
В канале указано что используется один, например, из них.
Драйвер ничего не оптимизирует при составлении таблицы опроса, он читает указанное количество регистров, используя только нужные для текущего канала.
А что, например, делать если при чтении захватывается часть (старшая или младшая) широкого, хранящегося в нескольких подряд регистрах значения?
Оптимизация - это установка приоритетов на чтение, гарантирующих что регистры будут прочитаны за установленное время.

Я создал описание в трекере, - тут подожду реакции разработчиков.

Это ваша документация, где описан процесс оптимизации с целью уменьшения кол-ва запросов

Установил в шаблоне

"enable_wb_continuous_read": true,

Ну и получил явное сообщение о том что режим не включен:

Mar 06 11:27:04 wirenboard-AWWCDXFH wb-mqtt-serial[6221]: DEBUG: [modbus] write 1 (type 0)(s) @ 114 of device modbus:10
Mar 06 11:27:04 wirenboard-AWWCDXFH wb-mqtt-serial[6221]: DEBUG: [port] /dev/ttyRS485-2: Sleep 500 us
Mar 06 11:27:04 wirenboard-AWWCDXFH wb-mqtt-serial[6221]: DEBUG: [port] /dev/ttyRS485-2: Write: 0a 06 00 72 00 01 e9 6a
Mar 06 11:27:04 wirenboard-AWWCDXFH wb-mqtt-serial[6221]: DEBUG: [port] /dev/ttyRS485-2: Sleep 9167 us
Mar 06 11:27:04 wirenboard-AWWCDXFH wb-mqtt-serial[6221]: DEBUG: [port] /dev/ttyRS485-2: ReadFrame: 0a 86 02 b2 63
Mar 06 11:27:04 wirenboard-AWWCDXFH wb-mqtt-serial[6221]: WARNING: [modbus] Continuous read is not enabled [slave_id is 10]

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

Логично, если по документации

// Включить режим непрерывного чтения регистров.
// Поддерживается только в устройствах Wiren Board
"enable_wb_continuous_read": true,

я же ожидаю оптимизации для обычного устройства с Modbus, о чем и написано в документации.

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

Разработчики посмотрели? Есть какой-либо ответ?

Задача пока в бэклоге. Сейчас основные ресурсы - на запуске WB8, думаю уже после ответят.