Запись Hex значения в шаблоне

День добрый!
Подскажите как можно в шаблоне записать значение в Hex, если в web интерфейса мы передаем численное значение в Dec.
Вот, что пишет производитель устройства:

Set device address (0xC0)
The device supports sending the serial command and using a configuration file to set the address.
Set device address by sending the serial command: FF 06 00 C0 00 DL CRC_L CRC_H
DL represents the address to be modified, which can be set to 0-255 (to be converted to hexadecimal number) and DL=0x00-0xFF
Example: Send the command “FF 06 00 C0 00 FE 1D A8” to set the address to 254 (DL=0xFE)
Returned data: “FF 06 00 17 00 01 ED D0”

В шаблоне прописываю следующие значения:

			"device_address": {
				"title": "Modbus Address",
				"reg_type": "holding",
				"address": "0xC0",
				"default": 1,
				"min": 1,
				"max": 254,
				"group": "management",
				"order": 1
			}

Как записать нужное поле modbus адреса в Hex, при том, что, переданое значение из строки в web интерфейсе настройки устройства в формате Dec? Есть ли встроенная в шаблон функция по трансляции? Если есть, то как ее вызвать?

WB 8.4 stable
Внешнее устройство - подключено по RS485 аудиопроигрыватель Flyron FN-MD01

Добрый день. Пока не очень понимаю смысл вопроса, к сожалению:

quote=“evrelse, post:1, topic:22060”]
Подскажите как можно в шаблоне записать значение в Hex, если в web интерфейса мы передаем численное значение в Dec.
[/quote]

В соответствии со спецификацией протокола максимальное значение адреса не может быть более 247.

Независимо от того как сконфигурировано в шаблоне драйвер в любом случае записывает шестнадцатеричное значение в регистр.

В web интерфейсе я воожу десятичное значение modbus адреса. Нажимаю кнопку “Сохранить”.
Как теперь мне взять это Dec значение и записать в регистр устройства Hex значение?
Как это описать в шаблоне, что надо транслировать полученное значение в Hex и записать в адрес 0хС0?

Так… Давайте с примером. Какое значение вводите в интерфейсе, какую последовательность байт (команду) ожидаете для отправки в устройство и чем фактически отправленная отличается от ожидаемой?

Так в первом сообщении все данные как раз.
Сейчас SlaveID = 1. Хочу поменять на любое другое, например на 48. Соответственно в web интерфейсе ввожу в поле 48. Это означает, что в устройство по адресу 0хС0 должно записаться значение 30 в виде FF 06 00 C0 00 30 1D A8.
Если я делаю шаблон:

			"device_address": {
				"title": "Modbus Address",
				"reg_type": "holding",
				"address": "0xC0",
				"default": 1,
				"min": 1,
				"max": 247,
				"group": "management",
				"order": 1
			},

то у меня запишется не 30 (FF 06 00 C0 00 30 1D A8), а введенные мной 48 (FF 06 00 C0 00 48 1D A8) и адрес будет назначен неправильно.
Как описать в шаблоне, что введенный Dec номер надо сконвертировать в Hex и уже его записать по адресу 0хС0?

Пожалуйста покажите что именно записывается, вот именно кусок из лога. У меня не получается воспроизвести.
Если я устанавливаю значение для holding регистра 5 в 48 то получаю ожидаемое 0x30: 0A 06 00 05 00 30 98 A4

Не готов экспериментировать с SlaveID, чтобы не потерять устройство. Предлагаю попробовать с уровнем громкости. Он может быть от 0 до 30.
По документации производителя у нас есть два параметра

  1. Изменяемый уровень громкости (06H)
  2. Опросный уровень громкости (03H)

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

Что видим в Устройствах:


Громкость на максимум, но это значение не 30, а 2821. Причем при опросе значение -8680.
Попробуем изменить громкость ползунком. Она меняется от 0 до 30

Это громкость 4. Все, что больше 9 поставить невозможно, ползунок “улетает” на максимум.
Попробуем поставить вручную в поле ввода

Это громкость 16. После установки и нажатия Enter, значение возвращается на 2821. При этом значение в поле Query меняется в некоторой зависимости:
0 в -8704
4 в -8700
5 в -8699
6 в -8698
30 в -8674
При этом можно поставить и 31 и 40 и 50, т.е. громкость больше заявленной 30 возможна, но не реальна, т.к. не увеличивается на устройстве.

Т.е. возможные варианты проблемы:

  1. При выборе Dec значения не происходит конвертация и запись в Hex - записывается в Dec. Запись и отображение не соответствуют реальности (значения в range и value)
  2. Прочитанные из адреса значения Hex конвертируются несколько раз и выводятся в непонятные числа
  3. Возможно есть сдвиг параметров, т.к. прослеживается слабая зависимость в значениях, но из-за нескольких конвертаций его наверное не стоит использовать

Поставил “offset”: 8704
Значение Query приняло нормальный вид

Но значение Specify volume не поддается анализу и корректировке

итоговый код шаблона

Получается значение как-то записывается из range, но из value и в value читается и пишется не правильно

Вы установили тип s16. Зачем?

Пожалуйста, сделайте следующее:
Запишите в регистр 0x06 значение, например 15.
Остановите wb-mqtt-serial и прочитайте из этого регистра значение с помощью modbis_client.
Оно отличается от ожидаемого?

Запишите и прочитайте значения с помощью modbus_client.
Читается записанное?

Это modbus tcp. Как правильно к нему обратиться?
image

Подробно описано тут: Утилита «modbus_client» — Wiren Board
Пример:

modbus_client --debug -mtcp 10.0.0.71 -p 502  -a11 -t3 -r 250 -c 1
Connecting to 10.0.0.71:502
[00][01][00][00][00][06][0B][03][00][FA][00][01]
Waiting for a confirmation...
<00><01><00><00><00><05><0B><03><02><00><31>
SUCCESS: read 1 of elements:
	Data: 0x0031 

Возвращается прежнее значение

0x0b05 = 2821

При этом в Query отображается поставленное мной 15

Такой же вариант с громкостью 12

Брал по образу и подобию из шаблонов. А что необходимо в данном случае?

Я верно понимаю, что записав в регистр 0xf вы читаете из него 0xb05?

Тогда используйте write_address для описания этого регистра.

Список всех типов в документации, не подскажу, поскольку не знаю в каком виду нужно.

write_address решил одну проблему - указание на ползуне range стали реальными. Но прямой запрос значения value по прежнему дает не реальное значение

добавил write_address и в поле value
при этом изменение в value отображается в Query, но не отображается в range

Продолжу задавать неудобные вопросы


Как записать в адрес 02 или 04? В адрес 0х09 записать 2 или 4 не правильно. Надо изменить адрес? На какой?

Как я понимаю, тема себя исчерпала, она была начата для проверки “неверной работы” драйвера, бага не подтвердилась. Если есть еще вопросы - то начните новую.

Не понимаю чем вопрос “неудобен”. Я предполагаю что вы прочитали документацию к драйверу.
Если его поведение расходится с тем что описано - готов помочь.