КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Блоки климатические (CO2, eCO2, температура, влажность, освещенность), RS485 / Modbus - Datasheet

Блоки климатических датчиков RS485 / Modbus.

Техническое описание: Данная страница содержит подробное техническое описание различных блоков климатических датчиков RS485 / Modbus, и раскрывает работу с устройствами через их регистры.

Ознакомиться с пользовательским описанием каждого устройства можно на страницах:

Wiki - блок климатический (температура, влажность, освещенность), RS485 / Modbus.

Wiki - датчик углекислого газа CO2, 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, SCD40. На корпусе блоков есть фиксатор позволяющий устанавливать их на DIN-рейку.

Чип SHT20 измеряет влажность и температуру, чип LTR553 измеряет освещённость, чип SCD40 измеряет концентрацию CO2 в отличии от чипа SGP30 который измеряет эквивалент eCO2.

Запись и чтение данных блоков, осуществляется через их регистры. Доступ к регистрам модулей осуществляется запросами протокола Modbus по шине RS485.

С помощью регистров модуля можно выполнять следующие действия:

  • Менять адрес модулей на шине, с сохранением, или без.
  • Менять тип протокола Modbus: RTU/ASCII, с сохранением, или без.
  • Менять скорость передачи данных, с сохранением, или без.
  • Сохранять одно двухбайтное слово в энергонезависимую память и читать его.
  • Читать напряжение питания поступившее с разъема RJ45.
  • Управлять светодиодом обнаружения устройства на разъеме RJ45.
  • Читать показания имеющихся в блоке датчиков:
    • Температура воздуха в °С.
    • Относительная влажность воздуха в %.
    • Абсолютная влажность воздуха в г/м3.
    • Освещённость в люксах.
    • Концентрация СО2, в частях на миллион (ppm).
    • Эквивалент 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 бит/с.
  • Настройки шины: 8N1 (8 бит данных, без проверки чётности, 1 стоп-бит).
  • Адрес на шине: устанавливается программно (по умолчанию 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 Input1 битЦифровые входыR
0...0x270E(DO)Discrete Output Coils1 битЦифровые выходы
(регистры флагов)
RW
0...0x270E(AI)Analog Input Registers16 битАналоговые входыR
0...0x270E(AO)Analog Output Holding Registers16 битАналоговые выходы
(регистры хранения)
RW

Данные в регистрах не обязательно связаны со значениями на входах и выходах ведомых устройств. Каждый регистр DI/DO хранит 1 бит. Каждый регистр AI/AO хранит 16 бит (2 байта).

Например, регистры AI и AO могут хранить входные данные и результаты вычислений, а регистры DI и DO флаги настроек, и биты состояний.

Карта регистров модулей:

Discrete Inputs: Coils: Input Registers: Holding Registers:
адресрегистры DI:
0x0000
...
0x00FF
RESERVED
адресрегистры DO:
0x0000HL_DATA
0x0001SGP_ENABLE
0x0002SCD_CALIB
0x0003
...
0x00FF
RESERVED
адресрегистры AI:
0x0000VIN
0x0001TEM
0x0002HUM
0x0003HUMA
0x0004CO2
0x0005TVOC
0x0006LUX
0x0007
...
0x00FF
RESERVED
адресрегистры AO:
0x0000SHT_PERIOD
0x0001CO2_PERIOD
0x0002LTR_PERIOD
0x0003SCD_CALC
0x0004SCD_ALTIT
0x0005SCD_PRES
0x0006SCD_CALIB
0x0007SCD_OFFSET
0x0008SCD_TEST
0x0009
...
0x00FF
RESERVED
адресрегистры DI:
0x0100
...
0x270E
RESERVED
адресрегистры DO:
0x0100CHANGE_ID
0x0101
...
0x01F7
BAN_ID_1

BAN_ID_247
0x01F8
...
0x270E
RESERVED
адресрегистры AI:
0x0100
...
0x270E
RESERVED
адресрегистры AO:
0x0100ACK_ID
0x0101ACK_SPEED
0x0102ACK_TYPE
0x0103
...
0x010F
RESERVED
0x0110SET_ID
0x0111SET_SPEED
0x0112SET_TYPE
0x0113
...
0x011F
RESERVED
0x0120USER_DATA
0x0121
...
0x270E
RESERVED

Регистры с адресами 0x0100 и выше являются общими для всех устройств iarduino.

Модуль ответит ошибкой на попытку чтения/записи данных в регистры RESERVED.

Если у модуля нет датчика с которым работает регистр, то чтение/запись данных в это регистр вызовет ошибку адреса регистра «ILLEGAL ADDRESS» или не приведёт ни к каким действиям.

Регистры "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.
    • 0x0002 «SCD_CALIB» - Регистр включения автокалибровки датчика SCD40.
      • Установка регистра в «1» приведёт к включению автоматический самокалибровки.
      • Сброс регистра в «0» приведёт к отключению автоматический самокалибровки.
      • Алгоритмы автоматической самокалибровки ASC (Automatic Self Calibration) не требуют дополнительных действий со стороны пользователя, её достаточно просто включить.
      • О работе автокалибровки сигнализирует светодиод AUTO на плате блока.
      • Вместо данного регистра можно воспользоваться кнопкой CALIBRATE на плате блока, кратковременное нажатие на которую так же включает и отключает автокалибровку.
      • Согласно datasheet датчика SCD40, для корректной работы автокалибровки, концентрация CО2 должна снижаться до 400 ppm не реже 1 раза в неделю.
        Тестирование датчиков с включённой автокалибровкой в течении нескольких месяцев, показало, что несоблюдение этого условия не повлияло на корректность показаний концентрации CО2.
      • Если выполняются периодические измерения, то запись данных в регистр приведёт к сбросу всех показаний датчика SCD40 на время опроса (по умолчанию 5 секунд).
      • Значение по умолчанию: 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.
      • Регистр доступен для устройств с датчиками SHT20 или SCD40.
    • 0x0002 «HUM» - Регистр содержит относительную влажность воздуха в десятых долях %. Относительная влажность воздуха (от 0,0% до 100%) равна значению регистра / 10.
      • Регистр доступен для устройств с датчиками SHT20 или SCD40.
    • 0x0003 «HUMA» - Регистр содержит абсолютную влажность воздуха в сотых долях г/м3. Абсолютная влажность воздуха (от 0,00г/м3 до 655,35г/м3) равна значению регистра / 100.
      • Регистр доступен для устройств с датчиками SHT20 или SCD40.
    • 0x0004 «CO2» - Регистр содержит количественное содержание в воздухе:
      • Эквивалент eСО2 (от 400ppm до 60'000ppm), если используется датчик SGP30.
      • Углекислый газ СО2 (от 0ppm до 65'535ppm), если используется датчик SCD40.
    • 0x0005 «TVOC» - Регистр содержит общее количество содержащихся в воздухе летучих органических соединений (от 0ppm до 60'000ppb).
      • Регистр доступен для устройств с датчиком SGP30.
    • 0x0006 «LUX» - Регистр содержит освещённость (от 0лк до 65'535лк).
      • Регистр доступен для устройств с датчиком LTR553.

    Если у модуля нет датчика работающего с регистром, то чтение этого регистра вернёт 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 «CO2_PERIOD» - Регистр установки периода обновления данных с датчика углекислого газа SCD40 или эквивалента углекислого газа SGP30, в десятых долях секунд.
      • Значение регистра от 1 до 65535 соответствует времени от 0,1 до 6'553,5 секунд.
      • Время в регистре определяет как часто микроконтроллер блока будет опрашивать датчик сохраняя его показания в регистры "Input Registers": [0x0004] «CO2» и [0x0005] «TVOC».
      • Записанное в регистр значение доступно для чтения.
      • Значение по умолчанию:
        • Для датчика углекислого газа SCD40: 50 (5,0 сек).
        • Для датчика эквивалента углекислого газа SGP30: 10 (1,0 сек).
      • Если у модуля нет датчика SCD40 или датчика SGP30, то запись любого значения ни к чему не приведёт.
    • 0x0002 «LTR_PERIOD» - Регистр установки периода обновления данных с датчика освещенности и приближения LTR-553ALS-01, в десятых долях секунд.
      • Значение регистра от 1 до 65535 соответствует времени от 0,1 до 6'553,5 секунд.
      • Время в регистре определяет как часто микроконтроллер блока будет опрашивать датчик сохраняя его показания в регистр "Input Registers" [0x0006] «LUX».
      • Записанное в регистр значение доступно для чтения.
      • Значение по умолчанию: 10 (1,0 сек).
      • Если у модуля нет чипа LTR-553ALS-01, то запись любого значения ни к чему не приведёт.
    • 0x0003 «SCD_CALC» - Регистр управления периодическими измерениями датчика SCD40.
      • Датчик SCD40 обновляет данные только при включенных периодических измерениях.
      • Запись значения 0 - указывает остановить периодические измерения и обнулить данные.
      • Запись значения 1 - указывает запустить периодические измерения в нормальном режиме. Данные датчика будут обновляться каждые 5 секунд.
      • Запись значения 2 - указывает запустить периодические измерения в режиме энергосбережения. Данные датчика будут обновляться каждые 30 секунд.
      • При изменении режима периодических измерений нужно изменить и период опроса датчика SCD40 модулем, записав в регистр "Holding Registers" [0x0001] «CO2_PERIOD» время равное или превышающее время обновления данных (5 или 30 секунд соответственно).
      • Записанное в регистр значение доступно для чтения.
      • Значение по умолчанию: 1 (периодические измерения включены в нормальном режиме).
      • Если у модуля нет датчика SCD40, то запись в данный регистр либо вернёт ошибку «ILLEGAL ADDRESS», либо не приведёт ни к каким действиям (зависит от версии модуля).
    • 0x0004 «SCD_ALTIT» - Регистр указания высоты модуля над уровнем моря в метрах.
      • По высоте указанной в данном регистре, датчик SCD40 примерно рассчитывает среднее атмосферное давление и использует его для коррекции показаний концентрации CO2.
      • Если датчик подвергается постоянным изменениям высоты или давления, то лучше указывать не высоту над уровнем моря, а реальное атмосферное давление, записав его в регистр "Holding Registers" [0x0005] «SCD_PRES» который имеет приоритет перед высотой.
      • Записанное в регистр значение доступно для чтения.
      • Значение по умолчанию: 140 (140 метров над уровнем моря).
      • Если выполняются периодические измерения, то запись данных в регистр приведёт к сбросу всех показаний датчика SCD40 на время опроса (по умолчанию 5 секунд).
      • Если у модуля нет датчика SCD40, то запись в данный регистр либо вернёт ошибку «ILLEGAL ADDRESS», либо не приведёт ни к каким действиям (зависит от версии модуля).
    • 0x0005 «SCD_PRES» - Регистр указания атмосферного давления в гПа.
      • На интенсивность фотоакустического эффекта, а следовательно и на показания концентрации CО2 датчиком SDC40 влияет величина атмосферного давления.
      • Давление рекомендуется указывать модулям которые подвергаются постоянным изменениям высоты или давления, в иных случаях достаточно указать его высоту над уровнем моря в регистре "Holding Registers" [0x0004] «SCD_ALTIT».
      • В герметичных камерах, которые подвергаются изменению температур (например, в дневное и ночное время) так же меняется и давление. Это стоит учесть если модуль планируется устанавливать в герметичную камеру (например, установку гидропоники с полным замкнутым циклом жидкостей и газов).
      • Давление указывается в гПа (гекто Паскалях) 1 гПа = 100 Па ≈ 0.75 мм.рт.ст.
      • Записанное в регистр значение доступно для чтения.
      • Значение по умолчанию: 0 (давление не указано).
      • Запись давления в регистр не приводит к сбросу данных датчика SCD40.
      • Если у модуля нет датчика SCD40, то запись в данный регистр либо вернёт ошибку «ILLEGAL ADDRESS», либо не приведёт ни к каким действиям (зависит от версии модуля).
    • 0x0006 «SCD_CALIB» - Регистр запуска принудительной перекалибровки датчика SCD40.
      • Принудительная перекалибровка позволяет точно настроить показания датчика SCD40.
      • Производитель датчика SCD40 предлагает альтернативный способ применения перекалибровки, а именно для быстрого восстановления показаний после скачка питания. Дело в том, что при скачке питания показания CО2 могут уйти от истинного значения и медленно вернуться, но зная последний актуальный результат, можно выполнить перекалибровку и быстро вернуть показания к актуальным значениям.
      • Перед выполнением перекалибровки датчик должен проработать не менее 3 минут в любом из режимов периодических измерений, при постоянной концентрации CО2.
      • Запуск принудительной перекалибровки осуществляется записью в данный регистр значения концентрации CO2 (от 400 до 2000 ppm) в которой работает датчик SCD40.
      • После завершения перекалибровки, значение регистра изменится на результат принудительной перекалибровки: 0 - провал, 1 - успех.
      • Вместо данной функции можно воспользоваться кнопкой CALIBRATE на плате блока, удержание которой в течении 5 секунд запускает перекалибровку, при этом датчик должен находиться в атмосфере с концентрацией углекислого газа 400 ppm (средняя концентрация на свежем воздухе).
      • Значение по умолчанию: 0 (перекалибровка не выполнялась).
      • Выполнение перекалибровки занимает примерно пол секунды.
      • Если у модуля нет датчика SCD40, то запись в данный регистр либо вернёт ошибку «ILLEGAL ADDRESS», либо не приведёт ни к каким действиям (зависит от версии модуля).
    • 0x0007 «SCD_OFFSET» - Регистр указания смещения температуры датчика SCD40.
      • Значение регистра от 1 до 65535 соответствует температуре от 0,1 до 6'553,5 °С.
      • Датчик SCD40 измеряет температуру внутри корпуса сборки, которая примерно на 4 °С выше температуры окружающей среды из-за самонагрева.
      • Если у модуля нет иных датчиков измерения температуры, то в регистре "Input Registers" [0x0001] «TEM», будет находиться температура измеренная датчиком SCD40 заниженная на значение данного регистра. Если значение данного регистра будет равно значению самонагрева датчика, то мы получим температуру окружающей среды. Например, если датчик определил температуру внутри корпуса сборки 25,0 °С, а значение данного регистра равно 4,0 °С (по умолчанию), то в регистре "Input Registers" [0x0001] «TEM» будет температура 21,0 °С.
      • Смещение температуры не влияет на показания концентрации углекислого газа, но влияет на показания температуры и относительной влажности.
      • Записать в регистр значение самонагрева можно по формуле:
        "Holding Registers" [0x0004] «SCD_OFFSET» = "Input Registers" [0x0001] «TEM» + "Holding Registers" [0x0004] «SCD_OFFSET» - t°C.
        где t°C - это действительная температура окружающей среды (измеренная градусником).
      • Записанное в регистр значение доступно для чтения.
      • Значение по умолчанию: 40 (4,0 °С).
      • Если выполняются периодические измерения, то запись данных в регистр приведёт к сбросу всех показаний датчика SCD40 на время опроса (по умолчанию 5 секунд).
      • Если у модуля нет датчика SCD40, то запись в данный регистр либо вернёт ошибку «ILLEGAL ADDRESS», либо не приведёт ни к каким действиям (зависит от версии модуля).
    • 0x0008 «SCD_TEST» - Регистр запуска самотестирования.
      • Самотестирование осуществляется аппаратными средствами датчика SCD40, при которой проверяется функциональность блоков и цепи питания.
      • Для запуска самотестирования необходимо записать в регистр значение 0x0123.
      • После завершения самотестирования значение регистра изменится на результат самотестирования (0 - провал, 1 - успех), а все данные датчика SCD40 будут сброшены в 0 на время опроса (по умолчанию 5 секунд).
      • Вместо данного регистра можно воспользоваться кнопкой CALIBRATE на плате блока, удержание которой дольше 20 секунд запускает самотестирование.
      • Значение по умолчанию: 0 (самотестирование не выполнялось).
      • Выполнение самотестирования занимает примерно 10 секунд.
      • Если у модуля нет датчика SCD40, то запись в данный регистр либо вернёт ошибку «ILLEGAL ADDRESS», либо не приведёт ни к каким действиям (зависит от версии модуля).
    • 0x0100 «ACK_ID» - Регистр подтверждения смены адреса модуля на шине.
      • Запись значения 0xF0A5 подтверждает новый адрес модуля.
      • Подтверждение адреса модуля осуществляется по подтверждаемому адресу модуля.
      • При чтении регистра возвращается 0x0000.
      • Сначала записывают адрес в регистр "Holding Registers" [0x0110] «SET_ID» и не позднее 2 секунд подтверждают. Если адрес не подтвердить, модуль вернёт прежний адрес. Если адрес модуля не менялся, то запись любого значения в регистр подтверждения будет проигнорирована.
      • Подробный пример доступен ниже, в разделе «установка адреса на шине».
    • 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 - Информирует о ошибках при чтении данных с датчика SCD40 или SGP30.
    • Бит 2 - Информирует о ошибке инициализации датчика SCD40 или 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 позволяют назначать себе адрес на шине, как временно (новый адрес действует пока есть питание), так и постоянно (новый адрес сохраняется в энергонезависимую память и действует даже после отключения питания).

    Допускается указывать адреса от 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 - Датчик углекислого газа CO2, RS485 / Modbus рассказано как работать с датчиком углекислого газа используя дополнительную библиотеку iarduino_MB_CO2.

    На странице Wiki - Датчик эквивалента углекислого газа eCO2, RS485 / Modbus рассказано как работать с датчиком эквивалента углекислого газа используя дополнительную библиотеку iarduino_MB_eCO2.

    Габариты:

    Ссылки:




    Обсуждение

    Гарантии и возврат Используя сайт Вы соглашаетесь с условями