Для тестирования работы модуля Modbus TCP в Azure IoT Edge проще использовать простой датчик температуры и влажности поддерживающий протокол Modbus RTU.
Когда покупаешь железо на Aliexpress нередко натыкаешься на продавцов, которые ничего не смыслят в том, что продают. Соотвественно, описание убогое и надо понимать, что немало времени уйдет на разбирательство.
C сайта продавца имеем такую информацию:
- Возможный производитель — Aideepen. Сайт не нашел.
- Плата промаркирована как XY-MD01.
- В качестве сенсора температуры и влажности используется прецизионный чип SHT20.
- Рабочее напряжение: DC4-30 v (highest do not exceed 33 v).
- Потребляемая мощность: 0.2 W.
- Рабочие характеристики:
- Temperature 20 ℃ — 60 ℃,
- Humidity 0-100.
- Точность изменений:
- Temperature±0.3℃,
- Humidity ±3%RH.
- Интерфейс подключения — RS485. Baud rate: 9600 (the user can set), 8 bits, one stop, no check.
- Протокол для работы Modbus RTU.
Modbus protocol
Для подключения датчика по Modbus нужен Slave ID и адреса регистров с описанием.
Указанный на сайте: «Device address: 1-247 can be set, the default is 1». Соотвественно, Slave ID = 1, по умолчанию. Уже хорошо, не нужно перебирать.
Modbus Function Code:
- 0x03: Read «keep register»
- 0x04: Read «input register»
- 0x06: Write a single «keep register»
- 0x10: Write more keep registers
Этих данных недостаточно для подключения. Банально, не понятно как менять Slave ID, скорости, с какого смещения считывать показания температуры и влажности и если они двубайтные, каков порядок разбора последовательности. Продавец предоставляет абсолютно левую документацию, не относящуюся к устройству, но цена радует.
Поискав по Alaexpress аналогичные датчики, нахожу отдельно продаваемую плату, по неадекватно высокой цене, но с более подробным описанием, уже достаточным для подбора параметров.
Offset | Description |
Number of bytes |
|
Input register |
0x0001 |
temperature scale |
2 |
0x0002 |
Humidity value |
2 |
|
Hold register |
0x0101 |
device address (1~247) |
2 |
0x0102 |
Baud rate 0:9600 1:14400 2:19200 |
2 |
|
0x0103 |
Temperature correction(/10) -10.0~10.0 |
2 |
|
0x0104 |
Humidity correction value(/10) -10.0~10.0 |
2 |
Тестирование
Для работы потребуется переходник USB <-> RS 485 и блок питания. Я использовал БП на 6 Вольт. Соединяем клеммы питания и передачи данных.
В качестве ПО для опроса ModBus RTU устройства мне понравился бесплатный QModMaster. В настройках ПО Options -> Modbus RTU устаналиваем параметры соединения. Порт, на который установился конвертер, легко найти в Control Panel -> System -> Devices -> COM ports. Нажимаем Commands -> Connect.
Устанавливаем:
- Modbus Mode -> RTU.
- Slave address -> 1.
- Function code -> Read Input Registers (0x04).
- StartAddress -> 1 Hex.
- Number of registers -> 1 (один регистр — 2 байта)
- Data format -> Dec
Открываем View -> Bus Monitor.
Нажимаем Commands -> Read/Write.
Получаем значение 259 и в Bus Monitor:
Поскольку температура 259 — довольно высокая, есть гипотеза, что значение регистра нужно делить на 10. Т.е. это 25,9 оС, что примерно соответствует комнатной температуре. Чтобы проверить гипотезу нужно нагреть сенсор до некоторой эталонной температуры.
Под рукой ничего подходящего не оказалось, поэтому пометил датчик в подмышку, чтобы измерить свою температуру. Сначала температура доползла до 36,6 (366), а потом перевалила и дошла до 37,5 оС. Я напрягся и пошел измерять температуру ртутным градусником. Он показал 36,6 оС.
После остывания термодатчика он показал 26,2 при том, что спиртовые конатные собратья показывают температуру от 21 до 23 оС. В общем, либо такая низкая точность, либо нужно откалибровать датчик введя поправочные коэффициенты в соотвествующие hold register.
Если перейти в режим Commands -> Scan, то устройство будет опрашиваться с периодичностью установленной в параметре Scan Rate (ms).
Смена Slave ID (device address)
Чтобы прочитать SlaveID достаточно
SlaveID | Function code | Starting address Hi | Starting address Lo | Count Hi | Count Lo |
0x01 | 0x03 | 0x01 | 0x01 | 0x00 | 0x01 |
Чтобы изменить SlaveID нужно использовать 0х06 функцию. В примере смена SlaveID на адрес 0х02.
SlaveID | Function code | Starting address Hi | Starting address Lo | Count Hi | Count Lo |
0x01 | 0x06 | 0x01 | 0x01 | 0x00 | 0x02 |
В примере у меня SlaveID уже был изменен ранее на 0х02. В случае, если адрес ранее не менялся Unit ID = 0х01. Рекомендую сразу наклеить на устройство стикер с новым Unit ID. Если забыть адрес — единственный способ определить — простой перебор по всем адресам с вычитыванием значения регистра.
Upd. Продавец с Aliexpress прислал подробную документацию по термодатчику (pdf и doc варианты):
Temperature and humidity transmitter SHT20 sensor Modbus RS485
Temperature and humidity transmitter SHT20 sensor Modbus RS485