Подключение ModBus устройства не задокументированного

Добрый день!
подскажите алгоритм работы с датчиком ModBus
китайский сенсор с алиэкспрес измеряющий температуру и влажность
sensor
формат команды опроса такой:
для устройства с адресом 0x01
вопрос 0x01 0x03 0x00 0x00 0x00 0x02 0xC4 0x0B
ответ для случая Получение положительной температуры 0x01 0x03 0x04 0x00 0xFA 0x03 0xC8 0xDB 0x64
ответ для случая Получение отрицательной температуры 0x01 0x03 0x04 0xFF 0x69 0x03 0xB8 0x1A 0xB9
расшифровка по байтам:
0x01 Номер станции оборудования
0x03 команда
0x04 Размер данных
полученные данные измерений
0x00 0xFA 0x03 0xC8 -Положительные данные
температура = 0x00FA = 250 = 25.0
влажность = 0x03C8 = 968 = 96.8 %

0xFF 0x69 0x03 0xB8 Отрицательные эффективные данные
0xFF69 = (0x10000- 0xFF69) = 151 = -1.51
0x03B8 = 968 = 95.2 %

как это чудо привязать в WB5 спасибо

Это обычный человеческий modbus. Идёте в Configs => wb-mqtt-serial.conf, выбираете нужный порт, включаете его.

Дальше добавляете девайс. device_type пустой. В options нужно выбрать mqtt id, mqtt name и channels.
Заполнить mqtt id и mqtt name.
В channels добавить два канала: температуру с адресом 0 и типом input (т.к. команда 0x03). Про влажность в вашем описании не написано, но наверное там адрес 1.

scale у вас 0.1 будет.

1 лайк

Евгений, спасибо за азбучные истины.
все заработало

1 лайк

А подскажите, как Вы определили, что температура имеет 0 адрес, а влажность 1? у меня тоже есть подобный датчик, но при таком раскладе выходит, что наоборот бы надо указать.

YDTH-01 (Ванная комната)

Temperature 46 °C
Humidity 26.8 % RH

Часть описания датчика температуры и влажности и температуры точки росы YDTH-01:
Хост может считывать значения измерений датчика и параметры настроек устройства (код функции: 0x03 / 0x04 / 0x06 / 0x10):
1. Для считывания температуры и влажности применяется код: 0x03 / 0x04.
2. Для изменения параметров датчика (адрес устройства или/и скорость передачи) используется код функции: 0x06 / 0x10.

Считать значения измерения температуры и влажности:
Хост отправляет: 01 03 02 00 00 03 04 73
Ответ slave: 01 03 06 01 0B 01 31 00 50 D5 6A

Температура = 0x010B = 267/10 = 26,7 °C;
Влажность = 0x0131 = 305/10 = 30,5%.
Температура точки росы = 0x0050 = 80/10 = 8 °C

А вот мой serial.conf:
{
“slave_id”: “1”,
“name”: “YDTH-01”,
“id”: “ydth-01”,
“enabled”: true,
“channels”: [
{
“name”: “Temperature”,
“type”: “temperature”,
“reg_type”: “input”,
“address”: “0”,
“format”: “s16”,
“scale”: 0.1,
“offset”: 0
},
{
“name”: “Humidity”,
“type”: “rel_humidity”,
“reg_type”: “input”,
“address”: “1”,
“format”: “s16”,
“scale”: 0.1,
“offset”: 0
}
]
}

И у меня не получилось настроить его через другой порт, а к действующему - удалось. Может потому, как он сидит на одном шлейфе с остальными устройствами на этом порту?

Starck, возможно, коммуникационные параметры устройства не совпадают с теми, что на другом порту выставлены?

“port_type”: “serial”,
“baud_rate”: 9600,
“parity”: “N”,
“data_bits”: 8,
“stop_bits”: 1,
“poll_interval”: 10,
“enabled”: true

Сейчас у меня так, как выше. Отличие лишь в том, что основной порт имеет строку “port_type”: “serial”, а другие - нет. Может быть в этом проблема или нет?

Почему меня это беспокоит? да лишь потому, что если я увеличу скоость до 115200, то не пришлось бы мне отсаживать от главного порта датчики температуры и садить на другой, чтобы скорость оставить на уровне 9600. Или я не верно рассуждаю? подскажите, пожалуйста, как правильно поступить в этом вопросе.

Скорее, отличие в количестве стоп-битов, по умолчанию их 2. Думаю, если поменяете на 1 на втором порту, то датчики заработают и на нем.
Да, возможность опрашивать устройства с разными коммуникационными параметрами на одном порту отсутствует. Можно третий порт еще потом докупить, в виде внутреннего модуля.

1 лайк

Kilpio, спасибо за советы.

А что касается первого вопроса с channels? как определить какой адрес кому отводится? мне впереди еще рекуператор подключать и тоже возникнет с этим вопрос. Пока пытаюсь разобраться на простом примере устройства.

Обычно список Modbus-регистров публикуется производителем. На Али с этим часто возникают проблемы. Иногда продавцы находят и высылают документацию по Modbus-регистрам.
Для датчика ydth-01 есть документация в сети (на китайском, гугл-транслейт должен помочь)
http://www.vcc-gnd.com/ydth-01/
Что касается рекуператора, то либо такая документация уже есть, либо ее можно запросить у продавца, либо найти аналогичную модель с документацией… Короче, никакого стандарта на то, за что в конкретном устройстве отвечает конкретный регистр, нет.

Да, я посмотрел и попытался перевести. Все что я дополнительно узнал, так это
код 0x0200 для серийного номера 1. Про каналы я в описании modbus тоже не встречал. Поэтому и не понимаю до конца как назначается канал.

А вообще, как убедиться, что созданное мною устройство отправляет именно такую команду:
01 03 0200 0003 04 73, а возвращает такую: 01 03 06 010B 0131 0050 D5 6A

Другими словами, как убедиться, что все работает как производитель прописал?

Включите отладку на порту, к которому подсоединено устройство и посмотрите, какие запросы/ответы проходят по шине. Небольшой кусок теории Modbus в помощь вам:
https://wirenboard.com/wiki/index.php/Протокол_Modbus

поставьте программу modbus poll и в настройках поставьте считывание 100 регистров с нулевого. и вы увидите все регистры которые есть на устройстве. осталось определиться с их форматом. Формат устанавливается в настройках modbus poll.

1 лайк