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

Датчик кислотности жидкости (pH-метр) RS485 / Modbus - Datasheet

Датчик кислотности жидкости (pH-метр) RS485 / Modbus.

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

Устройство поставляется в двух вариантах: с дисплеем и без дисплея.

Ознакомиться с пользовательским описанием устройства и примерами работы с библиотекой iarduino_MB_pH можно на странице Wiki - Руководство по использованию pH-метра RS485 / Modbus.

Назначение:

Датчик кислотности жидкости (pH-метр) RS485 / Modbus с дисплеем и без дисплея - является устройством для измерения водородного показателя жидкости (показателя pH), характеризующего её кислотность, в диапазоне от 0 pH до 14 pH. Рассчитанную кислотность можно получать по протоколу Modbus шины RS485.

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

Устройство можно использовать для анализа жидкостей используемых в аквариумах, системах водоснабжения, гидропонных установках и т.д. Датчик легко подключается сетевым кабелем через разъем RJ45.

В соответствии с протоколом Modbus, широко применяемому в промышленности, к одной шине RS485 можно подключить до 247 pH-метров. Адрес устройства (по умолчанию 0x04) назначается программно и хранится в его энергонезависимой памяти. Все устройства на шине должны иметь уникальный адрес.

Описание:

Датчик кислотности жидкости (pH-метр) RS485 / Modbus построен на базе микроконтроллера STM32G030F4, микросхемы АЦП CS1237 и конвертера SN65HVD3082EDR с цепями защиты шины RS485 и встроенным терминатором, который можно отключать переключателем на плате. В устройстве используется несколько DC-DC преобразователей и стабилизаторы питания.

Датчик с дисплеем оснащен четырёхразрядным LED дисплеем для отображается кислотности в режиме реального времени.

Датчик без дисплея оснащен зуммером для подачи сигналов о ошибках и стадиях калибровки.

Датчики способны работать с различными измерительными щупами, подключаемыми к разъему BNC, калибровка которых осуществляется всего одним нажатием на кнопку.

Принцип действия pH-метра основан на измерении величины ЭДС электродной системы, значение которой пропорционально водородному показателю pH = -Lg[H+]. Устройство считывает разницу потенциалов между выводами щупа, преобразуя полученные данные в отклонение водородного показателя жидкости от нейтрального значения 7,0 pH.

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

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

  • Менять адрес датчика pH-метра на шине, с сохранением, или без.
  • Менять тип протокола Modbus: RTU/ASCII, с сохранением, или без.
  • Менять скорость передачи данных, с сохранением, или без.
  • Сохранять одно двухбайтное слово в энергонезависимую память и читать его.
  • Читать гальванически развязанные напряжения с разных узлов схемы.
  • Управлять светодиодом обнаружения устройства на разъеме RJ45.
  • Запускать и контролировать процесс калибровки измерительного щупа.
  • Получать результаты калибровки и менять их вручную, с сохранением.
  • Задавать кислотности жидкостей используемых для калибровки.
  • Получать водородный показатель исследуемой жидкости.

Подключение:

Важно: Перед подключением устройства к шине RS485 нужно отключить питание.

Так называемое «горячее подключение» может повредить устройство!

На корпусе датчика pH-метра имеется 2 разъёма: RJ45 и BNC:

  • Разъем RJ45 - для подключения датчика к контроллеру по шине RS485.
  • Разъем BNC - для подключения измерительного щупа.

Назначение выводов разъема 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» Индикатор получения запроса и обнаружения устройства:
    • Индикатор включается при получении запросов, что позволяет визуально отследить их поступление.
    • Устройству можно отправить команду на постоянное свечение индикатора, что позволит визуально найти устройство с известным адресом среди одинаковых устройств на шине.

Назначение выводов разъёма BNC:

  • 1: «IN» - Вывод щупа на котором датчик устанавливает потенциал 1/2 Vcc = 1,65 В
  • 2: «OUT» - Вывод щупа с которого сигнал поступает на вход микросхемы АЦП.
  • Потенциалы разъема BNC гальванически развязаны с потенциалами разъема RJ45.

Если к разъёму BNC подключить щуп и погрузить его в нейтральную жидкость 7.0 pH, то между выводами 1 и 2 не будет разности потенциалов, что подано на вывод 1, то и придёт с вывода 2.

Щуп поставляемый с датчиком имеет чувствительность 59,16 мВ/pH. Это значит, что изменение кислотности на 1pH приводит к изменению разности потенциалов между выводами на 59,16 мВ. Но входное сопротивление микросхемы АЦП частично шунтирует напряжение щупа и снижает его чувствительность до 30 мВ/pH.

Значит при погружении щупа в жидкость 6.0 pH, на выводе 2 будет потенциал 1,65+0,03=1,68В, а при погружении щупа в жидкость 8.0 pH, на выводе 2 будет потенциал 1,65-0,03 = 1,62В.

Стоит учесть, что измерительный щуп является расходным материалом. Его характеристики со временем ухудшаются, уменьшается чувствительность и сдвигается потенциал нейтральной кислотности. Калибровка позволяет датчику определить текущие характеристики щупа, сохранить их в энергонезависимую память и использовать в дальнейших расчётах.

Характеристики:

  • Напряжение питания: от 12 до 24 В постоянного тока (разъем RJ45).
  • Ток потребляемый датчиком: до 100 мА (при свечении всех сегментов дисплея).
  • Интерфейс: RS485 / Modbus.
  • Скорость шины: 2400 / 4800 / 9600 / 19200 / 38400 / 57600 / 115200 бит/с.
  • Адрес на шине: устанавливается программно (по умолчанию 0x04).
  • Диапазон измерений водородного показателя: от 0 до 14 pH
  • Рабочая температура: от 0 до +60 °С.
  • Габариты: 100 x 70 x 40 мм.
  • Вес: ? г.

Дисплей:

Данный раздел относится только с датчику с дисплеем.

Четырёхразрядный LED дисплей выводит кислотность жидкости и информирует о ошибках.

Стабилизация показаний после подачи питания (30 сек).
Удержание кнопки «Калибровка».
Основной режим работы.
Дисплей выводит кислотность исследуемой жидкости.
Ошибка 0.
Провал инициализации чипа АЦП.
Попробуйте отключить и вновь подать питание на датчик.
Ошибка 1.
Ошибка возникает при низком напряжении питания.
Проверьте питание и разъём RJ-45.
Ошибка 2.
На щуп подано напряжение ниже требуемого.
Датчик неисправен.
Ошибка 3.
На щуп подано напряжение выше требуемого.
Датчик неисправен.
Ошибка 4.
Высокая разница потенциалов на выводах щупа pH<0.
Возможно щуп не подключён или неисправен.
Ошибка 5.
Высокая разница потенциалов на выводах щупа pH>14.
Возможно щуп не подключён или неисправен.
Ошибка 6.
Некорректные показания кислотности. Данные "скачут".
Неисправен щуп или некорректны калибровочные значения.
Ошибка 7.
Ошибка чтения данных с чипа АЦП.
Датчик неисправен.
Ошибка С (Error Calibration).
Ошибка калибровки. Выполнена с ошибкой или прервана.

Зуммер:

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

Ошибка 0
Провал инициализации чипа АЦП.
Каждую секунду датчик издаёт один короткий звуковой сигнал.
Ошибка 1
Низкое напряжение питания.
Каждую секунду датчик издаёт один длинный звуковой сигнал.
Ошибка 2• •
На щуп подано напряжение ниже требуемого.
Каждую секунду датчик издаёт два коротких звуковых сигнала.
Ошибка 3─ ─
На щуп подано напряжение выше требуемого.
Каждую секунду датчик издаёт два длинных звуковых сигнала.
Ошибка 4• ─
Высокая разница потенциалов на выводах щупа pH<0.
Каждую секунду датчик издаёт два сигнала, короткий, потом длинный.
Ошибка 5─ •
Высокая разница потенциалов на выводах щупа pH>14.
Каждую секунду датчик издаёт два сигнала, длинный, потом короткий.
Ошибка 6• • ─
Некорректные показания кислотности. Данные "скачут".
Каждую секунду датчик издаёт три сигнала, 2 коротких и 1 длинный.
Ошибка 7─ • •
Ошибка чтения данных с чипа АЦП.
Каждую секунду датчик издаёт три сигнала, 1 длинный и 2 коротких.
Ошибка С─ ─ ─
Калибровка выполнена с ошибкой или прервана.
Датчик издаёт три очень длинных звуковых сигнала.

Сигналы о ошибках генерируются на низкой (500Гц) частоте.

Длительность короткого сигнала составляет 0,1 сек, длинного 1 сек, а очень длинного 2 сек.

Калибровка:

Для калибровки потребуются две калибровочные жидкости, с водородными показателями 4,0 pH и 9.18 pH, а так же дистиллированная вода. Все жидкости должны иметь температуру при которой планируется выполнять дальнейшие измерения.

Примечание: Для калибровки датчика можно использовать жидкости с другими водородными показателями, если их pH заранее записаны в регистры "Holding Registers" [0x0000] «KNOWN_PH_1» и "Holding Registers" [0x0001] «KNOWN_PH_2».

Водородный показатель первой калибровочной жидкости должен отличаться от второй не менее чем на 2 pH.

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

Калибровка датчика с дисплеем:

Запуск калибровки.
Опустите щуп в первую жидкость (4,0 pH).
Удерживайте кнопку «Калибровка» до появления «----».
1 стадия калибровки (ожидание).
На дисплее появится требуемый pH первой жидкости (4,00).
Датчик ждёт стабилизации показаний измерительного щупа.
1 стадия калибровки (выполнение).
Датчик считывает показания измерительного щупа и выводит на дисплей анимацию кругового включения сегментов.
Ожидание смены жидкости.
На дисплее мигает требуемый pH второй жидкости (9,18).
Достаньте щуп из первой жидкости и опустите во вторую.
Датчик сам определит смену жидкости.
2 стадия калибровки (ожидание).
Требуемый водородный показатель перестанет мигать.
Датчик ждёт стабилизации показаний измерительного щупа.
2 стадия калибровки (выполнение).
Датчик считывает показания измерительного щупа и выводит на дисплей анимацию кругового включения сегментов.
Успешное завершение калибровки.
Если на дисплее появилась надпись «Good», значит калибровка выполнена успешно и все рассчитанные показания сохранены в энергонезависимую память датчика.
Ошибка калибровки.
Если на дисплее появилась надпись «Err.C» значит калибровка не выполнена и данные не сохранены.
Результат калибровки (Good / Err.C) исчезнет через 2 секунды.

Калибровка датчика без дисплея:

Запуск калибровки.
Опустите щуп в первую калибровочную жидкость (4,00 pH).
Нажмите и удерживайте кнопку «Калибровка».
Датчик издаст короткий звуковой сигнал при нажатии на кнопку и такой же сигнал через секунду её удержания, тогда кнопку можно отпустить.
1 стадия калибровки.
Каждую секунду датчик издаёт один короткий звуковой сигнал.
На этой стадии датчик ждёт стабилизации показаний щупа, а потом считывает их.
─ ─Ожидание смены жидкости.
Каждую секунду датчик издаёт два длинных звуковых сигнала.
Достаньте щуп из первой калибровочной жидкости и опустите во вторую.
• •2 стадия калибровки.
Каждую секунду датчик издаёт два коротких звуковых сигнала.
На этой стадии датчик ждёт стабилизации показаний щупа, а потом считывает их.
Успешное завершение калибровки.
Если датчик издал один очень длинный звуковой сигнал, значит калибровка выполнена успешно и все рассчитанные показания сохранены в энергонезависимую память.
─ ─ ─Ошибка калибровки.
Если датчик издал три очень длинных звуковых сигнала,
значит калибровка не выполнена и данные не сохранены.

Сигналы о стадиях и успехе калибровки генерируются на высокой (3кГц) частоте, а сигнал о ошибке, на низкой (500Гц) частоте.

Длительность короткого сигнала составляет 0,1 сек, длинного 1 сек, а очень длинного 2 сек.

Правила калибровки общие для датчиков с дисплеем и без:

Запустить калибровку можно не только удержанием кнопки «Калибровка», но и установкой регистра "Coils" [0x0001] «CALC_START».

После запуска калибровки, требуется только сменить первую калибровочную жидкость на вторую. Датчик самостоятельно зафиксирует смену жидкости и перейдёт ко второй стадии.

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

Процесс ожидания стабилизации показаний щупа занимает не менее 10 секунд.

Калибровку можно отменить, в любой момент, повторным нажатием на кнопку «Калибровка» или установкой регистра "Coils" [0x0002] «CALC_STOP». Калибровка автоматически отменяется, если любая из стадий калибровки выполняется дольше 2 минут. Отмена калибровки расценивается как ошибка с соответствующим уведомлением.

Стадии калибровки, её результат и рассчитанные параметры доступны из регистров.

Регистры:

По протоколу 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:
0x0000CALC_ERR
0x0001STATUS_1
0x0002STAY
0x0003STATUS_2
0x0004STABLE_PH
0x0005
...
0x00FF
RESERVED
адресрегистры DO:
0x0000HL_DATA
0x0001CALC_START
0x0002CALC_STOP
0x0003
...
0x00FF
RESERVED
адресрегистры AI:
0x00005V
0x0001V0
0x0002VOUT
0x0003PH
0x0005
...
0x00FF
RESERVED
адресрегистры AO:
0x0000KNOWN_PH_1
0x0001KNOWN_PH_2
0x0002VSTP
0x0003PHN
0x0004STABLE_PH
0x0005UNSTABLE_PH
0x0006CALC_SAVE
0x0007
...
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.

Регистры "Discrete Inputs" (DI):

Битовые регистры только для чтения.

  • 0x0000 «CALC_ERR» - Регистр является флагом ошибки последней калибровки.
    • Устанавливается если калибровка выполнена с ошибкой.
    • Сбрасывается в начале калибровки.
    • Датчик считает калибровку выполненной с ошибкой, если рассчитанная чувствительность щупа выходит за диапазон 12...75 мВ/pH, или нейтральная кислотность для щупа выходит за диапазон ±3 pH от эталонного значения 7,00 pH. В таком случае результаты калибровки не сохраняются.
  • 0x0001 «STATUS_1» - Регистр является флагом выполнения 1 стадии калибровки.
    • Устанавливается при отпускании кнопки калибровки или установке "Coils" [0x0001] «CALC_START».
    • Сбрасывается при завершении первой стадии калибровки.
    • На первой стадии калибровки датчик ждёт стабилизации показаний кислотности и если они стабильны в течении 20 секунд, то датчик запоминает среднее напряжение снятое с щупа.
  • 0x0002 «STAY» - Регистр является флагом ожидания смены калибровочной жидкости.
    • Устанавливается при завершении первой стадии калибровки.
    • Сбрасывается после погружения щупа во 2 калибровочную жидкость.
    • Датчик определяет смену калибровочной жидкости, если кислотность изменилась более чем на 1pH и её показания не меняются дольше 2 секунд.
  • 0x0003 «STATUS_2» - Регистр является флагом выполнения 2 стадии калибровки.
    • Устанавливается при сбросе регистра "Discrete Inputs" [0x0002] «STAY».
    • Сбрасывается при завершении второй стадии калибровки.
    • На второй стадии калибровки датчик ждёт стабилизации показаний кислотности и если они стабильны в течении 20 секунд, то датчик запоминает среднее напряжение снятое с щупа.
    • Завершается вторая стадия калибровки расчётом чувствительности щупа Vstp и нейтральной кислотности pHn для щупа.
    • Если рассчитанные значения не выходят за допустимые диапазоны, то они сохраняются в регистры "Holding Registers" [0x0002] «VSTP» и "Holding Registers" [0x0003] «PHN», иначе устанавливается регистр ошибки калибровки "Discrete Inputs" [0x0000] «CALC_ERR».
  • 0x0004 «STABLE_PH» - Регистр является флагом нормализации показаний кислотности.
    • Устанавливается если показания кислотности стабильны.
      Стабильными считаются показания кислотности, если их среднее значение за последние 10 секунд не сместилось за предел допустимой флуктуации, указанный в регистре "Holding Registers" [0x0004] «STABLE_PH».
    • Сбрасывается если показания кислотности не стабильны (растут или падают).
      Нестабильными считаются показания кислотности, если их среднее значение на последние 10 секунд сместилось за предел высокой флуктуации, указанный в регистре "Holding Registers" [0x0005] «UNSTABLE_PH».
    • Когда датчик в процессе калибровки ждёт стабилизации показаний, он ждёт установки данного регистра.

Регистры "Coils" (DO):

Битовые регистры для чтения и записи.

  • 0x0000 «HL_DATA» - Регистр включения индикатора обнаружения устройства.
      Индикатор обнаружения устройства, это светодиод разъема RJ45.
    • Установка регистра в «1» приведёт к постоянному свечению индикатора.
    • Сброс регистра в «0» отключит индикатор, он будет информировать о получении запросов.
    • Значение по умолчанию: 0.
  • 0x0001 «CALC_START» - Регистр запуска калибровки.
    • Установка регистра в «1» приведёт к запуску калибровки, как при нажатии на кнопку.
    • Сброс регистра в «0» осуществляется автоматически, информируя о начале калибровки.
    • Запись нужно разрешить регистром "Holding Registers" [0x0006] «CALC_SAVE».
    • Значение по умолчанию: 0.
  • 0x0001 «CALC_STOP» - Регистр отмены калибровки (если она запущена).
    • Установка регистра в «1» приведёт к отмене калибровки, как при нажатии на кнопку.
    • Сброс регистра в «0» осуществляется автоматически, информируя о отмене калибровки.
    • Запись нужно разрешить регистром "Holding Registers" [0x0006] «CALC_SAVE».
    • Значение по умолчанию: 0.
    • Регистр доступен только в модулях версии 6 и выше.
  • 0x0100 «CHANGE_ID» - Регистр является флагом смены адреса датчика на шине.
    • Установка регистра в «1» осуществляется аппаратно, после успешной смены адреса.
    • Сброс регистра осуществляется программно, записью «0».
    • Значение по умолчанию: 0.
  • 0x0101-0x01F7 «DO_BAN_ID» - Регистры запрещённых адресов.
    • Если установить в «1» регистр, младший байт адреса которого совпадает с текущим адресом датчика на шине, то датчик не будет менять свой адрес в режиме смены адреса на случайное число.
    • При смене адреса датчика на случайное число, новый случайный адрес датчика не будет равен младшему байту адреса тех регистров, в которых записана «1».
    • Сброс регистра в «0» разрешает использовать младший байт адреса регистра для выбора случайного адреса датчика на шине.
    • Значение по умолчанию: 0.
    • Подробный пример доступен ниже, в разделе «режим выбора случайного адреса».

Регистры "Input Registers" (AI):

Двухбайтные регистры только для чтения.

  • 0x0000 «5V» - Регистр содержит напряжение питания шины 5В.
    Значение хранится в тысячных долях В ( 00,000...65,535 В ).
    У других модулей iarduino, не имеющих гальванической развязки по питанию, данный регистр содержит напряжение питания получаемое с разъема RJ45.
  • 0x0001 «V0» - Регистр содержит напряжение на входе щупа.
    Значение хранится в десятитысячных долях В ( 0,0000...6,5535 В ).
    Эталонное значение: 0,5Vcc = 0,5*3,3 = 1,65 В.
  • 0x0002 «VOUT» - Регистр содержит напряжение на выходе щупа.
    Значение хранится в десятитысячных долях В ( 0,0000...6,5535 В ).
    Эталонный диапазон значений: Vout = 0,5Vcc ±7*Vstp = 0,5*3,3 ±7*0,030 = 1,44...1,86 В.
  • 0x0003 «PH» - Регистр содержит рассчитанную кислотность жидкости.
    Значение хранится в тысячных долях pH ( 00,000...65,535 pH ).

Регистры "Holding Registers" (AO):

Двухбайтные регистры для чтения и записи.

  • 0x0000 «KNOWN_PH_1» - Регистр кислотности первой калибровочной жидкости.
    • Значение хранится в тысячных долях pH ( 0...65,535 pH ) в энергонезависимой памяти.
    • Запись нужно разрешить регистром "Holding Registers" [0x0006] «CALC_SAVE».
    • После записи нового значения, датчик будет занят около 50 миллисекунд.
    • Регистр позволяет использовать для калибровки любые жидкости с известным pH.
    • Значение регистра используется в расчётах результата калибровки, оно должно отличаться от значения следующего регистра не менее чем на 2 pH (в любую сторону).
    • Значение по умолчанию: 04,000 pH.
  • 0x0001 «KNOWN_PH_2» - Регистр кислотности второй калибровочной жидкости.
    • Значение хранится в тысячных долях pH ( 0...65,535 pH ) в энергонезависимой памяти.
    • Запись нужно разрешить регистром "Holding Registers" [0x0006] «CALC_SAVE».
    • После записи нового значения, датчик будет занят около 50 миллисекунд
    • Регистр позволяет использовать для калибровки любые жидкости с известным pH.
    • Значение регистра используется в расчётах результата калибровки, оно должно отличаться от значения предыдущего регистра не менее чем на 2 pH (в любую сторону).
    • Значение по умолчанию: 09,180 pH.
  • 0x0002 «VSTP» - Регистр хранит чувствительность измерительного щупа.
    • Значение хранится в сотых долях мВ/pH ( 0...655,35 мВ/pH) в энергонезависимой памяти.
    • Запись нужно разрешить регистром "Holding Registers" [0x0006] «CALC_SAVE».
    • После записи нового значения, датчик будет занят около 50 миллисекунд.
    • Значение регистра перезаписывается по результатам калибровки.
    • Чувствительность измерительного щупа показывает, на сколько изменится напряжение между выводами щупа, при изменении кислотности жидкости на 1 pH.
    • Значение по умолчанию: 030,00 мВ/pH.
  • 0x0003 «PHN» - Регистр хранит нейтральную кислотность жидкости для щупа.
    • Значение хранится в тысячных долях pH ( 0...65,535 pH ) в энергонезависимой памяти.
    • Запись нужно разрешить регистром "Holding Registers" [0x0006] «CALC_SAVE».
    • После записи нового значения, датчик будет занят около 50 миллисекунд.
    • Значение регистра перезаписывается по результатам калибровки.
    • Нейтральная кислотность жидкости, это такая кислотность, при которой между выводами измерительного щупа отсутствует разность потенциалов.
    • Значение по умолчанию: 07,000 pH.
  • 0x0004 «STABLE_PH» - Регистр хранит допустимую флуктуацию кислотности жидкости.
    • Значение хранится в тысячных долях pH ( 0...65,535 pH ) в энергонезависимой памяти.
    • Запись нужно разрешить регистром "Holding Registers" [0x0006] «CALC_SAVE».
    • После записи нового значения, датчик будет занят около 50 миллисекунд.
    • Значение регистра перезаписывается по результатам калибровки.
    • Если среднее значение кислотности за последние 10 секунд не сместилось за предел допустимой флуктуации, то показания считаются стабильными, устанавливается флаг "Discrete Inputs" [0x0004] «STABLE_S».
    • Значение по умолчанию: 00,002 pH.
  • 0x0005 «UNSTABLE_PH» - Регистр хранит высокую флуктуацию кислотности жидкости.
    • Значение хранится в тысячных долях pH ( 0...65,535 pH ) в энергонезависимой памяти.
    • Запись нужно разрешить регистром "Holding Registers" [0x0006] «CALC_SAVE».
    • После записи нового значения, датчик будет занят около 50 миллисекунд.
    • Значение регистра перезаписывается по результатам калибровки.
    • Если среднее значение кислотности за последние 10 секунд сместилось за предел высокой флуктуации, то показания считаются не стабильными, сбрасывается флаг "Discrete Inputs" [0x0004] «STABLE_S».
    • Значение по умолчанию: 00,003 pH.
  • 0x0006 «CALC_SAVE» - Регистр разрешения записи калибровочных значений.
    • Регистр защищает датчик от случайной записи калибровочных значений.
    • В регистр нужно записать число 0x2709 до записи значений в регистры "Holding Registers" [0x000-0x0003] «KNOWN_PH_1», «KNOWN_PH_2», «VSTP», «PHN» и перед запуском калибровки регистром "Coils" [0x0001] «CALC_START».
    • Значение регистра сбрасывается после записи в любой из защищаемых регистров.
    • Значение по умолчанию: 0.
  • 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 - это число: 1, 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...7 - Не используются (всегда сброшены в «0»).
  • Бит 6 «ERR_Power» - С момента подачи питания прошло меньше 30 секунд.
  • Бит 5 «ERR_pH» - Показания pH "скачут".
  • Бит 4 «ERR_Vout» - Измеренный водородный показатель выше допустимого (pH > 14 ).
  • Бит 3 «ERR_Vout» - Измеренный водородный показатель ниже допустимого (pH < 0).
  • Бит 2 «ERR_Vo» - Напряжение подаваемое на щуп выше расчётного.
  • Бит 1 «ERR_Vo» - Напряжение подаваемое на щуп слабее расчётного.
  • Бит 0 «ERR_5V» - Напряжение на шине питания 5В ниже 4В.

Доступ к данным регистров:

Так как датчик использует протокол передачи данных Modbus, то и доступ к данным описан им. Ознакомиться с протоколом можно на странице Wiki - Работа с протоколом Modbus RTU/ASCI по шине RS485.

Получение информации об устройстве:

В соответствии с протоколом Modbus для получения информации об устройстве используется запрос с командой 0x11 «Report Slave ID». В библиотеке iarduino_Modbus эту команду выполняет функция объект.getInfo(ID); Ответ на запрос содержит следующие данные:

  • 1 байт. Идентификатор линейки устройств. Для всех устройств iarduino = 0x77.
  • 1 байт. Индикатор пуска. Может принимать одно из двух значений: 0xFF-вкл, 0x00-выкл.
  • 1 байт. ID-адрес модуля на шине. По умолчанию для датчика pH-метра = 0x04.
  • 1 байт. Идентификатор устройства (тип устройства). Для pH-метра = 0x07.
    • Для датчика кислотности жидкости (pH-метр) с дисплеем = 0x07.
    • Для датчика кислотности жидкости (pH-метр) без дисплея = 0x09.
  • 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 позволяют назначать себе адрес на шине, как временно (новый адрес действует пока есть питание), так и постоянно (новый адрес сохраняется в энергонезависимую память и действует даже после отключения питания). Датчики pH-метров по умолчанию имеют адрес 0x04.

Допускается указывать адреса от 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, а младший байт равен числу 1, 2, 4, 8, 16, 24, или 48, то модуль изменит свою скорость работы на шине. Новая скорость = 2400 умноженное на значение младшего байта, будет действовать в течении 2 секунд, за это время нужно подтвердить смену скорости. Если смену скорости не подтвердить, модуль вернёт прежнюю скорость.

Для подтверждения новой скорости нужно записать значение 0xF0A5 в регистр "Holding Register" [0x0101] «ACK_SPEED». Запрос на запись отправляется модулю с новой скоростью.

Подтверждённая скорость будет действовать до отключения питания.

Установка скорости (с сохранением):

Если в регистр "Holding Register" [0x0111] «SET_SPEED» записать двухбайтное значение, где старший байт равен 255, а младший байт равен числу 1, 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 мс.

Пример чтения водородного показателя:

Следующий скетч выводит кислотность жидкости в которую погружен щуп.

  • Шина UART0 микроконтроллера (Serial) используется для вывода данных в монитор.
  • Шина UART1 микроконтроллера (Serial1) подключена к конвертеру UART-RS485.
  • Вывод 22 микроконтроллера подключен к выводу DE конвертера UART-RS485.
#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" [0x0003] «PH»:  //
     int32_t i = modbus.inputRegisterRead(4, 3);     // Функция принимает адрес модуля и адрес регистра, возвращает прочитанное значение (0...65535), или -1 при неудаче.
//   Проверяем успешность чтения регистра:           //
     if( i<0 ){ Serial.println("Error"); }           // Если прочитанное значение i<0, значит чтение выполнено с ошибкой.
//   Выводим водородный показатель в монитор:        //
     else { Serial.println( (float)i/1000.0f ); }    // Выводим прочитанное значение, преобразовав его в pH.
}                                                    //

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

На странице Wiki - Руководство по использованию pH-метра RS485 / Modbus рассказано как работать с датчиком pH-метр используя дополнительную библиотеку iarduino_MB_pH.

Габариты:

Ссылки:




Обсуждение

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