Работа с термоанемометром ТТМ-2-04

Никак не могу “подружить” этот датчик и WB.

Документация на датчик тут: https://www.eksis.ru/upload/manuals/ttm-2-04.pdf

В документации указана скорость (4800), но не указан адрес (после звонка в техподдержку производителя выяснил, что адрес - 1).

Подключил этот датчик на 2 порт WB (там только этот датчик). Сканирование его не находит.

В настройках создал устройство (и канал “скорость”):

Канал “температура” выглядит так:

В веб-интерфейсе устройство появилось. И даже что-то там читает… но данные - совершенно неадекватные:

Тип данных в доке - float, в настройках параметра выбрано “32бит с плавающей точкой”.

Как получить правильные данные?

Добрый день.

“Сканирование” предназначено только для устройств имеющих стандартные для wirenboard регистры. То есть - для устройств wirenboard.
Для сторонних - надо перебирать имено присутствующие регистры.

Я не увидел в описании регистров упоминания поавающей точки.
Выбран неверный формат. Использовать надо uint32

Выделил в тексте:

При выборе uint32 тоже “скачут” показания. Только выглядят чуть иначе:

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

с modbus_client все стало еще сложнее:

root@wirenboard-A6O2ZIO2:~# modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r0

Opening /dev/ttyRS485-2 at 4800 bauds (N, 8, 1)

[01][04][00][00][00][01][31][CA]

Waiting for a confirmation...

<01><84><03><03><01>

ERROR Illegal data value

ERROR occured!

root@wirenboard-A6O2ZIO2:~# modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r1

Opening /dev/ttyRS485-2 at 4800 bauds (N, 8, 1)

[01][04][00][01][00][01][60][0A]

Waiting for a confirmation...

<01><84><02><C2><C1>

ERROR Illegal data address

ERROR occured!

root@wirenboard-A6O2ZIO2:~# modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r2

Opening /dev/ttyRS485-2 at 4800 bauds (N, 8, 1)

[01][04][00][02][00][01][90][0A]

Waiting for a confirmation...

<01><84><03><03><01>

ERROR Illegal data value

ERROR occured!

root@wirenboard-A6O2ZIO2:~# modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r3

Opening /dev/ttyRS485-2 at 4800 bauds (N, 8, 1)

[01][04][00][03][00][01][C1][CA]

Waiting for a confirmation...

<01><84><02><C2><C1>

ERROR Illegal data address

ERROR occured!

root@wirenboard-A6O2ZIO2:~# modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r4

Opening /dev/ttyRS485-2 at 4800 bauds (N, 8, 1)

[01][04][00][04][00][01][70][0B]

Waiting for a confirmation...

<01><04><02><00><00><B9><30>

SUCCESS: read 1 of elements:

Data: 0x0000

root@wirenboard-A6O2ZIO2:~# modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r5

Opening /dev/ttyRS485-2 at 4800 bauds (N, 8, 1)

[01][04][00][05][00][01][21][CB]

Waiting for a confirmation...

<01><04><02><00><00><B9><30>

SUCCESS: read 1 of elements:

Data: 0x0000

root@wirenboard-A6O2ZIO2:~# modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r6

Opening /dev/ttyRS485-2 at 4800 bauds (N, 8, 1)

[01][04][00][06][00][01][D1][CB]

Waiting for a confirmation...

<01><84><02><C2><C1>

ERROR Illegal data address

ERROR occured!

root@wirenboard-A6O2ZIO2:~#

то ли я не понимаю, как его “вычитать”… то ли документация не соответствует.

Вроде делаю все правильно - (ведь по одному адресу он дает нормальный ответ)… на шине ничего кроме датчика этого не висит. Вычитываю как написано в документации функцией 0x04, номера регистров - ну тут сложно ошибиться (но все равно “перебираю” по очереди)…

Точно ли остановлен на момент чтения wb-mqtt-serial?

как правило означает что запрашиваемого регистра на устройстве нет.
Прочитайте два регистра сразу, например выполнив

modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r2 -c2

Стало лучше:

root@wirenboard-A6O2ZIO2:~# systemctl stop wb-mqtt-serial
root@wirenboard-A6O2ZIO2:~# modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r2 -c2
Opening /dev/ttyRS485-2 at 4800 bauds (N, 8, 1)
[01][04][00][02][00][02][D0][0B]
Waiting for a confirmation...
<01><04><04><09><CE><41><E5><68><3C>
SUCCESS: read 2 of elements:
	Data: 0x09ce 0x41e5 
root@wirenboard-A6O2ZIO2:~# modbus_client --debug -mrtu -b4800 -pnone -s1 /dev/ttyRS485-2 -a1 -t0x04 -r0 -c2
Opening /dev/ttyRS485-2 at 4800 bauds (N, 8, 1)
[01][04][00][00][00][02][71][CB]
Waiting for a confirmation...
<01><04><04><30><34><3F><8C><A5><1F>
SUCCESS: read 2 of elements:
	Data: 0x3034 0x3f8c 
root@wirenboard-A6O2ZIO2:~# 

Соответственно, в этом выводе сначала опрашивается 2 регистр, а потом - 0

Собственно, тут должна быть температура подаваемого воздуха.
Воспользовался калькулятором:

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

Для скорости потока тот же калькулятор (с теми же преобразованиями) дал следующее:

Что тоже похоже на правду - скорость потока чуть больше 1м/с

Теперь уже вопрос - как собственно это в WB реализовать?

Вот тут описано: Разбираем float на части / Хабр
Если считать 0x09ce41e5 - float то у него старший бит опущен. Положительное. Считаем:
0b0000 1001 1100 1110 0100 0001 1110 0101
Экспонента - 0b000 1001 11
Мантисса - 0b110 0100 0001 1110 0101

Экспонента 13-127=-114
мантисса 100100000111100101 = 147941 то есть 1,47941

Все верно.
В документации:

// "float" - число с плавающей точкой IEEE 754. 32 bit. (big-endian).
                            //     (занимает 2 регистра, начиная с указанного)

Соотвтетсвено канал надо описать как:

    "name" : "Temp 1",
    "reg_type" : "input",
    "address" : 2,
    "type": "temperature",
    "format": "float",
    "word_order" : "little_endian"

Из важного: порядок слов, “word_order” : “little_endian”

Все получилось. Можно добавить в “копилку”.

Устройство - Термоанемометр ТТМ-2-04 (02).
Шаблон:

{
"device_type": "Термоанемометр TTM-2-04",
"device": {
    "name": "TTM-2-04",
    "id": "ttm-2-04",
    "max_read_registers": 4,
    "channels": [
        {
            "name": "Speed",
            "type": "value",
            "reg_type": "input",
            "address": "0",
            "format": "float",
            "word_order" : "little_endian"
        },
        {
            "name": "Temperature",
            "type": "temperature",
            "reg_type": "input",
            "address": "2",
            "format": "float",
            "word_order" : "little_endian"
        }
     ]
}}

Разместите этот код в файле /usr/share/wb-mqtt-serial/templates/ttm-2-04.json
Перезапустить systemctl restart wb-mqtt-serial

После этого в списке шаблонов устройств появится этот термоанемометр.
Параметры по умолчанию (зашиты в прибор): скорость 4800, адрес - 1

В веб-интерфейсе WB устройство выглядит вот так:

Всем спасибо за помощь!

2 лайка

“Пользовательские” шаблоны все ж лучше размещать в /etc/wb-mqtt-serial.conf.d/templates/
Рад что получилось.