Помощь в написании шаблона LKDS B (Лифт)

Добрый день!

Столкнулся с проблемой порядка байтов. Кручу верчу, не складывается.

ModBUS_prot_Обь.pdf (1,5 МБ)

Интересует считывание регистра:

0060h Количество включений главного привода (мл. байт) 0x01020304
(0x04)

Считываю несколько раз, отлавиваю изменения:

modbus_client --debug -mrtu -pnone -s2 -b19200 /dev/ttyRS485-1 -a1 -t0x04 -r0x60 -c 2
 Data: 0xa203 0x0000
 Data: 0xa303 0x0000
 Data: 0xa403 0x0000
 Data: 0xa503 0x0000

Как правильно составить шаблон для этого регистра?
big_endian и little_endian кажтся не дали правильный результат.

Сейчас вот так:

{
    "name": "Number of main drive inclusions",
    "reg_type": "input",
    "address": "0x60",
    "word_order": "big_endian",
    "format": "u32"
}
                            //  "big_endian" (по-умолчанию): [0xAA 0xBB] [0xCC 0xDD] => 0xAABBCCDD
                            //  "little_endian":  [0xAA 0xBB] [0xCC 0xDD] => 0xCCDDAABB

Тут похоже меняется значение старшего байта.

Но ели выбрать le - то меняются только слова местами, причем только для 32-битных и больше значений. На 16-битные значения (один регистр) - не влияет.
Тут можно прочитать биты, думаю.
Напрмер, младшая часть:

address":"96:0:8"

и старшая

address":"96:8:8"

Если будем так считывать 4 байта отдельно, их нужно будет склеить внешним сервисом?
Есть ли способ внутри wb-mqtt-serial получить правильный u32?

Да, склеивать - уже внешним, сейчас нет byteswap внутри самого wb-mqtt-serial.
Хотя - если обрабатывать все равно внешним, то можно и читать “как есть” а преобразовывать уже снаружи.
Ну и на BCD не похоже - там значение было б [0-9].

А можно просто в HEX записать как есть? Уж не хочется на разные топики разбивать.
А то еще возникнут проблемы синхронизации при смене “десятка”.
UPD:
А в принципе не важно, на C++ не проблема.

Кажется нашел багу, но пока не пойму где именно.
Если поменять в шаблоне
“max_read_registers”: 1
на
“max_read_registers”: 10
часть топиков показывают ложную информацию.

Например, регистр 0x11:8:8, который означает текущий этаж, при “max_read_registers”: 1 работает корректно, но при “max_read_registers”: 10 похоже, что дублирует 0x11:0:8.

Я снял логи с двумя вариантами шаблона. Сможете посмотреть?

regs.txt (598 байтов)
wb-mqtt-serial_lkds_1.txt (45,2 КБ)
wb-mqtt-serial_lkds_10.txt (42,0 КБ)
config-lkds-ob.json (2,9 КБ)

UPD:
Чуть-чуть поправил шаблон.
config-lkds-ob.json (2,8 КБ)

Но на поведение не влияет.
Выгрузка по топикам с “max_read_registers”: 1:

root@IQ289006:/etc/wb-mqtt-serial.conf.d/templates# mosquitto_sub -t /devices/lkds-ob_1/controls/+ -v | ts
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Current stop (floor) 2
Dec 29 16:07:26 /devices/lkds-ob_1/controls/State of door 1 4
Dec 29 16:07:26 /devices/lkds-ob_1/controls/State of door 2 255
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Motion state 4
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Operation mode 0
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Cabin load percentage 0
Dec 29 16:07:26 /devices/lkds-ob_1/controls/1 TBL - Error table 2
Dec 29 16:07:26 /devices/lkds-ob_1/controls/2 PREFIX - Error code 9
Dec 29 16:07:26 /devices/lkds-ob_1/controls/3 SUFFIX - Error code 111
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Number of main drive inclusions 3154313216
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Main drive operating time 2065825792
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Number of door drive inclusions 2416508928
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Door drive operating time 3442343936
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Presence of negative floors 0
Dec 29 16:07:26 /devices/lkds-ob_1/controls/Total number of stops 2

И с “max_read_registers”: 10

root@IQ289006:/etc/wb-mqtt-serial.conf.d/templates# vi config-lkds-ob.json # меняю значение на 10
root@IQ289006:/etc/wb-mqtt-serial.conf.d/templates# service wb-mqtt-serial restart
root@IQ289006:/etc/wb-mqtt-serial.conf.d/templates# mosquitto_sub -t /devices/lkds-ob_1/controls/+ -v | ts
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Current stop (floor) 4
Dec 29 16:09:15 /devices/lkds-ob_1/controls/State of door 1 4
Dec 29 16:09:15 /devices/lkds-ob_1/controls/State of door 2 4
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Motion state 4
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Operation mode 0
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Cabin load percentage 0
Dec 29 16:09:15 /devices/lkds-ob_1/controls/1 TBL - Error table 2
Dec 29 16:09:15 /devices/lkds-ob_1/controls/2 PREFIX - Error code 9
Dec 29 16:09:15 /devices/lkds-ob_1/controls/3 SUFFIX - Error code 0
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Number of main drive inclusions 3154313216
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Main drive operating time 2065825792
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Number of door drive inclusions 2416508928
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Door drive operating time 3442343936
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Presence of negative floors 0
Dec 29 16:09:15 /devices/lkds-ob_1/controls/Total number of stops 2

Тут есть нюанс, неочевидный, но по-моему не исправленный.

"address": "0x11:8:8"

Неверно работает. Надо:

"address": "17:8:8"

то есть в десятичном исключительно виде, когда к битам обращаемся.

Я думал об этом, но вроде работает через 0x11:8:8 (т.е. этаж корректно отображает).

Могу перепроверить через десятичные.

Я тоже перепроверю, конечно.

Это кстати, двоичные файлы?

Были текстовые… Странно. Вижу что не открываются. Сейчас перепроверю.
Сохранял вот так:

wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d 3 | tee /var/log/wb-mqtt-serial_lkds_3.txt

Переделал через screen:
screenlog.0 (392,1 КБ)

Не совсем красиво правда.
В начале запускаю с 1, затем в середине лога прерываю, правлю шаблон на 10 и запускаю wb-mqtt-serial снова.

Смотрим.
Для 11 input:
Он вмегда читается как один регистр:

e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Sleep 0 us
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Write: 01 04 00 11 00 01 61 cf
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Sleep 4584 us
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 01 04 02 02 04 b9 93
e[0me[01;37m<7>DEBUG: [register] new val for <modbus:1:input: 17:8:8>: 2
e[0me[01;37m<7>DEBUG: [serial port driver] channel 'Current stop (floor)' of device 'lkds-ob_1' <-- 2

то есть за “первую” часть прочитан болше 20 раз, всегда старший байт 02.
А младший - меняется.

Ну и при разрешенном чтении в 10 регистров тоже отдельно читает младшую часть

e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Write: 01 04 00 11 00 01 61 cf
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Sleep 4584 us
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 01 04 02 02 04 b9 93
e[0me[01;37m<7>DEBUG: [register] new val for <modbus:1:input: 17:0:8>: 4
e[0me[01;37m<7>DEBUG: [serial port driver] channel 'State of door 1' of device 'lkds-ob_1' <-- 4

и отдельно старшую

e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Sleep 0 us
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Write: 01 04 00 11 00 01 61 cf
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Sleep 4584 us
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 01 04 02 02 04 b9 93
e[0me[01;37m<7>DEBUG: [register] new val for <modbus:1:input: 17:8:8>: 2
e[0me[01;37m<7>DEBUG: [serial port driver] channel 'Current stop (floor)' of device 'lkds-ob_1' <-- 2

А вот тут уже вместе (строка 2733):

e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Sleep 0 us
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Write: 01 04 00 10 00 03 b1 ce
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: Sleep 4584 us
e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 01 04 06 00 02 02 04 ff 04 19 19
e[0me[01;37m<7>DEBUG: [register] new val for <modbus:1:input: 17:8:8>: 4
e[0me[01;37m<7>DEBUG: [register] new val for <modbus:1:input: 18:8:8>: 4
e[0me[01;37m<7>DEBUG: [serial port driver] channel 'Current stop (floor)' of device 'lkds-ob_1' <-- 4

то есть читаем три регистра с 0x10
0x10 = 00 02
0x11 = 02 04
0x12 = ff 04

так.
modbus:1:input: 17:8:8>: 4 А должно быть 02.
<modbus:1:input: 18:8:8>: 4 а должно быть ff, так как при одиночном чтении (просо пример):

e[0me[01;37m<7>DEBUG: [port] /dev/ttyRS485-1: ReadFrame: 01 04 02 ff 04 f9 03
e[0me[01;37m<7>DEBUG: [register] new val for <modbus:1:input: 18:8:8>: ff

Это, похоже, бага. Пойду оформлять.

1 Like

Добрый день!

С прошедними праздниками!
Можете уточнить по статусу?

Добрый день.
Благодарю, пока еще разработчики не занимались. Но описано, в бэклоге стоит, как баг - а значит с приоритетом.

1 Like

В testing текущем - уже исправлено, можно на него переключиться и использовать. Релиз будет в конце месяца, ориентировочно.

1 Like

Большое спасибо!