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

Датчик минерализации (TDS/EC-метр) RS485 / Modbus - Datasheet

Датчик минерализации (TDS/EC-метр) RS485 / Modbus.

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

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

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

Назначение:

Датчик минерализации (TDS/EC-метр) RS485 / Modbus (с дисплеем и без дисплея) - является устройством для измерения общего количества растворённых твердых веществ в воде, а так же измеренной и приведённой удельной электрической проводимости. По количеству растворенных веществ можно судить об общей минерализации, жёсткости и солёности воды. Чувствительность датчика позволяет «заметить» 2-3 крупинки мелкозерновой пищевой соли (NaCl) растворённой в стакане дистиллированной воды. Рассчитанные значения можно получать по протоколу Modbus шины RS485.

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

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

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

Описание:

Датчик минерализации (TDS/EC-метр) RS485 / Modbus построен на базе микроконтроллера STM32F030F4, операционного усилителя LMC7101, конвертера SN65HVD3082EDR с цепями защиты шины RS485 и встроенным терминатором, который можно отключать переключателем на плате. В устройстве используется несколько DC-DC преобразователей и стабилизаторы питания.

Датчик с дисплеем оснащен четырёхразрядным LED дисплеем для отображается значений в режиме реального времени (по умолчанию - на дисплей выводится приведённая удельная электропроводность в мСм/см). Но на дисплей можно выводить и другие рассчитанные данные. Так же на дисплей выводятся ошибки и информация о стадиях калибровки.

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

Датчик способен работать как TDS-метр (Total Dissolved Solids) для определения общего количества растворённых твердых веществ в воде от 5 до 10'000 ppm (1ppm = 1мг/л воды). Способен работать в качестве EC-метра (Electrical Conductivity) для определения приведённой удельной электрической проводимости от 0.01 до 20.00 мСм/см. И может выполнять роль Ом-метра для определения общего сопротивления между выводами щупа от 20 Ом до 20 кОм. Датчик способен работать с различными щупами, калибровка которых осуществляется всего одним нажатием на кнопку.

Проводимые датчиком расчеты основаны на прямой зависимости электропроводности от количества растворенных в воде веществ, а электропроводность жидкости является величиной обратно пропорциональной её сопротивлению. Так как электропроводность и сопротивление жидкости сильно зависят от температуры, датчику TDS/EC-метра нужно указывать реальную температуру жидкости в °С.

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

Измерительная часть схемы датчика построена следующим образом:

  • На инвертирующий вход ОУ, через щуп (Rщупа), подается меандр (Vsens) с размахом потенциалов от 0,4Vcc до 0,6Vcc, а через сопротивление обратной связи (Rooc) подаётся напряжение с выхода ОУ (Vout).
  • На неинвертирующий вход ОУ подаётся постоянный потенциал (Vo), так называемое, напряжение виртуального ноля, равное половине напряжения питания (0,5Vcc).
  • Операционный усилитель (ОУ) будет устанавливать такое напряжение на своём выходе (Vout) при котором потенциал инвертирующего входа (центральная точка делителя Rщупа+Rooc) будет равен потенциалу неинвертирующего входа (Vo).
  • Так как на один вывод щупа подан меандр (Vsens), а на другом выводе щупа ОУ установил потенциал (Vo) равный центру потенциалов меандра, то напряжение между выводами щупа является переменным:
    • Vщупа = разность потенциалов Vsens и Vo:
    • Vsens-Vo = 0,6Vcc-0,5Vcc = +0,1Vcc.
    • Vsens-Vo = 0,4Vcc-0,5Vcc = -0,1Vcc.
  • Сопротивление между выводами щупа (Rщупа) = Rоос * (Vsens-Vo) / (Vo-Vout).
  • Схема самостоятельно корректирует напряжение используемое для измерений. Чем выше сопротивление жидкости, тем больше напряжение используемое для измерений. Это достигается тем, что при снижении сопротивления Rщупа, размах меандра Vsens будет уменьшаться, стремясь к значению Vo.

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

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

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

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

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

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

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

На корпусе датчика TDS/EC-метра имеется 2 разъёма: RJ45 и CWF-2:

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

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

Назначение выводов разъёма CWF-2 (DS1069-02M):

  • 1: «Vo» - Вывод щупа на котором устанавливается напряжение виртуального ноля (0,5Vcc).
  • 2: «Vsens» - Вывод щупа на который датчик подаёт меандр (переменный потенциал).
  • Потенциалы разъема CWF-2 гальванически развязаны с потенциалами разъема RJ45.

Изменение сопротивления жидкости (Rщупа) подведённое к выводам 1 и 2 разъема, приводит к изменению напряжения (Vout) на выходе ОУ, так как используемая схема пытается сохранить напряжение виртуального ноля (Vo) на выводе 1.

Vout = Vo * (1+Ky) - Vsens * Ky, где Ky = - Rooc / Rщупа.

Так как потенциал Vsens является переменным, то датчик проводит измерения только при положительных полуволнах.

Стоит учесть, что характеристики измерительного щупа меняются со временем. Калибровка позволяет датчику определить коэффициенты Ka и Kb степенной функции соответствующие параметрам щупа для дальнейших расчетов удельной электропроводности по значению напряжения Vout на выходе ОУ.

S = Ka * Vout-Kb.

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

  • Напряжение питания: от 12 до 24 В постоянного тока (разъем RJ45).
  • Ток потребляемый датчиком: до 100 мА (при свечении всех сегментов дисплея).
  • Интерфейс: RS485 / Modbus.
  • Скорость шины: 2400 / 4800 / 9600 / 19200 / 38400 / 57600 / 115200 бит/с.
  • Адрес на шине: устанавливается программно (по умолчанию 0x05).
  • Диапазон измерений TDS: от 5 до 10'000 ppm (мг/л воды).
  • Диапазон измерений ЕС: от 0.01 до 20.00 мСм/см.
  • Диапазон измерений Ro: от 20 до 20'000 Ом.
  • Частота тока используемого для измерений: от 50Гц до 5кГц (по умолчанию 2кГц).
  • Точность показаний: ±5% (для растворов NaCl до 3'000 ppm).
  • Рабочая температура: от 5 до +55 °С.
  • Габариты: 100 x 70 x 40 мм.
  • Вес: ? г.

Дисплей:

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

Кнопкой можно выбирать один из трех параметров для вывода на дисплей:

  • R - Рассчитанное сопротивление между выводами щупа.
    Значение выводится в Ом целым числом.
  • EC - Приведённую удельную электропроводность (приведённую к опорной температуре).
    Значение выводится в мСм/см с двумя знаками после запятой.
  • TDS - Общее количество растворённых твёрдых веществ (минерализация).
    Значение выводится в ppm "pro pro mille" целым числом.

Для выбора требуемого параметра нужно удерживать кнопку «Калибровка». Через 10 секунд на дисплее начнут сменяться надписи "R", "EC", "TDS". Отпускание кнопки подтверждает выбор.

Регистр "Holding Registers" [0x000BD] «DISPLAY» позволяет выбирать один из восьми параметров для вывода на дисплей:

  • R - Рассчитанное сопротивление между выводами щупа.
    Значение выводится в Ом целым числом.
  • S - Измеренную удельную электропроводность (при текущей температуре).
    Значение выводится в мСм/см с двумя знаками после запятой.
  • EC - Приведённую удельную электропроводность (приведённую к опорной температуре).
    Значение выводится в мСм/см с двумя знаками после запятой.
  • TDS - Общее количество растворённых твёрдых веществ (минерализация).
    Значение выводится в ppm "pro pro mille" целым числом.
  • 5V - Измеренное напряжения питания на шине +5V.
    Значение выводится в В, с тремя знаками после запятой.
  • Vo - Измеренное напряжение виртуального ноля.
    Значение выводится в В, с тремя знаками после запятой.
  • Vout - Измеренное напряжение на выходе ОУ.
    Значение выводится в В, с тремя знаками после запятой.
  • Vsens - Измеренное напряжение на входе щупа при положительной полярности.
    Значение выводится в В, с тремя знаками после запятой.

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

Стабилизация показаний после подачи питания (3 сек).
Удержание кнопки «Калибровка».
Основной режим работы.
Дисплей выводит (по умолчанию)
приведённую удельную электропроводность в мСм/см.
Ошибка 0.
Ошибка возникает при низком напряжении питания.
Проверьте питание и разъем RJ-45.
Ошибка 1.
Ошибка информирует о низком напряжении виртуального ноля.
Датчик неисправен.
Ошибка 2.
Ошибка информирует о высоком напряжении виртуального ноля.
Датчик неисправен.
Ошибка 3.
Ошибка информирует о низком напряжении на выходе ОУ.
Возможно щуп не подключён или неисправен.
Ошибка 4.
Ошибка информирует о высоком напряжении на выходе ОУ.
Возможно щуп не подключён или неисправен.
Ошибка 5.
Показания считаны при отрицательной полуволне Vsens.
Датчик неисправен.
Ошибка С (Error Calibration).
Ошибка калибровки.
Не запустилась, выполнена с ошибкой или прервана.
Ошибка D (Error Display).
Регистр "Holding Registers" [0x000D] «DISPLAY» содержит
недопустимое значение.

Зуммер:

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

Ошибка 0
Низкое напряжение питания.
Каждую секунду датчик издаёт один короткий звуковой сигнал.
Ошибка 1
Низкое напряжение виртуального ноля.
Каждую секунду датчик издаёт один длинный звуковой сигнал.
Ошибка 2• •
Высокое напряжение виртуального ноля.
Каждую секунду датчик издаёт два коротких звуковых сигнала.
Ошибка 3─ ─
Низкое напряжение на выходе ОУ.
Каждую секунду датчик издаёт два длинных звуковых сигнала.
Ошибка 4• ─
Высокое напряжение на выходе ОУ.
Каждую секунду датчик издаёт два сигнала, короткий, потом длинный.
Ошибка 5─ •
Показания считаны при отрицательной полуволне Vsens.
Каждую секунду датчик издаёт два сигнала, длинный, потом короткий.
Ошибка С─ ─ ─
Калибровка выполнена с ошибкой или прервана.
Датчик издаёт три очень длинных звуковых сигнала.

У датчика без дисплея, нет ошибки D, как у датчика с дисплеем.

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

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

Калибровка:

Для калибровки потребуются две калибровочные (буферные) жидкости, с общим количеством растворённых твердых веществ 500 ppm (1.00 мСм/см при 25°С) и 1500 ppm (3.00 мСм/см при 25°С), а так же дистиллированная вода. Все жидкости должны иметь температуру при которой планируется выполнять дальнейшие измерения.

Примечание: Для калибровки датчика можно использовать жидкости с другой минерализацией, если общее количество растворённых твердых веществ этих жидкостей заранее записано в регистры "Holding Registers" [0x0001] «KNOWN_TDS_1» и "Holding Registers" [0x0002] «KNOWN_TDS_2». Минерализация первой жидкости должна отличаться от второй не менее чем на 200 ppm (0.40 мСм/см при 25°С).

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

  • Если до начала калибровки на дисплее выводилась удельная электропроводность в мСм/см, то и в процессе калибровки, на дисплее будет отображаться информация в мСм/см.
  • Если до начала калибровки выводилась минерализация в ppm, то и в процессе калибровки, на дисплее будет отображаться информация в ppm.
  • Изменить тип выводимых на дисплей данных, можно удержанием кнопки «Калибровка».

Важно: Если на дисплее выводилось сопротивление (в Ом) или напряжение (в В),

то калибровка не запустится, т.к. датчик не знает в каких единицах выводить данные.

На дисплее появится надпись "Err.C".

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

Запуск калибровки.
Опустите щуп в первую жидкость (500ppm = 1.00мСм/см).
Удерживайте кнопку «Калибровка» до появления «----».
1 стадия калибровки (ожидание).
Появится требуемое значение 1 жидкости (500ppm = 1.00мСм/см).
Датчик ждёт стабилизации показаний измерительного щупа.
1 стадия калибровки (выполнение).
Датчик считывает показания измерительного щупа и выводит на дисплей анимацию кругового включения сегментов
Ожидание смены жидкости.
Мигает требуемое значение 2 жидкости (1500ppm = 3.00мСм/см).
Достаньте щуп из первой жидкости и опустите во вторую.
Датчик сам определит смену жидкости.
2 стадия калибровки (ожидание).
Требуемое значение второй жидкости перестанет мигать.
Датчик ждёт стабилизации показаний измерительного щупа.
2 стадия калибровки (выполнение).
Датчик считывает показания измерительного щупа и выводит на дисплей анимацию кругового включения сегментов.
Успешное завершение калибровки.
Если на дисплее появилась надпись «Good», значит калибровка выполнена успешно и все рассчитанные показания сохранены в энергонезависимую память датчика.
Ошибка калибровки.
Если на дисплее появилась надпись «Err.C», значит калибровка не выполнена и данные не сохранены.

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

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

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

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

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

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

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

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

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

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

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

Приготовление калибровочных жидкостей:

Данный пример позволяет приготовить два раствора с концентрации 500 ppm и 1'500 ppm.

Нам понадобятся: хлорид калия (KCl), дистиллированная вода (H2O) - продаётся в универсальных и автомагазинах, 3 чистых стакана, шприц, и весы.

Рекомендуется взять хлорид калия в пакетах по 1 грамму, тогда весы не понадобятся.

Если хлорида калия (KCl) нет, можно взять хлорид натрия (NaCl) - это обычная пищевая соль.

  1. Пронумеруйте стаканы цифрами «0», «1» и «2» соответственно.
  2. В стакане «0» приготовим эталонный раствор хлорида калия с концентрацией 10'000 ppm:
    • В стакан «0» насыпьте 1 г (1'000 мг) калиевой соли (KCl).
    • В стакан «0» налейте 50-70 мл дистиллированной воды.
      Перемешайте содержимое стакана до полного растворения соли.
    • В стакан «0» долейте дистиллированной воды до получения 100 мл раствора.
      Перемешайте содержимое стакана до полного растворения соли.
    • В итоге в стакане «0» мы получили эталонный раствор 10'000 ppm.
      (1'000 мг / 100 мл = 10'000 мг/л = 10'000 ppm)
      .
  3. В стакане «1» приготовим первую калибровочную жидкость 500 ppm:
    • В стакан «1» перелейте 5 мл эталонного раствора из стакана «0» с помощью шприца.
      Теперь в стакане «1» находится 5 мл начального раствора.
      (1'000 мг / 100 мл = 50 мг / 5 мл)
      .
    • В стакан «1» долейте дистиллированной воды до получения 100 мл раствора.
      Перемешайте содержимое стакана.
    • В итоге в стакане «1» мы получили первую калибровочную жидкость 500 ppm.
      (50 мг / 100 мл = 500 мг/л = 500 ppm)
      .
  4. В стакане «2» приготовим вторую калибровочную жидкость 1'500 ppm:
    • В стакан «2» перелейте 15 мл эталонного раствора из стакана «0» с помощью шприца.
      Теперь в стакане «2» находится 15 мл начального раствора.
      (1'000 мг / 100 мл = 150 мг / 15 мл)
      .
    • В стакан «2» долейте дистиллированной воды до получения 100 мл раствора.
      Перемешайте содержимое стакана.
    • В итоге в стакане «2» мы получили вторую калибровочную жидкость 1'500 ppm.
      (150 мг / 100 мл = 1'500 мг/л = 1'500 ppm)
      .
  5. Эталонный раствор в стакане «0» больше не понадобится. А калибровочные растворы в стаканах «1» и «2» должны настояться не менее 2 часов.
    Формула: ШПРИЦ = КОНЦЕНТРАЦИЯ * КОЛИЧЕСТВО / ЭТАЛОН
    Эта формула позволяет определить, сколько эталонной жидкости (из стакана «0») нужно взять в шприц для приготовления калибровочной жидкости в любых концентрациях.
    Пример: Нужно создать 100 мл калибровочной жидкости 1'500 ppm из эталонной 10'000 ppm.
      • КОНЦЕНТРАЦИЯ = 1'500 ppm.
      • КОЛИЧЕСТВО = 100 мл.
      • ЭТАЛОН = 10'000 ppm.
      • ШПРИЦ = КОНЦЕНТРАЦИЯ * КОЛИЧЕСТВО / ЭТАЛОН = 1'500 * 100 / 10'000 = 15 мл.

      Этот пример показывает почему на 4 пункте инструкции, для приготовления 100 мл жидкости с концентрацией 1'500 ppm, мы переливали шприцом именно 15 мл эталонного раствора.

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

      Регистры:

      По протоколу 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_S
      0x0005
      ...
      0x00FF
      RESERVED
      адресрегистры DO:
      0x0000HL_DATA
      0x0001CALC_START
      0x0002CALC_STOP
      0x0003
      ...
      0x00FF
      RESERVED
      адресрегистры AI:
      0x00005V
      0x0001V0
      0x0002VOUT
      0x0003VSEN
      0x0004Ro
      0x0005S
      0x0006EC
      0x0007TDS
      0x0008
      ...
      0x00FF
      RESERVED
      адресрегистры AO:
      0x0000FREQUENCY
      0x0001KNOWN_TDS_1
      0x0002KNOWN_TDS_2
      0x0003Ka_L
      0x0004Ka_H
      0x0005Kb
      0x0006STABLE_S
      0x0007UNSTABLE_S
      0x0008CALC_SAVE
      0x0009Kt
      0x000AKp
      0x000Bt
      0x000CT
      0x000DDISPLAY
      0x000E
      ...
      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» - Регистр является флагом ошибки последней калибровки.
        • Устанавливается если калибровка не запустилась, выполнена с ошибкой или прервана.
        • Сбрасывается в начале калибровки.
        • Датчик считает калибровку выполненной с ошибкой, если рассчитанный множитель (Ka) меньше 1,0 или модуль степени (Kb) меньше 0,2. Значит обе калибровочные жидкости были одинаковые. В таком случае результаты калибровки не сохраняются.
      • 0x0001 «STATUS_1» - Регистр является флагом выполнения 1 стадии калибровки.
        • Устанавливается при отпускании кнопки калибровки или установке "Coils" [0x0001] «CALC_START».
        • Сбрасывается при завершении первой стадии калибровки.
        • На первой стадии калибровки датчик ждёт стабилизации показаний электропроводности и если они стабильны в течении 5 секунд, то датчик запоминает среднее напряжение на выходе ОУ.
      • 0x0002 «STAY» - Регистр является флагом ожидания смены калибровочной жидкости.
        • Устанавливается при завершении первой стадии калибровки.
        • Сбрасывается при смене калибровочной жидкости.
        • Датчик определяет смену калибровочной жидкости, если электропроводность есть (щуп погружен в жидкость), она изменилась более чем на 120 ppm и её показания не меняются дольше 5 секунд.
      • 0x0003 «STATUS_2» - Регистр является флагом выполнения 2 стадии калибровки.
        • Устанавливается при сбросе регистра "Discrete Inputs" [0x0002] «STAY».
        • Сбрасывается при завершении второй стадии калибровки.
        • На второй стадии калибровки датчик ждёт стабилизации показаний электропроводности и если они стабильны в течении 5 секунд, то датчик запоминает среднее напряжение на выходе ОУ.
        • Завершается вторая стадия калибровки расчётом коэффициентов для степенной функции.
        • Если рассчитанные значения не выходят за допустимые диапазоны, то они сохраняются в регистры "Holding Registers" [0x0003-0x0004] «Ka» и "Holding Registers" [0x0005] «Kb», иначе устанавливается регистр ошибки калибровки "Discrete Inputs" [0x0000] «CALC_ERR».
      • 0x0004 «STABLE_S» - Регистр является флагом нормализации электропроводности.
        • Устанавливается если показания электропроводности стабильны.
          Стабильными считаются показания электропроводности, если их среднее значение за последние 10 секунд не сместилось на процент допустимой флуктуации указанный в регистре "Holding Registers" [0x0006] «STABLE_S».
        • Сбрасывается если показания электропроводности не стабильны (растут или падают).
          Нестабильными считаются показания электропроводности, если их среднее значение за последние 10 секунд сместилось на процент высокой флуктуации указанный в регистре "Holding Registers" [0x0007] «UNSTABLE_S».
        • Когда датчик в процессе калибровки ждёт стабилизации показаний, он ждёт установки данного регистра.

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

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

      • 0x0000 «HL_DATA» - Регистр включения индикатора обнаружения устройства.
          Индикатор обнаружения устройства, это светодиод разъема RJ45.
        • Установка регистра в «1» приведёт к постоянному свечению индикатора.
        • Сброс регистра в «0» отключит индикатор, он будет информировать о получении запросов.
        • Значение по умолчанию: 0.
      • 0x0001 «CALC_START» - Регистр запуска калибровки.
        • Установка регистра в «1» приведёт к запуску калибровки, как при нажатии на кнопку.
        • Сброс регистра в «0» осуществляется автоматически, информируя о начале калибровки.
        • Запись нужно разрешить регистром "Holding Registers" [0x0008] «CALC_SAVE».
        • Значение по умолчанию: 0.
      • 0x0002 «CALC_STOP» - Регистр отмены калибровки (если она запущена).
        • Установка регистра в «1» приведёт к отмене калибровки, как при нажатии на кнопку.
        • Сброс регистра в «0» осуществляется автоматически, информируя о отмене калибровки.
        • Запись нужно разрешить регистром "Holding Registers" [0x0008] «CALC_SAVE».
        • Значение по умолчанию: 0.
        • Регистр доступен только в модулях версии 3 и выше.
      • 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» - Регистр содержит напряжение виртуального ноля (Vo) поданного на вход ОУ.
        Значение хранится в десятитысячных долях В ( 0,0000...6,5535 В ).
        Эталонное значение: 0,5Vcc = 0,5*3,3 = 1,65 В.
      • 0x0002 «VOUT» - Регистр содержит напряжение на выходе усилителя (Vout).
        Значение хранится в десятитысячных долях В ( 0,0000...6,5535 В ).
        Допустимые значения: 0...3,3 В.
      • 0x0003 «VSEN» - Регистр содержит напряжение (Vsens) поданное на вход щупа.
        Это значение считывается датчиком при положительной полуволне меандра.
        Значение хранится в десятитысячных долях В ( 0,0000...6,5535 В ).
        Допустимые значения: 0,5Vcc...0,6Vcc = 1,65...1,98 В.
        Примечание: Датчик постоянно корректирует амплитуду Vsens. Чем выше сопротивление жидкости, тем больше амплитуда напряжения Vsens используемого для измерений.
      • 0x0004 «Ro» - Регистр содержит общее измеренное сопротивление между выводами щупа.
        Значение хранится в дека Ом ( 0...65'535 даОм ). 1 даОм = 10 Ом.
        Ro = Rooc * (Vsen-Vo) / (Vo-Vout), где Rooc - сопротивление ООС ОУ = 4,7 кОм.
      • 0x0005 «S» - Регистр содержит рассчитанную удельную электропроводность.
        Значение хранится в мкСм/см ( 0...65'535 мкСм/см ).
        S = Ka * Vout-Kb (мкСм/см), где Ka и Kb - коэффициенты степенной функции.
        Значение Vout доступно из регистра "Input Registers" [0x0001] «VOUT».
        Значение Ka доступно из регистров "Holding Registers" [0x0003-0x0004] «Ka».
        Значение Kb доступно из регистра "Holding Registers" [0x0005] «Kb».
      • 0x0006 «EC» - Регистр содержит приведённую удельную электропроводность.
        Значение хранится в мкСм/см ( 0...65'535 мкСм/см ).
        Удельная электропроводность (S) сильно зависит от температуры (t). Чем выше температура жидкости, тем выше её электрическая проводимость. По этому удельную электрическую проводимость (S) измеряют при любой температуре t (°С), а затем приводят результат к опорной температуре T (°С) получая приведённую удельную электропроводность (EC).
        EC = S / ( 1 + Kt * (t-T) ), где Kt - температурный коэффициент исследуемой жидкости.
        EC показывает каким будет S если измерения провести не при t (°С), а при T (°С).
        Значение Kt доступно из регистра "Holding Registers" [0x0009] «Kt».
        Значение t нужно указывать в регистр "Holding Registers" [0x000B] «t».
        Значение T доступно из регистра "Holding Registers" [0x000C] «T».
      • 0x0007 «TDS» - Регистр содержит рассчитанное количество растворённых твердых веществ.
        Значение хранится в ppm ( 0...65'535 ppm ).
        TDS = EC * Kp, где EC - электропроводность в мкСм/см, Kp - коэффициент пересчёта.
        Значение Kp доступно из регистра "Holding Registers" [0x000A] «Kp».

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

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

      • 0x0000 «FREQUENCY» - Регистр установки частоты переменного тока.
        • Значение хранится в Гц ( 50...5'000 Гц ) в энергонезависимой памяти.
        • Запись нужно разрешить регистром "Holding Registers" [0x0008] «CALC_SAVE».
        • После записи нового значения, датчик будет занят около 50 миллисекунд.
        • После изменения частоты, необходимо выполнить калибровку.
        • Использование переменного тока при измерении электрического сопротивления жидкости снижает эффект поляризации при проведении этих измерений.
        • Значение по умолчанию: 2'000 Гц.
      • 0x0001 «KNOWN_TDS_1» - Регистр минерализации первой калибровочной жидкости.
        • Значение хранится в ppm ( 0...65'535 ppm ) в энергонезависимой памяти.
        • Запись нужно разрешить регистром "Holding Registers" [0x0008] «CALC_SAVE».
        • После записи нового значения, датчик будет занят около 50 миллисекунд.
        • Регистр позволяет использовать для калибровки любые жидкости и известным ppm.
        • Значение регистра используется в расчётах результата калибровки, оно должно отличаться от значения следующего регистра не менее чем на 200 ppm (в любую сторону).
        • Значение по умолчанию: 500 ppm.
      • 0x0002 «KNOWN_TDS_2» - Регистр минерализации второй калибровочной жидкости.
        • Значение хранится в ppm ( 0...65'535 ppm ) в энергонезависимой памяти.
        • Запись нужно разрешить регистром "Holding Registers" [0x0008] «CALC_SAVE».
        • После записи нового значения, датчик будет занят около 50 миллисекунд
        • Регистр позволяет использовать для калибровки любые жидкости и известным ppm.
        • Значение регистра используется в расчётах результата калибровки, оно должно отличаться от значения предыдущего регистра не менее чем на 200 ppm (в любую сторону).
        • Значение по умолчанию: 1'500 ppm.
      • 0x0003-0x0004 «Ka» - Регистры хранят множитель степенной функции для расчёта S.
        • Значение хранится в тысячных долях ( 0...4'294'967,296 ) в энергонезависимой памяти.
        • Запись нужно разрешить регистром "Holding Registers" [0x0008] «CALC_SAVE».
        • После записи нового значения, датчик будет занят около 50 миллисекунд.
        • Значение регистров перезаписывается по результатам калибровки.
        • Старший байт хранится по адресу 0x0004, а младший 0x0003.
        • Значение используется для расчёта удельной электропроводности S = Ka * Vout-Kb.
        • Значение по умолчанию: 500,000.
      • 0x0005 «Kb» - Регистр хранит модуль степени степенной функции для расчёта S.
        • Значение хранится в тысячных долях ( 0...65,535 ) в энергонезависимой памяти.
        • Запись нужно разрешить регистром "Holding Registers" [0x0008] «CALC_SAVE».
        • После записи нового значения, датчик будет занят около 50 миллисекунд.
        • Значение регистра перезаписывается по результатам калибровки.
        • Значение используется для расчёта удельной электропроводности S = Ka * Vout-Kb.
        • Значение по умолчанию: 5,000.
      • 0x0006 «STABLE_S» - Регистр хранит процент допустимой флуктуаций проводимости.
        • Значение хранится в десятых долях ( 0,1...100,0 ) в энергонезависимой памяти.
        • Запись нужно разрешить регистром "Holding Registers" [0x0008] «CALC_SAVE».
        • После записи нового значения, датчик будет занят около 50 миллисекунд.
        • Если среднее значение удельной электропроводности за последние 10 секунд не сместилось на процент указанный в данном регистре, то показания считаются стабильными, устанавливается флаг "Discrete Inputs" [0x0004] «STABLE_S».
        • Значение по умолчанию: 0,5 %.
      • 0x0007 «UNSTABLE_S» - Регистр хранит процент высокой флуктуаций проводимости.
        • Значение хранится в десятых долях ( 0,1...100,0 ) в энергонезависимой памяти.
        • Запись нужно разрешить регистром "Holding Registers" [0x0008] «CALC_SAVE».
        • После записи нового значения, датчик будет занят около 50 миллисекунд.
        • Если среднее значение удельной электропроводности за последние 10 секунд сместилось на процент указанный в данном регистре, то показания считаются нестабильными, сбрасывается флаг "Discrete Inputs" [0x0004] «STABLE_S».
        • Значение по умолчанию: 1,0 %.
      • 0x0008 «CALC_SAVE» - Регистр разрешения записи калибровочных значений.
        • Регистр защищает датчик от случайной записи калибровочных значений.
        • В регистр нужно записать число 0x2709 до записи значений в регистры "Holding Registers" [0x000-0x0007] «FREQUENCY», «KNOWN_TDS_1», «KNOWN_TDS_2», «Ka», «Kb», «STABLE_S», «UNSTABLE_S» и перед запуском калибровки регистром "Coils" [0x0001] «CALC_START».
        • Значение регистра сбрасывается после записи в любой из защищаемых регистров.
        • Значение по умолчанию: 0.
      • 0x0009 «Kt» - Регистр хранит температурный коэффициент жидкости.
        • Значение хранится в десятитысячных долях ( 0...6,5535 ).
        • Значение зависит от химического состава жидкости и берётся из табличных данных.
        • Температурный коэффициент (Kt) используется для приведения удельной электропроводности (S) измеренной при текущей температуре t (°C) к приведённой удельной электропроводности (EC) для опорной температуры T (°С).
        • EC показывает каким будет S если измерения провести на при t (°С), а при T (°С).
        • EC = S / ( 1 + Kt * (t-T) ).
        • Значение по умолчанию: 0,0200 (2%).
      • 0x000A «Kp» - Регистр хранит коэффициент пересчёта.
        • Значение хранится в сотых долях ( 0...655,35 ) и зависит от химического состава жидкости.
        • Чаще всего используют коэффициенты 0.50, 0.64, 0.70.
        • Коэффициент пересчёта (Kp) используется для преобразования приведённой удельной электропроводности (EC) в количество растворённых твёрдых веществ (TDS).
        • TDS = EC * Kp, где EC - электропроводность в мкСм/см.
        • Значение по умолчанию: 0,50 (50%).
      • 0x000B «t» - Регистр получает реальную температуру жидкости.
        • Значение хранится в сотых долях °С ( 0...100,00 °С ).
        • Электропроводность жидкости сильно зависит от её температуры. Чем выше температура жидкости, тем выше её электропроводность. По этому датчику требуется постоянно отправлять реальную температуру жидкости.
        • Зная реальную температуру жидкости (t), температурный коэффициент жидкости (Kt) и измеренную удельную электрическую проводимость жидкости (S), можно узнать какой будет удельная электрическая проводимость той же жидкости (EC) при опорной температуре (T).
        • EC = S / ( 1 + Kt * (t-T) ).
        • Значение по умолчанию: 25 °С.
      • 0x000C «T» - Регистр хранит опорную температуру жидкости.
        • Значение хранится в сотых долях °С ( 0...100,00 °С ).
        • Чаще всего используют температуру 20 °С или 25 °С.
        • Опорная температура жидкости, это та температура при которой её удельную электропроводность (EC) можно умножить на коэффициент пересчёта (Kp) для получения точного количества растворённых твёрдых веществ TDS в этой жидкости.
        • TDS = EC * Kp, где EC - электропроводность в мкСм/см.
        • На практике неудобно доводить жидкость до температуры T (°C) для проведения измерений, по этому удельную электрическую проводимость S измеряют при любой температуре t (°С), а затем приводят результат к опорной температуре T (°С) получая (EC).
        • EC = S / ( 1 + Kt * (t-T) ).
        • Значение по умолчанию: 25 °С.
      • 0x000D «DISPLAY» - Регистр выбора данных для вывода на дисплей датчика.
        • Данный регистр игнорируется датчиком без дисплея.
        • Значение регистра хранится в энергонезависимой памяти.
        • После записи нового значения, датчик будет занят около 50 миллисекунд.
        • Значение регистра определяет, какие данные будут отображаться на дисплее:
        • 0 - Выводить общее сопротивление между выводами щупа (R).
          Значение выводится в Ом целым числом.
        • 1 - Выводить измеренную удельную электропроводность (S).
          Значение выводится в мСм/см с двумя знаками после запятой.
        • 2 - Выводить приведённую удельную электропроводность (EC).
          Значение выводится в мСм/см с двумя знаками после запятой.
        • 3 - Выводить общее количество растворённых твёрдых веществ (TDS).
          Значение выводится в ppm "pro pro mille" целым числом.
        • 4 - Выводить измеренное напряжения питания на шине +5V.
          Значение выводится в В, с тремя знаками после запятой.
        • 5 - Выводить измеренное напряжение виртуального ноля (Vo).
          Значение выводится в В, с тремя знаками после запятой.
        • 6 - Выводить измеренное напряжение на выходе ОУ (Vout).
          Значение выводится в В, с тремя знаками после запятой.
        • 7 - Выводить напряжение на входе щупа при положительной полярности (Vsens).
          Значение выводится в В, с тремя знаками после запятой.
        • Иные значения регистра приведут к выводу надписи "Err.D".
        • Значение по умолчанию: 2 - выводить EC.
      • 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» - С момента подачи питания прошло меньше 3 секунд.
      • Бит 5 «ERR_ADC» - Показания считаны при отрицательной полуволне Vsens.
      • Бит 4 «ERR_Vout» - Высокое напряжение на выходе ОУ (Vout > Vcc).
      • Бит 3 «ERR_Vout» - Низкое напряжение на выходе ОУ (Vout < 0).
      • Бит 2 «ERR_Vo» - Высокое напряжение виртуального ноля (Vo > 1.7В).
      • Бит 1 «ERR_Vo» - Низкое напряжение виртуального ноля (Vo < 1.6В).
      • Бит 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-адрес модуля на шине. По умолчанию для датчика TDS/EC-метра = 0x05.
      • 1 байт. Идентификатор устройства (тип устройства).
        • Для датчика минерализации (TDS/EC-метр) с дисплеем = 0x08.
        • Для датчика минерализации (TDS/EC-метр) без дисплея = 0x0A.
      • 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 позволяют назначать себе адрес на шине, как временно (новый адрес действует пока есть питание), так и постоянно (новый адрес сохраняется в энергонезависимую память и действует даже после отключения питания). Датчики TDS/EC-метров по умолчанию имеют адрес 0x05.

      Допускается указывать адреса от 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 мс.

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

      Следующий скетч выводит приведённую электропроводность (мСм/см) и общее количество растворённых твердых веществ (ppm) в исследуемой жидкости.

      • Шина 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(){                                         //
           int32_t i;                                      //
           delay(1000);                                    //
      //   Читаем регистр "Input Register" [0x0006] «EC»:  //
           i = modbus.inputRegisterRead(5, 6);             // Функция принимает адрес модуля и адрес регистра, возвращает прочитанное значение (0...65535), или -1 при неудаче.
      //   Проверяем и выводим электропроводность:         //
           if( i<0 ){ Serial.println("Error"); }           // Если прочитанное значение i<0, значит чтение выполнено с ошибкой.
           else { Serial.print( (float)i/1000.0f );        // Выводим прочитанное значение преобразовав мкСм/см в мСм/см.
                  Serial.print( " мСм/см.\r\n"   );        // Выводим текст.
           }                                               //
      //   Читаем регистр "Input Register" [0x0007] «TDS»: //
           i = modbus.inputRegisterRead(5, 7);             // Функция принимает адрес модуля и адрес регистра, возвращает прочитанное значение (0...65535), или -1 при неудаче.
      //   Проверяем и выводим минерализацию жидкости:     //
           if( i<0 ){ Serial.println("Error"); }           // Если прочитанное значение i<0, значит чтение выполнено с ошибкой.
           else { Serial.println((String) i+" ppm."); }    // Выводим прочитанное значение в ppm.
      }                                                    //
      

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

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

      Габариты:

      Ссылки:




      Обсуждение

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