Блоки климатических датчиков RS485 / Modbus.
Техническое описание: Данная страница содержит подробное техническое описание различных блоков климатических датчиков RS485 / Modbus, и раскрывает работу с устройствами через их регистры.
Ознакомиться с пользовательским описанием каждого устройства можно на страницах:
Wiki - блок климатический (температура, влажность, освещенность), RS485 / Modbus.
Wiki - датчик эквивалента углекислого газа eCO2, RS485 / Modbus.
Назначение:
Блоки климатических датчиков RS485 / Modbus - это устройства включающее в себя все или некоторые климатические датчики: освещённости, температуры, влажности, эквивалента углекислого газа. Показания имеющихся в блоке датчиков можно получать по протоколу Modbus шины RS485.
Блоки можно использовать для контроля климата гидропонной установки. Устройства легко подключаются к блоку управления гидропонной установки, сетевым кабелем через разъемы RJ45.
Блоки климатических датчиков не обязательно использовать в гидропонных установках, это могут быть иные проекты где требуется контролировать климат используя для получения данных протокол Modbus широко применяемый в промышленности.
В соответствии с протоколом Modbus, к одной шине RS485 можно подключить до 247 блоков климатических датчиков. Адреса устройств назначаются программно и хранится в их энергонезависимой памяти. Все устройства на шине должны иметь уникальный адрес.
Описание:
Блоки климатических датчиков RS485 / Modbus построены на базе микроконтроллера STM32G030F4 и конвертера SN65HVD3082EDR с цепями защиты шины RS485 и встроенным терминатором, который можно отключать переключателем на плате. В устройстве присутствуют: импульсный DC-DC преобразователь, линейные преобразователи и один или несколько чипов датчиков: SHT20, LTR553, SGP30. На корпусе блоков есть фиксатор позволяющий устанавливать их на DIN-рейку.
Чип SGP30 измеряет не CO2 а эквивалент eCO2. Чип определяет содержание H2, паров этанола и иных газов в воздухе, обрабатывает полученные значение и вычисляет количество эквивалента eC02 и TVOC. Изменение CO2 влияет на изменение eCO2, но при снижении концентрации CO2 ниже 350 ppm и снижении концентрации H2 или увеличении концентрации паров этанола, алгоритм чипа определит резкое увеличение эквивалента eCO2. Лучшие результаты чип показывает при содержании CO2 выше 400 ppm.
Запись и чтение данных блоков, осуществляется через их регистры. Доступ к регистрам модулей осуществляется запросами протокола Modbus по шине RS485.
С помощью регистров модуля можно выполнять следующие действия:
- Менять адрес модулей на шине, с сохранением, или без.
- Менять тип протокола Modbus: RTU/ASCII, с сохранением, или без.
- Менять скорость передачи данных, с сохранением, или без.
- Сохранять одно двухбайтное слово в энергонезависимую память и читать его.
- Читать напряжение питания поступившее с разъема RJ45.
- Управлять светодиодом обнаружения устройства на разъеме RJ45.
- Читать показания имеющихся в блоке датчиков:
- Температура воздуха в °С.
- Относительная влажность воздуха в %.
- Абсолютная влажность воздуха в г/м3.
- Освещённость в люксах.
- Эквивалент eСО2, в частях на миллион (ppm).
- Количество летучих органических соединений, в частях на миллиард (ppm).
- Задавать и узнавать период обновления показаний датчиков.
Подключение:
Важно: Перед подключением устройства к шине RS485 нужно отключить питание.
Так называемое «горячее подключение» может повредить устройство!
Для подключения блоков климатических датчиков к шине RS485 используется разъем RJ45.
Назначение выводов разъема RJ45:
- 1: «A» - Линия данных (неинвертирующая).
- 2: «B» - Линия данных (инвертирующая).
- 3: «NC» - Не используется.
- 4: «PWR» - Вывод питания от +12 до +24В.
- 5: «PWR» - Вывод питания от +12 до +24В.
- 6: «NC» - Не используется.
- 7: «GND» - Общий вывод питания.
- 8: «GND» - Общий вывод питания.
- HL-1: «BLINK» - Индикатор включения (мигает если подано питание).
- HL-2: «DATA» - Индикатор получения запроса и обнаружения устройства.
Назначение индикаторов разъёма RJ45:
- HL-1 «BLINK» Индикатор включения:
- Индикатор коротко мигает раз в две секунды -
значит устройство работает, но не получило ни 1 запроса с подачи питания. - Индикатор медленно мигает раз в секунду -
значит устройство работает, но последний запрос принят более 10 сек. назад. - Индикатор часто мигает пять раз в секунду -
значит устройство работает и последний запрос принят менее 10 сек. назад. - HL-2 «DATA» Индикатор получения запроса и обнаружения устройства:
- Индикатор включается при получении запросов, что позволяет визуально отследить их поступление.
- Устройству можно отправить команду на постоянное свечение индикатора, что позволит визуально найти устройство с известным адресом среди одинаковых устройств на шине.
Характеристики:
- Напряжение питания: от 12 до 24 В постоянного тока (разъем RJ45).
- Ток потребляемый модулем: до 50 мА (зависит от типа и количества датчиков в блоке).
- Интерфейс: RS485 / Modbus.
- Скорость шины: 4800 / 9600 / 19200 / 38400 / 57600 / 115200 бит/с.
- Адрес на шине: устанавливается программно (по умолчанию 0x03).
- Диапазон измерений температуры: от -40 до +125 °С (с шагом 0,1).
- Диапазон измерений влажности воздуха: от 0 до 100 % (с шагом 0,1).
- Диапазон измерений влажности воздуха: от 0 до 655,35 г/м3 (с шагом 0,01).
- Диапазон измерений освещённости: от 0 до 65'535 лк (с шагом 1).
- Диапазон обнаружения эквивалента СО2: от 400 до 60'000 ppm (с шагом 1).
- Диапазон обнаружения летучих органических соединений: от 0 до 60'000 ppm (с шагом 1).
- Рабочая температура: от -25 до +60 °С.
- Габариты: 65 x 45 x 29 мм.
- Вес: ? г.
Регистры:
По протоколу ModBus, данные всех ведомых устройств хранятся в регистрах.
Существует 4 типа регистров:
Адрес: | Название: | Назначение: | |||
---|---|---|---|---|---|
0...0x270E | (DI) | Discrete Input | 1 бит | Цифровые входы | R |
0...0x270E | (DO) | Discrete Output Coils | 1 бит | Цифровые выходы (регистры флагов) | RW |
0...0x270E | (AI) | Analog Input Registers | 16 бит | Аналоговые входы | R |
0...0x270E | (AO) | Analog Output Holding Registers | 16 бит | Аналоговые выходы (регистры хранения) | RW |
Данные в регистрах не обязательно связаны со значениями на входах и выходах ведомых устройств. Каждый регистр DI/DO хранит 1 бит. Каждый регистр AI/AO хранит 16 бит (2 байта).
Например, регистры AI и AO могут хранить входные данные и результаты вычислений, а регистры DI и DO флаги настроек, и биты состояний.
Карта регистров модулей:
Discrete Inputs: | Coils: | Input Registers: | Holding Registers: | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||
|
|
|
|
Регистры с адресами 0x0100 и выше являются общими для всех устройств iarduino.
Модуль ответит ошибкой на попытку чтения/записи данных в регистры RESERVED.
Если у модуля нет датчика с которым работает регистр, то чтение/запись данных в это регистр не приведёт ни к каким действиям.
Регистры "Discrete Inputs" (DI):
Битовые регистры только для чтения.
- Блоки климатических датчиков не используют регистры "Discrete Inputs".
Регистры "Coils" (DO):
Битовые регистры для чтения и записи.
- 0x0000 «HL_DATA» - Регистр включения индикатора обнаружения устройства.
- Индикатор обнаружения устройства, это светодиод разъема RJ45.
- Установка регистра в «1» приведёт к постоянному свечению индикатора.
- Сброс регистра в «0» отключит индикатор, он будет информировать о получении запросов.
- Значение по умолчанию: 0.
- 0x0001 «SGP_ENABLE» - Регистр разрешения работы нагревателя в датчике SGP30.
- Нагревательный элемент интегрирован в чип SGP30.
- Если нагревательный элемент отключён, или с момента его включения прошло меньше 15 секунд, то датчик SGP30 будет возвращать значения: eCO2=400ppm, TVOC=0ppb.
- Установка регистра в «1» приведёт к включению нагревательного элемента.
- Сброс регистра в «0» отключит нагревательный элемент.
- Значение по умолчанию: 1.
- 0x0100 «CHANGE_ID» - Регистр является флагом смены адреса модуля на шине.
- Установка регистра в «1» осуществляется аппаратно, после успешной смены адреса.
- Сброс регистра осуществляется программно, записью «0».
- Значение по умолчанию: 0.
- 0x0101-0x01F7 «DO_BAN_ID» - Регистры запрещённых адресов.
- Если установить в «1» регистр, младший байт адреса которого совпадает с текущим адресом модуля на шине, то модуль не будет менять свой адрес в режиме смены адреса на случайное число.
- При смене адреса модуля на случайное число, новый случайный адрес модуля не будет равен младшему байту адреса тех регистров, в которых записана «1».
- Сброс регистра в «0» разрешает использовать младший байт адреса регистра для выбора случайного адреса модуля на шине.
- Значение по умолчанию: 0.
- Подробный пример доступен ниже, в разделе «режим выбора случайного адреса».
Регистры "Input Registers" (AI):
Двухбайтные регистры только для чтения.
- 0x0000 «VIN» - Регистр содержит напряжение питания (от 0 мВ до 65'535 мВ) получаемое устройством с разъема RJ45.
- 0x0001 «TEM» - Регистр содержит температуру воздуха в десятых долях °С со знаком. Температура (от -40,0°С до +125,0°С) равна значению регистра / 10.
- 0x0002 «HUM» - Регистр содержит относительную влажность воздуха в десятых долях %. Относительная влажность воздуха (от 0,0% до 100%) равна значению регистра / 10.
- 0x0003 «HUMA» - Регистр содержит абсолютную влажность воздуха в сотых долях г/м3. Абсолютная влажность воздуха (от 0,00г/м3 до 655,35г/м3) равна значению регистра / 100.
- 0x0004 «ECO2» - Регистр содержит количественное содержание в воздухе эквивалента eСО2 (от 400ppm до 60'000ppm).
- 0x0005 «TVOC» - Регистр содержит общее количество содержащихся в воздухе летучих органических соединений (от 0ppm до 60'000ppb).
- 0x0006 «LUX» - Регистр содержит освещённость (от 0лк до 65'535лк).
Если у модуля нет чипа работающего с регистром, то чтение этого регистра вернёт 0.
Регистры "Holding Registers" (AO):
Двухбайтные регистры для чтения и записи.
- 0x0000 «SHT_PERIOD» - Регистр установки периода обновления данных с датчика температуры и влажности SHT20, в десятых долях секунд.
- Значение регистра от 1 до 65535 соответствует времени от 0,1 до 6'553,5 секунд.
- Время в регистре определяет как часто микроконтроллер блока будет опрашивать датчик сохраняя его показания в регистры "Input Registers": [0x0001] «TEM», [0x0002] «HUM» и [0x0003] «HUMA».
- Записанное в регистр значение доступно для чтения.
- Значение по умолчанию: 5 (0,5 сек).
- Если у модуля нет чипа SHT20, то запись любого значения ни к чему не приведёт.
- 0x0001 «SGP_PERIOD» - Регистр установки периода обновления данных с датчика эквивалента углекислого газа SGP30, в десятых долях секунд.
- Значение регистра от 1 до 65535 соответствует времени от 0,1 до 6'553,5 секунд.
- Время в регистре определяет как часто микроконтроллер блока будет опрашивать датчик сохраняя его показания в регистры "Input Registers": [0x0004] «ECO2» и [0x0005] «TVOC».
- Записанное в регистр значение доступно для чтения.
- Значение по умолчанию: 10 (1,0 сек).
- Если у модуля нет чипа SGP30, то запись любого значения ни к чему не приведёт.
- 0x0002 «LTR_PERIOD» - Регистр установки периода обновления данных с датчика освещенности и приближения LTR-553ALS-01, в десятых долях секунд.
- Значение регистра от 1 до 65535 соответствует времени от 0,1 до 6'553,5 секунд.
- Время в регистре определяет как часто микроконтроллер блока будет опрашивать датчик сохраняя его показания в регистр "Input Registers" [0x0006] «LUX».
- Записанное в регистр значение доступно для чтения.
- Значение по умолчанию: 10 (1,0 сек).
- Если у модуля нет чипа LTR-553ALS-01, то запись любого значения ни к чему не приведёт.
- 0x0100 «ACK_ID» - Регистр подтверждения смены адреса модуля на шине.
- Запись значения 0xF0A5 подтверждает новый адрес модуля.
- Подтверждение адреса модуля осуществляется по подтверждаемому адресу модуля.
- При чтении регистра возвращается 0x0000.
- Сначала записывают адрес в регистр "Holding Registers" [0x0110] «SET_ID» и не позднее 2 секунд подтверждают. Если адрес не подтвердить, модуль вернёт прежний адрес. Если адрес модуля не менялся, то запись любого значения в регистр подтверждения будет проигнорирована.
- Подробный пример доступен ниже, в разделе «установка адреса на шине».
- Запись значения 0xF0A5 подтверждает новый адрес модуля.
- 0x0101 «ACK_SPEED» - Регистр подтверждения смены скорости передачи данных по шине.
- Запись значения 0xF0A5 подтверждает новую скорость передачи данных по шине.
- Подтверждение скорости осуществляется на подтверждаемой скорости.
- При чтении регистра возвращается 0x0000.
- Сначала записывают скорость в регистр "Holding Registers" [0x0111] «SET_SPEED» и не позднее 2 секунд подтверждают. Если скорость не подтвердить, модуль вернёт прежнюю скорость. Если скорость не менялась, то запись любого значения в регистр подтверждения будет проигнорирована.
- Подробный пример доступен ниже, в разделе «установка скорости шины».
- 0x0102 «ACK_TYPE» - Регистр подтверждения смены типа протокола Modbus.
- Запись значения 0xF0A5 подтверждает новый тип протокола Modbus.
- Подтверждение типа протокола осуществляется по подтверждаемому типу протокола.
- При чтении регистра возвращается 0x0000.
- Сначала записывают тип протокола в регистр "Holding Registers" [0x0112] «SET_TYPE» и не позднее 2 секунд подтверждают. Если тип протокола не подтвердить, модуль вернёт прежний тип протокола. Если тип протокола не менялся, то запись любого значения в регистр подтверждения будет проигнорирована.
- Подробный пример доступен ниже, в разделе «установка типа протокола Modbus».
- 0x0110 «SET_ID» - Регистр установки адреса модуля на шине.
- Запись 0x00XX приведёт к смене адреса модуля на значение XX до отключения питания.
- Запись 0xFFXX приведёт к смене адреса модуля на значение XX с сохранением.
- Запись 0x0000 приведёт к смене адреса модуля на случайное число до откл. питания.
- XX - это значение нового адреса от 1 до 247.
- После записи, модуль устанавливает новый адрес на 2 секунды, в течении которых адрес нужно подтвердить регистром "Holding Registers" [0x0100] «ACK_ID». Если адрес не подтвердить, модуль вернёт прежний адрес. Если адрес записывается с сохранением в энергонезависимую память, то после подтверждения модуль будет занят около 50 миллисекунд.
- При чтении регистра возвращается двухбайтное значение, где старший байт равен случайному число, а младший равен текущему адресу модуля на шине. Наличие случайного числа в ответе, позволяет выявить модули с одинаковыми адресами, так как контрольная сумма их одновременного ответа не совпадёт.
- Подробный пример доступен ниже, в разделе «установка адреса на шине»
- 0x0111 «SET_SPEED» - Регистр установки скорости передачи данных по шине.
- Запись 0x00XX приведёт к смене скорости на значение XX до отключения питания.
- Запись 0xFFXX приведёт к смене скорости на значение XX с сохранением.
- XX - это число: 2, 4, 8, 16, 24, или 48. Новая скорость равна XX * 2400 бит/сек.
- После записи, модуль устанавливает новую скорость на 2 секунды, в течении которых скорость нужно подтвердить регистром "Holding Registers" [0x0101] «ACK_SPEED». Если скорость не подтвердить, модуль вернёт прежнюю скорость. Если скорость записывается с сохранением в энергонезависимую память, то после подтверждения модуль будет занят около 50 миллисекунд.
- При чтении регистра возвращается двухбайтное значение, где старший байт равен случайному число, а младший равен текущей скорости шины / 2400.
- Подробный пример доступен ниже, в разделе «установка скорости шины».
- 0x0112 «SET_TYPE» - Регистр установки типа протокола Modbus.
- Запись 0x00XX приведёт к смене типа протокола Modbus до отключения питания.
- Запись 0xFFXX приведёт к смене типа протокола с сохранением.
- XX - это число 00 (Modbus RTU), или FF (Modbus ASCII).
- После записи, модуль устанавливает новый тип протокола на 2 секунды, в течении которых тип протокола нужно подтвердить регистром "Holding Registers" [0x0102] «ACK_TYPE». Если тип протокола не подтвердить, модуль вернёт прежний тип протокола. Если тип протокола записывается с сохранением в энергонезависимую память, то после подтверждения модуль будет занят около 50 миллисекунд.
- При чтении регистра возвращается двухбайтное значение, где старший байт равен случайному число, а младший определяет текущий тип протокола: 00-RTU, FF-ASCII.
- Подробный пример доступен ниже, в разделе «установка типа протокола Modbus».
- 0x0120 «USER_DATA» - Регистр пользовательского значения.
- Запись любого числа приведёт к его сохранению в энергонезависимую память.
- При чтении регистра возвращается ранее записанное число.
- Значение по умолчанию: 0.
- После записи любого числа, модуль будет занят около 50 миллисекунд.
Регистр диагностики "Diagnostic Register":
Двухбайтный регистр только для чтения.
Каждый бит регистра диагностики является флагом ошибки. В соответствии с протоколом Modbus данные регистра диагностики можно получить отправив запрос с командой 0x08 «Diagnostic» и кодом функции 0x0002 «Return Diagnostic Register». В библиотеке iarduino_Modbus эту команду выполняет функция объект.diagnostic(ID,2);
- Биты 15...6 - Не используются (всегда сброшены в «0»).
- Бит 5 - Информирует о ошибках при чтении данных с датчика LTR-553ALS.
- Бит 4 - Информирует о ошибке инициализации датчика освещенности LTR-553ALS.
- Бит 3 - Информирует о ошибках при чтении данных с датчика SGP30.
- Бит 2 - Информирует о ошибке инициализации датчика эквивалента углекислого газа SGP30.
- Бит 1 - Информирует о ошибках при чтении данных с датчика SHT20.
- Бит 0 - Информирует о ошибке инициализации датчика влажности и температуры SHT20.
Доступ к данным регистров:
Так как модуль использует протокол передачи данных Modbus, то и доступ к данным описан им. Ознакомиться с протоколом можно на странице Wiki - Работа с протоколом Modbus RTU/ASCI по шине RS485.
Получение информации об устройстве:
В соответствии с протоколом Modbus для получения информации об устройстве используется запрос с командой 0x11 «Report Slave ID». В библиотеке iarduino_Modbus эту команду выполняет функция объект.getInfo(ID); Ответ на запрос содержит следующие данные:
- 1 байт. Идентификатор линейки устройств. Для всех устройств iarduino = 0x77.
- 1 байт. Индикатор пуска. Может принимать одно из двух значений: 0xFF-вкл, 0x00-выкл.
- 1 байт. ID-адрес модуля на шине.
- 1 байт. Идентификатор устройства (тип устройства).
- 1 байт. Версия прошивки устройства. Значение от 1 до 255.
- 2 байта. Регистр диагностики. Каждый бит регистра является флагом ошибки.
- 1 байт. Количество регистров DO «Coils» с адресами до 0x00FF.
- 1 байт. Количество регистров DI «Discrete Input» с адресами до 0x00FF.
- 1 байт. Количество регистров AO «Holding Registers» с адресами до 0x00FF.
- 1 байт. Количество регистров AI «Input Registers» с адресами до 0x00FF.
- 4 байта. Время задержки в мкс выдерживаемое модулем между запросом и ответом.
Установка адреса на шине:
Все модули iarduino предназначенные для работы по протоколу Modbus позволяют назначать себе адрес на шине, как временно (новый адрес действует пока есть питание), так и постоянно (новый адрес сохраняется в энергонезависимую память и действует даже после отключения питания).
- Блок климатический (температура, влажность, освещенность), имеет адрес по умолчанию: 3.
- Блок климатический (углекислый газ), имеет адрес по умолчанию: 6.
Допускается указывать адреса от 1 до 247 включительно.
Запросы отправленные с адресом 0 являются широковещательными, они адресованы сразу всем модулям на шине. Все устройства выполняют данный запрос, но не отвечают на него.
Установка адреса (без сохранения):
Если в регистр "Holding Register" [0x0110] «SET_ID» записать двухбайтное значение, где старший байт равен 0, а младший байт равен числу от 1 до 247, то модуль изменит свой адрес на значение младшего байта. Новый адрес будет действовать в течении 2 секунд, за это время нужно подтвердить смену адреса. Если смену адреса не подтвердить, модуль вернёт прежний адрес.
Для подтверждения нового адреса нужно записать значение 0xF0A5 в регистр "Holding Register" [0x0100] «ACK_ID». Запрос на запись отправляется модулю с новым адресом на шине или широковещательно.
Подтверждённый адрес будет действовать до отключения питания.
Установка адреса (с сохранением):
Если в регистр "Holding Register" [0x0110] «SET_ID» записать двухбайтное значение, где старший байт равен 255, а младший байт равен числу от 1 до 247, то модуль изменит свой адрес на значение младшего байта. Новый адрес будет действовать в течении 2 секунд, за это время нужно подтвердить смену адреса. Если смену адреса не подтвердить, модуль вернёт прежний адрес.
Для подтверждения нового адреса нужно записать значение 0xF0A5 в регистр "Holding Register" [0x0100] «ACK_ID». Запрос на запись отправляется модулю с новым адресом на шине или широковещательно.
Подтверждённый адрес сохранится в Flash память и будет действовать даже после отключения питания. Сохранение адреса в Flash память занимает не менее 50 мс.
Режим выбора случайного адреса (без сохранения):
Если в регистр "Holding Register" [0x0110] «SET_ID» записать 0, то модуль изменит свой адрес на случайное число. Новый адрес будет действовать в течении 2 секунд, за это время нужно подтвердить смену адреса. Если смену адреса не подтвердить, модуль вернёт прежний адрес.
Для подтверждения нового адреса нужно записать значение 0xF0A5 в регистр "Holding Register" [0x0100] «ACK_ID». Запрос на запись отправляется модулю с новым адресом на шине или широковещательно.
Подтверждённый адрес будет действовать до отключения питания.
- Регистры "Coil" [0x0101-0x01F7] «BAN_ID» запрещают выбирать и менять адрес модуля.
- Если записать 1 в регистр "Coil" [0x01AB], то модуль не выберет адрес (AB)16 в режиме выбора случайного адреса и не будет менять адрес, если текущий адрес модуля равен (AB)16.
- Если записать 1 в регистр "Coil" [0x01CD], то модуль не выберет адрес (CD)16 в режиме выбора случайного адреса и не будет менять адрес, если текущий адрес модуля равен (CD)16.
Режим выбора случайного адреса позволяет изменить адреса устройств, чьи текущие адреса не уникальны (принадлежат двум и более устройствам), не отключая их от шины.
- Предположим, на шине есть 4 устройства с адресами: 2, 3, 3, 4. То есть, адрес 3 принадлежит сразу двум устройствам.
- Широковещательно записываем 1 в регистры "Coil" [0x0102] и [0x0104] «BAN_ID».
- Широковещательно записываем 0 в регистр "Holding Register" [0x0110] «SET_ID».
- Модуль с адресом 2 не изменит свой адрес, так как регистр "Coil" [0x0102] «BAN_ID» ==1.
- Модуль с адресом 4 не изменит свой адрес, так как регистр "Coil" [0x0104] «BAN_ID» ==1.
- Модули с адресами 3 изменят свой адрес на случайное число от 1 до 247, кроме 2 и 4, так как в регистрах "Coil" [0x0102] «BAN_ID» и "Coil" [0x0104] «BAN_ID» записана 1.
- Подтверждаем смену адреса отправив широковещательный запрос на запись значения 0xF0A5 в регистр "Holding Register" [0x0100] «ACK_ID».
- В результате на шине останутся два устройства с прежними адресами 2, 4 и два устройства с новыми адресами, которые они выбрали сами в случайном порядке. Теперь можно найти два новых адреса на шине и изменить их, например, на 1 и 3 с сохранением или без.
Установка скорости шины:
Все модули iarduino предназначенные для работы по протоколу Modbus на шине RS485 позволяют менять скорость работы на шине, как временно (новая скорость действует пока есть питание), так и постоянно (новая скорость сохраняется в энергонезависимую память и действует даже после отключения питания).
По умолчанию все модули работают на скорости 9600 бит/сек.
Установка скорости (без сохранения):
Если в регистр "Holding Register" [0x0111] «SET_SPEED» записать двухбайтное значение, где старший байт равен 0, а младший байт равен числу 2, 4, 8, 16, 24, или 48, то модуль изменит свою скорость работы на шине. Новая скорость = 2400 умноженное на значение младшего байта, будет действовать в течении 2 секунд, за это время нужно подтвердить смену скорости. Если смену скорости не подтвердить, модуль вернёт прежнюю скорость.
Для подтверждения новой скорости нужно записать значение 0xF0A5 в регистр "Holding Register" [0x0101] «ACK_SPEED». Запрос на запись отправляется модулю с новой скоростью.
Подтверждённая скорость будет действовать до отключения питания.
Установка скорости (с сохранением):
Если в регистр "Holding Register" [0x0111] «SET_SPEED» записать двухбайтное значение, где старший байт равен 255, а младший байт равен числу 2, 4, 8, 16, 24, или 48, то модуль изменит свою скорость работы на шине. Новая скорость = 2400 умноженное на значение младшего байта, будет действовать в течении 2 секунд, за это время нужно подтвердить смену скорости. Если смену скорости не подтвердить, модуль вернёт прежнюю скорость.
Для подтверждения новой скорости нужно записать значение 0xF0A5 в регистр "Holding Register" [0x0101] «ACK_SPEED». Запрос на запись отправляется модулю с новой скоростью.
Подтверждённая скорость сохранится в Flash память и будет действовать даже после отключения питания. Сохранение скорости в Flash память занимает не менее 50 мс.
Установка типа протокола Modbus:
Все модули iarduino предназначенные для работы по протоколу Modbus позволяют менять тип протокола (RTU или ASCII), как временно (новый тип протокола действует пока есть питание), так и постоянно (новый тип протокола сохраняется в энергонезависимую память и действует даже после отключения питания).
По умолчанию все модули работают по протоколу Modbus RTU.
Установка типа протокола (без сохранения):
Если в регистр "Holding Register" [0x0112] «SET_TYPE» записать двухбайтное значение, где старший байт равен 0, а младший байт равен числу 0 (RTU) или 255 (ASCII), то модуль изменит тип протокола. Новый тип протокола, будет действовать в течении 2 секунд, за это время нужно подтвердить смену типа протокола. Если смену не подтвердить, модуль вернёт прежний тип протокола.
Для подтверждения нового типа протокола нужно записать значение 0xF0A5 в регистр "Holding Register" [0x0102] «ACK_TYPE». Запрос на запись отправляется модулю по новому типу протокола.
Подтверждённый тип протокола будет действовать до отключения питания.
Установка типа протокола (с сохранением):
Если в регистр "Holding Register" [0x0112] «SET_TYPE» записать двухбайтное значение, где старший байт равен 255, а младший байт равен числу 0 (RTU) или 255 (ASCII), то модуль изменит тип протокола. Новый тип протокола, будет действовать в течении 2 секунд, за это время нужно подтвердить смену типа протокола. Если смену не подтвердить, модуль вернёт прежний тип протокола.
Для подтверждения нового типа протокола нужно записать значение 0xF0A5 в регистр "Holding Register" [0x0102] «ACK_TYPE». Запрос на запись отправляется модулю по новому типу протокола.
Подтверждённый тип протокола сохранится в Flash память и будет действовать даже после отключения питания. Сохранение типа в Flash память занимает не менее 50 мс.
Пример чтения напряжения питания:
Следующий скетч выводит напряжение питания поданное на разъем RJ45.
- Шина UART0 микроконтроллера (Serial) используется для вывода данных в монитор.
- Шина UART1 микроконтроллера (Serial1) подключена к конвертеру UART-RS485.
- Вывод 22 микроконтроллера подключен к выводу DE конвертера UART-RS485.
- Адрес устройства на шине Modbus равен 3.
#include <iarduino_Modbus.h> // Подключаем библиотеку для работы по протоколу Modbus. ModbusClient modbus(Serial1, 22); // Создаём объект для работы по протоколу Modbus указывая объект шины UART-RS485 для протокола и вывод DE конвертера UART-RS485. // void setup(){ // Serial .begin(9600); while(!Serial ); // Инициируем передачу данных в монитор последовательного порта, указав его скорость. Serial1.begin(9600); while(!Serial1); // Инициируем работу с шиной UATR-RS485 указав её скорость. modbus.begin(); // Инициируем работу по протоколу Modbus. // modbus.setTimeout(10); // Указываем максимальное время ожидания ответа по протоколу Modbus. // modbus.setDelay(4); // Указываем минимальный интервал между отправляемыми сообщениями по протоколу Modbus. // modbus.setTypeMB( MODBUS_RTU ); // Указываем тип протокола Modbus: MODBUS_RTU (по умолчанию), или MODBUS_ASCII. } // // void loop(){ // delay(1000); // // Читаем регистр "Input Register" [0x0000] «VIN»: // int32_t i = modbus.inputRegisterRead(3, 0); // Функция принимает адрес модуля и адрес регистра, возвращает прочитанное значение (0...65535), или -1 при неудаче. // Проверяем успешность чтения регистра: // if( i<0 ){ Serial.println("Error"); } // Если прочитанное значение i<0, значит чтение выполнено с ошибкой. // Выводим напряжение в вольтах в монитор: // else { Serial.println( (float)i/1000.0f ); } // Выводим прочитанное значение, преобразовав милливольты в вольты. } //
В данном примере чтение данных осуществлялось при помощи библиотеки iarduino_Modbus предназначенной для работы по протоколу Modbus на шине RS485.
На странице Wiki - Блок климатический (HTL) RS485 / Modbus рассказано как работать с блоком HTL используя дополнительную библиотеку iarduino_MB_HTL.
На странице Wiki - Датчик эквивалента углекислого газа eCO2, RS485 / Modbus рассказано как работать с датчиком эквивалента углекислого газа используя дополнительную библиотеку iarduino_MB_eCO2.
Габариты:
Ссылки:
- Блок климатический HTL (температура, влажность, освещенность) RS485 / Modbus.
- Датчик эквивалента углекислого газа eCO2 RS485 / Modbus.
- Wiki - руководство по использованию климатического блока HTL, RS485 / Modbus.
- Wiki - руководство по использованию Датчик эквивалента углекислого газа eCO2, RS485 / Modbus.
- Библиотека iarduino_Modbus.
- Библиотека iarduino_MB_HTL.
- Библиотека iarduino_MB_eCO2.
- Wiki - Установка библиотек в Arduino IDE.
Обсуждение