Датчик кислотности жидкости (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.
- Скорость шины: 4800 / 9600 / 19200 / 38400 / 57600 бит/с.
- Адрес на шине: устанавливается программно (по умолчанию 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 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):
Битовые регистры только для чтения.
- 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 секунд подтверждают. Если адрес не подтвердить, датчик вернёт прежний адрес. Если адрес датчика не менялся, то запись любого значения в регистр подтверждения будет проигнорирована.
- Подробный пример доступен ниже, в разделе «установка адреса на шине».
- Запись значения 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. Новая скорость равна 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, а младший байт равен числу 2, 4, 8, 16, или 24, то модуль изменит свою скорость работы на шине. Новая скорость = 2400 умноженное на значение младшего байта, будет действовать в течении 2 секунд, за это время нужно подтвердить смену скорости. Если смену скорости не подтвердить, модуль вернёт прежнюю скорость.
Для подтверждения новой скорости нужно записать значение 0xF0A5 в регистр "Holding Register" [0x0101] «ACK_SPEED». Запрос на запись отправляется модулю с новой скоростью.
Подтверждённая скорость будет действовать до отключения питания.
Установка скорости (с сохранением):
Если в регистр "Holding Register" [0x0111] «SET_SPEED» записать двухбайтное значение, где старший байт равен 255, а младший байт равен числу 2, 4, 8, 16 или 24, то модуль изменит свою скорость работы на шине. Новая скорость = 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.
Обсуждение