Регистры string8

В продолжение истории про ОВЕН ПВТ-110.

Обновился на новый релиз, поддержка “string8” появилась, но с “тараканами”.

У ПВТ-110 есть 3 интересных строковых свойства:

  1. Модель.
  2. Серийный номер.
  3. Версия.

Первые 2 в списке устройств показывают 0, версия читается и показывается, но есть мнение, что она не 0.13, а 1.30 (см. ниже)

В логе wb-rules есть такие записи:

25-05-2025 13:41:13.075	ERROR: [driver] handleControlValue() failed: strconv.ParseFloat: parsing "0000000000000000 0  ": invalid syntax
25-05-2025 13:41:13.073	ERROR: [driver] handleControlValue() failed: strconv.ParseFloat: parsing ".130  ": invalid syntax
25-05-2025 13:41:13.071	ERROR: [driver] handleControlValue() failed: strconv.ParseFloat: parsing "VP1T01      ": invalid syntax

Последняя строка подсказывает, что байтики в строке тоже надо бы развернуть, но указание "word_order": "little_endian" не помогает в отличие от float.

При этом в списке каналов MQTT для модели и серийного номера NaN.

Готов к разным идеям. Датчика под рукой пока нет, но, скорее всего, на неделе появится.
owen-pvt-110.json (3,0 КБ)

Добрый день.
Вижу что описано как

		"type": "value",
		"format": "string8",

То есть строку планируется выводить как числовое значение?
Я бы все ж использовал соответствующий (текстовый) тип - потому что сконверитировать не получается.
Ну и - покажите пожалуйста результат чтения регистров, какие знгачения из них фактически читаются.

Действительно, ступил. С типом text результат показывается. Но все равно криво.

Данные из регистра 1000 (должно быть PVT110, а получается VP1T01 ):

11][03][03][E8][00][06][47][28]
Waiting for a confirmation...
<11><03><0C><56><50><31><54><30><31><20><20><20><20><20><20><62><2E>
SUCCESS: read 6 of elements:
        Data: 0x5650 0x3154 0x3031 0x2020 0x2020 0x2020 

В документации про word_order написано:

// Порядок 16-битных слов для каналов, имеющих размер больше 16 бит.
                            // Возможные значения:
                            //  "big_endian" (по-умолчанию): [0xAA 0xBB] [0xCC 0xDD] => 0xAABBCCDD
                            //  "little_endian":  [0xAA 0xBB] [0xCC 0xDD] => 0xCCDDAABB
                            "word_order" : "big_endian",

Тут, пожалуй посоветуюсь с разработчиками, нужно ли считать строку многорегистровой?
Потому что

// "string8" - то же самое, что "string", но по два символа на регистр, сначала старший байт, потом - младший

Именно так оно и работает.
То есть - ключевой вопрос - должен ли word_order работать со строкой.

Судя по поведению, текущее мнение реализации — строка всегда считается как liitle endian. Что, вообще-то логично, так как символы идут по возрастанию условных “адресов”.

Но у разработчиков ОВЕН чуть другое мнение (там есть закладка, которая может поменять порядок байт, но не хотелось бы ей пользоваться, хотя я проверю чуть позже как это работает).

Но вопрос еще более тонкий, ибо little endian и big endian применимы и к 16-битным значениям. Насколько я понимаю, Modbus не навязывает порядок байт, верно?

Ну - спросил у разработчиков, возможно сделают чтобы порядок байт менялся word_order. Пока не ответили.

Да, это просто транспорт.

Проверил переключение порядка байт в ПВТ-110. Он меняет порядок во всем. Например, по умолчанию (little endian):

  1. Температура 0xac52 0x41da (27.33414)
  2. Модель 0x5650 0x3154 0x3031 0x2020…

После переключения (big endian):

  1. Температура 0xda41 0x2a70
  2. Модель 0x2020 … 0x2020 0x3130 0x5431 0x5056

В общем-то, не поспоришь: попросили в big endian, так все в big endian, включая символы и регистры строки.

К WB пока не подключал, поэтому как wb-mqtt-serial переварит полную смену порядка байт пока не знаю. Сегодня ближе к вечеру проверю и это.

Но есть у меня ощущение, что по-простому поддержать порядок байт в регистре для string8 это точно вернуться с течением времени к этому вопросу. Один черт знает, что взбредет в голову разработчикам железок и float они запакуют, например, как 0x41da 0xac52: это странный вариант, потому что байты регистрах LE, а порядок регистров BE.

Да, записал в идеи. Думаю - сделаем. Но нужно вводить еще один параметр для этого.

Спасибо.

Но нужно вводить еще один параметр для этого.

Возможно, стоит расширить список вариантов для word_order.

Поскольку тут внутри словва - будет скорее byte_order.

1 лайк