Подключение аналоговых датчиков к универсальным входам
Введение в универсальные входы (УВ) контроллеров HI
В современной автоматизации гибкость является ключевым фактором. Универсальный вход (УВ) — это физический порт на контроллере HI, который может быть сконфигурирован для работы с различными типами электрических сигналов. Вместо того чтобы иметь отдельные, жестко специализированные входы для каждого типа датчика (один для температуры, другой для "сухого контакта", третий для аналогового сигнала), универсальный вход позволяет инженеру-инсталлятору адаптировать один и тот же порт под конкретную задачу на объекте. Это значительно упрощает проектирование, складирование оборудования и монтаж.
На контроллерах HI, универсальные входы (обозначенные как UI1, UI2... UI22) являются мощным инструментом, поддерживающим несколько фундаментальных режимов работы.
> 💡 Подсказка: Всегда сверяйтесь с технической документацией на конкретную модель контроллера HI. Расположение и функция джамперов могут незначительно отличаться между ревизиями.
Обзор поддерживаемых режимов
Каждый из 22 универсальных входов контроллера HI может работать в одном из следующих режимов, выбор которого определяется как физической конфигурацией, так и программной настройкой.
| Режим работы | Тип сигнала | Типичные устройства | Принцип работы |
| :--- | :--- | :--- | :--- |
| 0-10В | Аналоговое напряжение | Датчики освещенности, влажности, давления, положения задвижек | Вход измеряет напряжение в диапазоне от 0 до 10 Вольт. Значение напряжения прямо пропорционально измеряемой физической величине. |
| 4-20мА | Аналоговый ток ("токовая петля") | Промышленные датчики давления, расхода, уровня, газоанализаторы | Вход измеряет ток в диапазоне от 4 до 20 миллиампер. Этот стандарт высокоустойчив к помехам и позволяет диагностировать обрыв (ток падает до 0 мА). |
| NTC/Резистивный | Сопротивление | NTC-термисторы (датчики температуры), фоторезисторы | Вход измеряет сопротивление подключенного пассивного элемента. Для NTC-термисторов это позволяет точно определять температуру. |
| "Сухой контакт" | Дискретный | Кнопки, выключатели, герконы, реле, выходы датчиков движения | Вход определяет два состояния: замкнуто (низкое сопротивление) или разомкнуто (высокое сопротивление). |
Физическая конфигурация УВ с помощью джамперов
Для переключения режима работы аналоговой части универсального входа используются джамперы — небольшие перемычки, расположенные на печатной плате контроллера рядом с клеммной колодкой входов.
Каждый универсальный вход (или группа входов) имеет свой джампер, который позволяет выбрать между режимом измерения напряжения (`VOLT`) и режимом измерения тока (`AMP`).
- Режим 0-10В: Для работы с датчиками напряжения джампер должен быть установлен в положение, соответствующее измерению напряжения. В этом режиме входное сопротивление контроллера очень высокое, что позволяет ему измерять напряжение, не оказывая влияния на цепь датчика.
Программная настройка режима
После того как физическая конфигурация входа выполнена с помощью джампера, необходимо указать контроллеру, как интерпретировать данные с этого входа. Это делается в среде разработки HI, как правило, в настройках узла Node-RED, отвечающего за чтение данных с универсальных входов. Здесь вы указываете тип датчика (0-10V, 4-20mA, NTC 10K и т.д.), что позволяет программному обеспечению применить правильные алгоритмы первичной обработки.
Эта двухуровневая система (физические джамперы + программная настройка) обеспечивает максимальную гибкость и защиту от ошибок конфигурации.
---
Схемы подключения аналоговых датчиков
Правильное физическое подключение — залог точных и стабильных измерений. Ошибки, допущенные на этом этапе, являются наиболее частой причиной проблем в системах автоматизации.
> ⚠️ Внимание: Подключение датчика 4-20мА без соответствующего внешнего источника питания или с неверной схемой может привести к выходу из строя как самого датчика, так и аналогового входа контроллера.
Ниже приведены стандартные схемы подключения для основных типов аналоговых датчиков к универсальным входам (УВ) контроллера HI.
Подключение датчика с выходом 0-10В
Это наиболее простая схема, требующая трех проводов.
- Устройства: Датчики освещенности, качества воздуха (VOC), некоторые модели датчиков влажности.
- Провода:
2. Общий (GND): Объединяет "минус" блока питания и клемму GND универсального входа контроллера.
3. Сигнальный (Out/Signal): Подключается непосредственно к клемме УВ (например, UI5).
- ASCII-схема (`WIRING-SENS-VOLT-001`):
//========= Схема подключения датчика 0-10В (например, освещенности) =========
[PSU: 24VDC] (Датчик 0-10V) [Контроллер HI]
+24V <-------------> VIN
GND <---+---------> GND
|
'-----------+------------------> GND (на клемме УВ)
|
(Сигнал) Out '------------------> UI5
Подключение датчика с выходом 4-20мА (Токовая петля)
Датчики "токовой петли" требуют более внимательного подхода, так как они активно формируют ток в цепи, для чего им нужен внешний источник питания.
Схема для 2-проводного датчика
В этой схеме питание и сигнал передаются по одной и той же паре проводов. Датчик включается в разрыв цепи последовательно с источником питания и входом контроллера.
- ASCII-схема (`WIRING-SENS-AMP-2WIRE-001`):
//====== Схема подключения 2-проводного датчика 4-20мА (последовательная цепь) ======
[PSU: 24VDC] [Контроллер HI]
+24V ----(+)---> (Датчик +)
(Датчик -) ----(-)---> UI6
GND <----------------------------------------- GND (на клемме УВ)
Логика цепи: Ток выходит из `+` блока питания, проходит через датчик, входит в универсальный вход контроллера `UI6` (на котором джампером включен шунтирующий резистор), и возвращается на `GND` блока питания через общий проводник `GND` контроллера.
Схема для 4-проводного датчика
Такие датчики имеют отдельные клеммы для питания и для сигнальной петли. Это упрощает подключение.
- ASCII-схема (`WIRING-SENS-AMP-4WIRE-001`):
//========= Схема подключения 4-проводного датчика 4-20мА =========
[PSU: 24VDC] (Датчик 4-20мА, 4-пров.) [Контроллер HI]
+24V <-----------> V+ (Питание)
GND <-----------> GND (Питание)
I_Out+ (Сигнал) --------> UI7
I_Out- (Сигнал) --------> GND (на клемме УВ)
Подключение пассивных резистивных датчиков (NTC)
Пассивные датчики не требуют внешнего питания. Контроллер сам подает на них небольшой измерительный ток и определяет сопротивление.
- Устройства: NTC-термисторы (10K, 12K и т.д.), фоторезисторы.
- Схема: Простое двухпроводное подключение. Полярность не имеет значения.
- ASCII-схема (`WIRING-SENS-NTC-001`):
//========= Схема подключения NTC-термистора =========
(NTC-датчик 10K) [Контроллер HI]
Вывод 1 <------------------------------> UI8
Вывод 2 <------------------------------> GND (на клемме УВ)
Типичные ошибки подключения
- "Плавающая земля": Отсутствие общего провода (GND) между блоком питания датчика и контроллером. Это приводит к нестабильным, случайным показаниям, так как у сигналов нет общей точки отсчета.
- Неверная полярность: Актуально для датчиков 0-10В и 4-20мА. Перепутанные `+` и `-` могут привести к выходу датчика из строя.
- Отсутствие внешнего БП для датчиков 4-20мА: Датчик просто не включится, и ток в петле будет равен нулю.
---
Работа с "сырыми" данными АЦП в Node-RED
После физического подключения и конфигурации джамперов следующим шагом является получение данных в программной среде контроллера. Для этого в кастомизированной сборке Node-RED для платформы HI используется специальный узел `hi-universal-input`.
Этот узел является мостом между аппаратной частью контроллера (его аналого-цифровым преобразователем - АЦП) и логикой ваших потоков автоматизации. Как мы рассматривали в предыдущем уроке, АЦП преобразует непрерывный аналоговый сигнал (напряжение или ток) в дискретное цифровое значение.
Обзор узла `hi-universal-input`
`hi-universal-input` — это узел-источник. Он не имеет входов и периодически генерирует сообщения, содержащие текущее значение, считанное с выбранного универсального входа.
Конфигурация узла
Панель настроек узла `hi-universal-input` предельно проста и содержит ключевые параметры:
- Name: Имя узла в потоке (например, "Датчик освещенности в гостиной").
- Канал (Channel): Номер универсального входа, с которого нужно считывать данные (от 1 до 22).
- Интервал опроса (Poll Interval): Как часто узел будет считывать данные и отправлять сообщение. Задается в секундах.
- Режим (Mode): Программный выбор типа подключенного датчика (0-10V, 4-20mA, NTC 10K и т.д.). Этот выбор влияет на внутренние коэффициенты преобразования.
Анализ выходного сообщения (`msg`)
При каждом срабатывании `hi-universal-input` отправляет на свой выход стандартный объект `msg`. Ключевая информация содержится в `msg.payload`. Для аналоговых режимов (0-10V, 4-20mA) `payload` будет содержать целочисленное значение, напрямую полученное от АЦП.
Например, контроллер HI оснащен 12-битным АЦП. Это означает, что он может представить аналоговый сигнал в виде одного из 2^12 = 4096 уровней.
> 📋 Ключевые понятия:
> * "Сырые" данные (Raw Data): Необработанное целочисленное значение от АЦП (например, от `0` до `4095`). Эти числа часто называют "попугаями", так как они не имеют прямого физического смысла без дальнейшего преобразования.
Предположим, мы считываем данные с датчика 0-10В.
- Если на входе 0В, АЦП выдаст значение, близкое к 0.
- Если на входе 10В, АЦП выдаст значение, близкое к 4095.
- Если на входе 5В, АЦП выдаст значение, близкое к 2047.
Выходное сообщение узла будет выглядеть следующим образом:
{
"payload": 2047,
"topic": "hi/input/ui5/raw",
"_msgid": "a1b2c3d4.e5f6g7"
}
Влияние интервала опроса
Выбор интервала опроса — это компромисс между отзывчивостью системы и нагрузкой на контроллер.
- Короткий интервал (например, 1 секунда): Система будет очень быстро реагировать на изменения (например, мгновенно включать свет при увеличении освещенности). Однако это создаст постоянный поток сообщений, незначительно увеличивая нагрузку на CPU и генерируя трафик в MQTT, если эти "сырые" данные куда-то отправляются.
- Длинный интервал (например, 60 секунд): Идеально подходит для медленно меняющихся параметров, таких как температура в комнате. Это снижает нагрузку на контроллер и экономит ресурсы. Однако для быстро меняющихся процессов такой интервал неприемлем.
Золотое правило — выбирать интервал, соответствующий инертности измеряемого физического процесса.
---
Линейная нормализация: от "попугаев" к физическим величинам
Получать "сырые" значения `2047` или `3150` от АЦП неудобно и неинформативно. Для построения логики, отображения на панелях управления и ведения архивов нам нужны реальные физические величины: Вольты, градусы Цельсия, Люксы, проценты влажности.
Процесс преобразования "сырого" значения АЦП в осмысленную физическую величину называется нормализацией.
Для датчиков с линейной зависимостью, таких как 0-10В и 4-20мА, применяется линейная нормализация. Это простое математическое сопоставление двух диапазонов.
Математическая основа
В основе лежит уравнение прямой: `Y = aX + b`, где:
- `X` — это входное значение (наше "сырое" значение от АЦП).
- `Y` — это выходное, нормализованное значение (физическая величина).
- `a` — это коэффициент масштабирования (наклон прямой).
- `b` — это смещение.
Наша задача — найти `a` и `b`, зная две точки на графике. Этими точками являются границы диапазонов.
Пример:Допустим, у нас есть датчик освещенности с рабочим диапазоном 0-1000 Люкс, который выдает сигнал 0-10В. Контроллер имеет 12-битный АЦП.
Нам нужно сопоставить два диапазона:
- Диапазон АЦП (вход): от `0` до `4095`.
- Диапазон датчика (выход): от `0` до `1000` Люкс.
Составим систему уравнений:
Таким образом, формула нормализации для этого датчика: `Люксы = 0.2442 * [Значение АЦП]`.
Если бы датчик работал в диапазоне 4-20мА, АЦП мог бы выдавать значения, например, от `819` (соответствует 4мА) до `4095` (соответствует 20мА). Тогда расчеты были бы немного сложнее, но принцип остался бы тем же — сопоставление двух известных точек.
> 🔗 Связанный материал: Для нелинейных датчиков, таких как NTC-термисторы, используется более сложный подход с использованием таблиц соответствия (lookup tables) или формулы Стейнхарта-Харта. Это будет подробно рассмотрено в уроке `COURSE-04-M04-L04`.
К счастью, в Node-RED нет необходимости вычислять эти коэффициенты вручную. Для этого существует стандартный узел `range`.
---
Практикум: Нормализация данных с помощью ноды `range`
Узел `range` является стандартным инструментом Node-RED для выполнения линейного масштабирования значений. Он идеально подходит для задачи нормализации данных с аналоговых датчиков.
Давайте создадим поток, который считывает "сырые" данные с датчика освещенности и преобразует их в Люксы.
Задача: Датчик освещенности 0-1000 Люкс подключен к универсальному входу UI5. Контроллер имеет 12-битный АЦП (0-4095).Пошаговое руководство
* ASCII-схема потока (`FLOW-AUTO-SENS-001`):
[hi-universal-input]---->[range]---->[debug]
* Name: `Датчик освещенности Гостиная (RAW)`
* Канал: `5`
* Интервал опроса: `10` секунд.
* Режим: `0-10V`.
* Откройте панель настроек узла `range`.
* Action: `Scale and map to the destination range`.
* Input range (диапазон входа):
* `from`: `0`
* `to`: `4095`
(Это диапазон "сырых" значений нашего 12-битного АЦП).
* Output range (диапазон выхода):
* `from`: `0`
* `to`: `1000`
(Это диапазон физических величин нашего датчика, в Люксах).
* Оставьте опцию `Round result to the nearest integer` неактивной, чтобы получать дробные значения для большей точности.
* Output: `complete msg object`. Это позволит нам увидеть, как изменился `msg.payload`.
Проверка результата
Теперь откройте боковую панель Debug. Каждые 10 секунд вы будете видеть сообщение.
- Допустим, `hi-universal-input` отправил сообщение со значением `3071`:
// Сообщение, ВХОДЯЩЕЕ в узел range
{
"payload": 3071,
"topic": "hi/input/ui5/raw",
...
}
- Узел `range` выполнит преобразование:
- Узел `debug` покажет результат ПОСЛЕ узла `range`: `msg.payload` теперь содержит корректное физическое значение.
// Сообщение, ВЫХОДЯЩЕЕ из узла range
{
"payload": 750,
"topic": "hi/input/ui5/raw",
...
}
Теперь это значение (`750 Люкс`) можно использовать в логике (например, "если освещенность < 100 Люкс, включить свет"), отправлять по MQTT в систему верхнего уровня или сохранять в базу данных MySQL для построения графиков.
Чтобы сделать поток завершенным в соответствии со стандартами Академии, добавим форматирование сообщения по "Контракту сообщения".
// Вставьте узел Function после узла range
// Код для узла Function:
let lux = msg.payload;
// Формируем исходящее сообщение по контракту
msg.payload = {
"value": parseFloat(lux.toFixed(2)), // Округляем до 2 знаков
"unit": "Lux",
"source": "light-sensor-livingroom-01",
"ts": Date.now()
};
msg.topic = "telemetry/livingroom/light_level";
return msg;
Теперь наш поток не просто измеряет и нормализует данные, но и приводит их к стандартному, документированному виду, готовому для интеграции с остальной системой.
---
Итоги и рекомендации
В этом уроке мы прошли полный путь от физического подключения аналогового датчика до получения осмысленных, нормализованных данных в среде Node-RED.
Краткое повторение процесса:
Ключевой вывод этого урока — разница между "сырыми" и нормализованными данными. Профессиональная система автоматизации всегда должна оперировать нормализованными, физически осмысленными величинами. Это делает логику понятной, а систему — легко поддерживаемой и масштабируемой.
Важность правильного выбора схемы подключения и конфигурации входа нельзя переоценить. Ошибка на этом "физическом" уровне сделает все последующие программные ухищрения бесполезными.
Что дальше
Мы освоили работу с линейными датчиками. Однако существует огромный класс очень популярных датчиков, которые имеют нелинейную характеристику — NTC-термисторы для измерения температуры. Простое масштабирование с помощью узла `range` для них не подходит.
В следующем уроке, `COURSE-04-M04-L04`, мы подробно разберем:
- Принцип работы NTC-термисторов.
- Почему их характеристика нелинейна (кривая Стейнхарта-Харта).
- Как выполнять нелинейную нормализацию в Node-RED с помощью таблиц соответствия (lookup tables) и узла `function`.