Чтение регистров modbus и создание шаблона

Читаю данные с устройства утилитой modbus_client

modbus_client --debug -mrtu -b19200 -pnone -s2 /dev/ttyMOD1 -a100 -t0x03 -r46165 -c3
Opening /dev/ttyMOD1 at 19200 bauds (N, 8, 2)
[64][03][B4][55][00][03][3B][DE]
Waiting for a confirmation...
<64><03><06><13><1F><14><17><0B><16><12><4C>
SUCCESS: read 3 of elements:
        Data: 0x131f 0x1417 0x0b16

Устройство отвечает, данные верные.
Формат данных такой (это время и дата):
image

Не могу понять, как создать шаблон из такого запроса или что выбирать в веб-конфигураторе, чтобы хотя бы значения отобразились в топиках. wiki читал, всё равно не понятно.
(Устройство болидовское)

Добрый день.
В шаблоне читать отдельные биты так:
"address":"46165:0:4" - тут читаются 4 младших бита регистра 46165
Это описано в документации

Вам нужно читать работать именно с датой и временем? Здесь есть сложность - надо читать три регистра, в шаблоне это не прописать (пока). Я проверил на С2000-ПП (это он же?) - при попытке чтения одного, двух или четырех регистров С2000-ПП выдает ошибку.

Пример для опроса С2000-ВТ:

{
    "device_type": "S2000-PP",
    "device": {
        "name": "S2000-PP",
        "id": "s2000-pp",
        "channels":[
            {
                "name": "2_Bedroom_T",
                "reg_type": "holding_multi",
                "address": "0x7530",
                "type": "value",
                "format": "s16",
                "scale": 0.00390625,
                "round_to": 0.1
            },
            {
                "name": "2_Bedroom_H",
                "reg_type": "holding_multi",
                "address": "0x7531",
                "type": "value",
                "format": "s16",
                "scale": 0.00390625,
                "round_to": 1
            }
        ]
    }
}

опикстартер читает как раз три регистра без ошибок:

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

По одному регистру читать не получается - устройство возвращает ошибку. Только три:

Да уж, довольно хитро сделали. Тут, пожалуй, только через GitHub - wirenboard/wb-mqtt-serial: Wiren Board MQTT serial protocol driver можно сделать, кстати, проверю.

Устройство C2000КДЛ-Modbus, но я не думаю, что там сильные отличия от С2000-ПП.
Дата и Время для примера, я хочу научится работать с несколькими регистрами. Читал документацию, пробовал различные варианты через wirenboard - не получилось, запросил помощь через форум.
Да, через консольную утилиту три регистра читаются без проблем, попытка прочитать их по одному выдаёт ошибку - действительно. Как и многие другие, где и 6 регистров есть. Вопрос в управлении и визуализации этих данных механизмами самого wirenboard.

Да, как и говорил - попробую показать способ через прямое чтение.

Спасибо, буду ждать :+1:

C2000-КДЛ-Modbus, насколько я понимаю, это C2000-КДЛ + C2000-ПП в одном корпусе. Получить данные от устройства можно двумя способами.

  1. В один регистр пишем, что нам надо, из другого читаем данные. Этот режим в шаблоне wb-mqtt-serial не описать.
  2. Те данные, которые хранятся в памяти устройства, можно прочитать непосредственно. Этот режим описан в п.6.12.3.3 руководства по эксплуатации C2000-КДЛ-Modbus. Использовать этот режим вам ничего не мешает. Шаблон, который я привел выше, как раз для этого режима.
    Еще учитывайте, что устройство часто возвращает ошибку 6 в ответ на запрос просто потому, что в этот момент занято опросом устройств, висящих на ДПЛС, и ответить не может.

Да, занялся. Заодно в документации там же поправии несколко непонятных моментов.

Косвенная адресация вполне возможна, скриптом.

Сейчас в драйвере можно задать разные регистры для чтения и записи. То есть по одному адресу читаем, по другому пишем (опции address и write_address).

Тут не совсем так. Например нужно получить значение с “устройства 100”.
В modbus регистр “адрес” (с адресом x) пишем 100. И периодически читаем его, пока из него и читаться не будет записанное 100 (индикатор того что данные готовы).
После этого в регистре “данные” (с адресом y) будет искомое значение.
Сейчас serial это не умеет ну и логика для разных устройоств - разная, ее целесообразнее реализовать как раз прямым доступом к порту, сейчс пишу “общий пример”.