Запись в Data Low bite по адресу

День добрый!
Производитель устройства предоставил описание с адресацией. Интересует 4-е параметра:

  1. Modbus SlaveID
  2. Baud Rate
  3. Storage Device
  4. Play in a loop
    Вот адресация каждого из них соответственно:

На примере Play in a loop:

modbus_client --debug -mtcp -t0x03 -r0x11 -p4196 192.168.1.202
Connecting to 192.168.1.202:4196
[00][01][00][00][00][06][01][03][00][11][00][01]
Waiting for a confirmation...
<00><01><00><00><00><05><01><03><02><00><00>
SUCCESS: read 1 of elements:
        Data: 0x0000 

записываем 1

modbus_client --debug -mtcp -t0x06 -r0x11 -p4196 192.168.1.202 1
Data to write: 0x1
Connecting to 192.168.1.202:4196
[00][01][00][00][00][06][01][06][00][11][00][01]
Waiting for a confirmation...
<00><01><00><00><00><06><01><06><00><11><00><01>
SUCCESS: written 1 elements!

считываем что получилось

modbus_client --debug -mtcp -t0x03 -r0x11 -p4196 192.168.1.202
Connecting to 192.168.1.202:4196
[00][01][00][00][00][06][01][03][00][11][00][01]
Waiting for a confirmation...
<00><01><00><00><00><05><01><03><02><0F><05>
SUCCESS: read 1 of elements:
        Data: 0x0f05

что никак не 1, а 3845
Текущий код в шаблоне:

			"device_address": {
				"title": "Modbus Address",
				"reg_type": "holding",
				"address": "0xC0",
				"default": 1,
				"min": 1,
				"max": 254,
				"group": "management",
				"order": 1
			},
			"baud_rate": {
				"title": "Baud Rate",
				"reg_type": "holding",
				"address": "0x0B",
				"default": 1,
				"enum": [8, 9, 1, 2, 7, 3, 4, 5, 6],
				"enum_titles": ["2400", "4800", "9600", "19200", "35250", "38400", "57600", "115200", "256000"],
				"group": "management",
				"order": 2
			},
			"storage_device": {
				"title": "Storage device",
				"reg_type": "holding",
				"address": "0x09",
				"default": 2,
				"enum": [2, 4],
				"enum_titles": ["SD Card", "Internal"],
				"required": false,
				"group": "management",
				"order": 3
			},
			"play_in_a_loop": {
				"title": "Play in a loop",
				"reg_type": "holding",
				"address": "0x11",
				"default": 0,
				"enum": [0, 1],
				"enum_titles": ["Disabled", "Enabled"],
				"group": "management",
				"required": false,
				"order": 4
			}

Шаблон не работает, данные не записываются, т.к. запись по адресу идет в HI значение, а производитель явно указывает на LO значение.

Прошу помочь дописать шаблон, чтобы записывались коды из документации производителя, отмеченные красным.

Добрый день.

То есть шаблон работает не так как описано в документации?
Я не готов обсуждать особенности реализации стороннего устройства.
Про шаблон: каакая команда выдается в шину и чем она отличается от ожидаемой?

Мы обсуждали этот вопрос еще вчера. По просьбе создал дополнительный тикет, приложил выдержки из документации производителя, где прописан красным цветом LO адрес, который необходимо прописать при записи в HI адрес.
Шаблон не работает у меня, написан мной. Я не знаю как записать с HI адресом значение в LO адрес. В статье Как писать шаблоны для сторонних Modbus-устройств — Wiren Board тема не раскрывается.
Я не пытаюсь обсуждать особенности реализации стороннего устройства, я прошу помощи в написании шаблона, а в частности в правильном написании адресации. Это свойство modbus протокола, а не особенность устройства.
Я не знаю какая команда отдается в шину по данному шаблону и даже не знаю как можно это посмотреть. Предвидя вопрос привел и вывод команд от modbus_client, где видно, что по HI адресу невозможно записать LO значение. Об этом говорит и производитель, что надо записать LO адрес.
Вот схема с сайта wirenboard


страница Протокол Modbus — Wiren Board
На схеме указана точно такая же адресация протокола, как и на скриншотах документации производителя. Т.е. это не особенность устройства, а свойство протокола.
image
Мне надо имея адрес первого флага записать в последний, который на схеме 08

Из офф документации по modbus

Совмещая документацию производителя и документацию по modbus, мне нужно записать
FF - адрес устройства
06 - код
00 - адрес первого регистра HI
11 - адрес первого регистра LO
00 - номер регистра HI
01 - нужный мне номер регистра LO
XX - CRC сумма
XX - CRC сумма

если я использую в шаблоне

			"play_in_a_loop": {
				"title": "Play in a loop",
				"reg_type": "holding",
				"address": "0x11",
				"default": 0,
				"enum": [0, 1],
				"enum_titles": ["Disabled", "Enabled"],
				"group": "management",
				"required": false,
				"order": 4
			}

я запишу следующую последовательность
FF - адрес устройства
06 - код
00 - адрес первого регистра HI
11 - адрес первого регистра LO вот сюда!
00 - номер регистра HI
01 - нужный мне номер регистра LO МИМО!
XX - CRC сумма
XX - CRC сумма
если я буду записывать командой
modbus_client --debug -mtcp -t0x06 -r0x11 -p4196 192.168.1.202 1
то тоже запишу в 11, а не в нужный мне 01

Поэтому и вопрос - как записать в нужный мне регистр в шаблоне? Что надо указать в изменяемых параметрах enum?

Что такое “LO” и “HI”?
Я не понимаю что именно хотите сделать.

Какая команда (должна) формируется?

Свойство какое?

Пожалуйста, пользуйтесь общепринятой терминологией. Очень сложно понять То что вы называете "нужный мне номер регистра LO " - не имеет отношения к их номерам. Это младший байт значения.
Описывается, например как

"title": "somename",
				"reg_type": "holding",
				"address": "0x11",
                                "max": 255,
                                "format": "u8"
			}

Я проверил. Все опции описаны в документации, очень подробно.

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

Я в принципе благодарен, что вы заставляете меня самообразовываться. Понял, что на сайте нет нужной документации, а на импортном github есть, ваша, и даже на русском.
Есть конечно спорные моменты в рус/eng терминологией, в которой вы меня импортозамещаете. Честно говоря Lo понятнее за время прочтения стало, чем “младший байт”, ну да ладно.
Если вы мне ткнете пальцем что надо написать именно в этом коде шаблона для wirenboard:

"play_in_a_loop": {
				"title": "Play in a loop",
				"reg_type": "holding",
				"address": "0x11",
				"default": 0,
				"enum": [0, 1],
				"enum_titles": ["Disabled", "Enabled"],
				"order": 4
			}

то будет совсем хорошо. Я ведь пришел именно с этой просьбой, обратился за поддержкой.
Дальше я доделаю сам.

В том случае если значение записанное в топик (выбранное из enum) будет 0 - то выполнится (отправится в шину), для устройства с адресом 1:

0x01 0x06 0x00 0x11 0x00 0x00 0xD9 0xCF

Если значение “1” - то
0x01 0x06 0x00 0x11 0x00 0x01 0x18 0x0F

Опять же, я не знаю что вам нужно записывать.

Все правильно, в шаблоне так и написано. Надо записывать 0 или 1, в зависимости от выбора в настройках устройства в dropdown list.
По результату ни через шаблон, ни прямой командой с WB

modbus_client --debug -mtcp -t0x06 -r0x11 -p4196 192.168.1.202 1

это не записывается (выше писал в сообщении подробный вывод и проверку)
Проблема устройства?

config-fn-md01.json (5.7 KB)

Приложил полный файл шаблона

Да, выглядит как довольно неожиданное поведение регистра. Как правило если записываемое значение некорректно - то устройство должно возвращать код ошибки.

Поэтому и обратился за помощью и советом.
Планирую сделать шаблон “для всех” + шаблон в СХ.
Такого устройства еще не было и камни преткновения вполне возможны

Посмотрите шаблон - я знаю про что я говорю. Хотя может быть чуть другими словами, поэтому не понятно.

Ну, сколько не видел шаблонов - обычно для устройств логика прозрачная.
Записал в регистр значение - оно в нем и хранится.
Например записано 22 в регистр температуры - значит и считать его можно. Да, несколько было таких, которых явно в документации указано что уставка пишется в один регистр а действующее (текущее) читается из другого.
Но, в любом случае перед написанием шаблона для Modbus управление и чтение состояния тестируется с помощью отправки команд руками. Не бывает случаев когда modbus_client не работает а шаблон - работает.

Согласен. Поэтому так же перепроверяю. Выше указаны все выходы modbus_client есть
Самое главное, что прямая запись в адрес громкости или по pushbutton работает отлично. Но это запись в Hi (старший байт?), а любая запись в Lo (младший байт) не отрабатывает.
В этом-то и вопрос, т.к. настроечные параметры все должны записываться в “младший”. Как писать?

Modbus RTU всегда пишет регистр целиком. Не существует возможности записывать “отдельно” - поэтому не подскажу.