Обзор универсальных входов контроллера: DI, AI, 1-Wire
Архитектура универсальных входов контроллеров HI
В основе гибкости и экономической эффективности современных систем автоматизации лежит концепция универсальности. Контроллеры платформы HI оснащены набором универсальных входов (UI - Universal Inputs), которые являются ключевым элементом для подключения широкого спектра периферийных устройств. Эти порты спроектированы таким образом, чтобы инсталлятор мог на программном уровне определять их режим работы, адаптируя один и тот же физический порт под разные типы задач.
На корпусе контроллера HI вы найдете 22 таких порта, обычно сгруппированных в блоки и промаркированных как `UI-01`, `UI-02` и так далее. Физически каждый порт представляет собой клеммную колодку для подключения двух или трёх проводов. Однако его истинный потенциал раскрывается в программной среде, например, в Node-RED, где вы можете назначить одному и тому же порту `UI-05` роль считывателя кнопки сегодня, а завтра переконфигурировать его для работы с датчиком освещенности.
> ℹ️ Информация: На контроллерах HI универсальные входы обычно маркируются как 'UI' (Universal Input). Каждый порт может быть индивидуально сконфигурирован в программном обеспечении. Эта унификация позволяет использовать один тип контроллера для множества различных сценариев на объекте, сокращая номенклатуру необходимого оборудования и упрощая складские запасы.
Эта программно-определяемая природа входов позволяет им функционировать в трех основных режимах, которые покрывают подавляющее большинство задач в автоматизации зданий:
Выбор режима для каждого входа `UI` является первым и фундаментальным шагом при проектировании схемы подключений и разработке логики в Node-RED. Неправильная конфигурация режима не просто приведет к некорректным данным, но и может создать риск для подключенного оборудования.
---
Дискретные входы (DI): работа с 'сухими контактами'
Режим дискретного входа (DI) — самый простой и один из самых распространенных в автоматизации. Он предназначен для определения одного из двух состояний: есть контакт или нет. Основой для этого режима служит مفهوم «сухого контакта» (Dry Contact).
Принцип работы 'сухого контакта'
«Сухой контакт» — это выход на устройстве (например, датчике или кнопке), который представляет собой простое реле или переключатель, не имеющий собственного источника питания. Он не выдает никакого напряжения; его задача — лишь замыкать или размыкать предоставленную ему внешнюю цепь. В нашем случае эту цепь предоставляет контроллер HI.
Когда вы конфигурируете порт `UI` в режим `DI`, контроллер активирует на нем так называемую внутреннюю подтяжку (pull-up). Это означает, что контроллер подает на вход небольшое напряжение (например, +3.3В или +5В) через резистор. Далее логика проста:
- Контакт разомкнут: Ничто не мешает слабому току от подтяжки поступать на измерительную схему входа. Контроллер видит высокое напряжение и интерпретирует это состояние как логическую `1` или `true`.
- Контакт замкнут: При замыкании «сухого контакта» (например, при нажатии кнопки) входной порт замыкается на общий провод (GND). Ток начинает течь по пути наименьшего сопротивления на землю, и напряжение на входе падает почти до нуля. Контроллер видит низкое напряжение и интерпретирует это как логический `0` или `false`.
> 💡 Подсказка: Из-за использования внутренней подтяжки логика работы DI-входа инвертирована относительно бытового понимания:
> * Кнопка не нажата (контакт разомкнут) → `msg.payload` будет `true`.
> * Кнопка нажата (контакт замкнут) → `msg.payload` будет `false`.
> Это необходимо учитывать при построении логики в Node-RED, часто используя узел `Switch` для проверки на `false`, чтобы запустить действие.
Типичные устройства для DI
Этот режим идеально подходит для множества устройств, передающих бинарные сигналы:
- Кнопки и выключатели: Любые кнопочные посты и настенные выключатели без фиксации.
- Герконы (магнитоконтактные датчики): Устанавливаются на окна и двери для определения статуса «открыто/закрыто».
- Датчики протечки воды: Простейшие модели имеют два электрода, которые замыкаются при попадании на них воды.
- Датчики движения: Многие модели имеют релейный выход типа «сухой контакт», который замыкается при обнаружении движения.
- Выходы реле другого оборудования: Сигналы «Авария» или «Работа» от котлов, вентиляционных установок, ИБП.
Пример сообщения, которое генерирует DI-вход `UI-08`, подключенный к геркону на входной двери, при её открытии (размыкание контакта):
{
"payload": true,
"topic": "hi/inputs/ui-08/state",
"source": "UI-08",
"ts": 1678890000000,
"meta": {
"type": "DI",
"description": "Main Door Reed Switch"
}
}
---
Аналоговые входы (AI): измерение непрерывных сигналов
В отличие от дискретных входов, которые работают по принципу «да/нет», аналоговые входы (AI) предназначены для измерения плавно изменяющихся физических величин. Они переводят аналоговый электрический сигнал, обычно напряжение, в цифровое значение, которое может обработать контроллер. Это позволяет системе не просто знать, что свет включен, а понимать, на какой он яркости; не просто, что клапан открыт, а на сколько процентов.
Стандарт 0-10В
Самым распространенным в автоматизации зданий является стандарт аналогового сигнала 0-10В. Он прост, надежен и интуитивно понятен:
- 0В на входе соответствует минимальному значению измеряемой величины (например, 0% яркости, 0°C, закрытый клапан).
- 10В на входе соответствует максимальному значению (100% яркости, 100°C, полностью открытый клапан).
- Промежуточные значения напряжения (например, 5В) линейно соответствуют промежуточным значениям величины (50%).
Этот стандарт широко применяется в:
- Датчиках освещенности, влажности, CO2, давления.
- Промышленных датчиках с нормированным выходом.
- Обратной связи от сервоприводов клапанов и заслонок.
- Подключении потенциометров для ручной регулировки (например, настенный диммер).
АЦП (Аналогово-цифровой преобразователь)
сердцем любого аналогового входа является АЦП (ADC). Эта микросхема измеряет напряжение на клемме `UI` и преобразует его в число. Разрешение АЦП определяет, на сколько шагов будет разбит диапазон напряжения. Например, 10-битный АЦП, который часто используется в контроллерах, делит диапазон 0-10В на 210 = 1024 шага.
- При напряжении 0В на входе АЦП выдаст значение `0`.
- При напряжении 10В на входе АЦП выдаст значение `1023`.
- При напряжении 5В АЦП выдаст значение `511` или `512`.
Это «сырое» (raw) значение `0-1023` само по себе не несет физического смысла. Задача инженера — преобразовать его в понятную величину (проценты, градусы, ppm) с помощью процесса, который называется нормализация сигнала.
> ⚠️ Внимание: Превышение максимального допустимого напряжения (обычно 12В) на аналоговом входе может необратимо повредить контроллер. Всегда проверяйте характеристики подключаемого оборудования и убедитесь, что его выходной диапазон напряжений не превышает допустимый для входа `UI` контроллера. Для защиты от случайных всплесков напряжения рекомендуется использовать внешние модули защиты.
---
Практика: Нормализация аналогового сигнала в Node-RED
Рассмотрим реальную задачу: на объекте установлен датчик освещенности с выходом 0-10В, подключенный к `UI-12`. Нам нужно преобразовать «сырые» данные от АЦП в понятные проценты освещенности (от 0% до 100%) для дальнейшего использования в логике управления светом.
Считывание сырого (raw) значения
Предположим, наш `UI-12` сконфигурирован в режим `AI`. Специальный узел в Node-RED (например, `hi-input`) будет периодически опрашивать этот порт и отправлять в поток сообщение с сырым значением от 10-битного АЦП.
В полной темноте датчик выдает 0В, и `msg.payload` будет равен `0`. При ярком дневном свете датчик выдаст 10В, и `msg.payload` станет `1023`. В сумерках напряжение составит, например, 2.5В, и узел отправит сообщение:
{
"payload": 256,
"source": "UI-12"
}
Это значение `256` нужно преобразовать.
Использование узла `Range` для масштабирования
Для нормализации сигналов в Node-RED существует идеальный инструмент — узел `Range`. Он позволяет линейно отобразить один числовой диапазон на другой.
Пошаговая инструкция:* `от`: `0`
* `до`: `1023`
(Это соответствует диапазону нашего 10-битного АЦП).
* `от`: `0`
* `до`: `100`
(Это наш желаемый диапазон в процентах).
Теперь, когда на вход узла `Range` придет `msg.payload` со значением `256`, на выходе мы получим новое сообщение, где `msg.payload` будет равен примерно `25`.
ASCII-схема потока: +----------------------+
(Сырое значение 0-1023) | Узел "Range" | (Нормализованное значение 0-100)
[hi-input: UI-12] -------> | Вход: 0-1023 | -------> [Debug / Logic]
| Выход: 0-100 |
+----------------------+
Альтернатива: Узел `Function`
Для более сложных преобразований (нелинейных, с использованием формул) можно использовать узел `Function`. Код для выполнения той же задачи будет выглядеть так:
// Входное сообщение msg.payload содержит сырое значение от АЦП (0-1023)
const rawValue = msg.payload;
const minRaw = 0;
const maxRaw = 1023;
const minTarget = 0;
const maxTarget = 100;
// Простая линейная интерполяция
let normalizedValue = ((rawValue - minRaw) * (maxTarget - minTarget)) / (maxRaw - minRaw) + minTarget;
// Округляем до целого числа
normalizedValue = Math.round(normalizedValue);
// Ограничиваем результат границами
if (normalizedValue < minTarget) {
normalizedValue = minTarget;
}
if (normalizedValue > maxTarget) {
normalizedValue = maxTarget;
}
// Формируем новое сообщение по контракту
msg.payload = {
"value": normalizedValue,
"unit": "%",
"source": "light-sensor-office",
"ts": Date.now()
};
node.status({fill:"green", shape:"dot", text: normalizedValue + " %"});
return msg;
Этот подход дает больше контроля, но для простых линейных преобразований узел `Range` является предпочтительным из-за своей наглядности и простоты.
---
Шина 1-Wire: Подключение и адресация цифровых датчиков
Режим шины 1-Wire — это мощная технология, позволяющая общаться с множеством цифровых устройств, используя всего один порт `UI` и общую трехпроводную линию (Питание, Земля, Данные). Название «1-Wire» немного вводит в заблуждение, так как для надежной работы требуется как минимум два провода (Данные и Земля), а в профессиональных инсталляциях — три.
Принцип работы шины
В отличие от аналоговых датчиков, которые выдают изменяющееся напряжение, устройства 1-Wire общаются с контроллером (который выступает в роли мастера) цифровыми пакетами данных. Контроллер отправляет по шине запрос, адресованный конкретному устройству, и это устройство отправляет ответ. Все остальные устройства на шине («ведомые») игнорируют запрос, не предназначенный для них.
> 💡 Подсказка: Для стабильной работы шины 1-Wire избегайте 'звездообразной' топологии, где кабели от всех датчиков сходятся в одной точке. Наилучший вариант — линейная топология («гирлянда»), где кабель последовательно идет от одного датчика к другому. Длина ответвлений от основной магистрали до датчика должна быть минимальной (не более 1-2 метров).
Уникальный 64-битный адрес
Ключ к работе 1-Wire — это уникальный 64-битный адрес, который «зашит» в каждый датчик на заводе-изготовителе. Этот адрес не повторяется никогда. Именно он позволяет мастеру-контроллеру безошибочно обращаться к конкретному датчику, даже если на одной шине их подключено несколько десятков.
При первом сканировании шины контроллер обнаруживает все подключенные устройства и составляет список их уникальных адресов. Адрес обычно выглядит как строка из 12 шестнадцатеричных символов, предваряемая семейным кодом. Например, для самого популярного датчика DS18B20 семейный код — `28`.
# Пример вывода команды сканирования шины в Linux-консоли контроллера
$ ls /sys/bus/w1/devices/
28-01203b4a5c6d 28-01203b5b7e8f w1_bus_master1
Здесь мы видим два датчика с адресами `28-01203b4a5c6d` и `28-01203b5b7e8f`.
Датчик температуры DS18B20
Самым распространенным устройством 1-Wire является цифровой датчик температуры DS18B20. Он завоевал популярность благодаря своей низкой стоимости, достаточной точности (±0.5°C) и простоте подключения.
Для считывания температуры в Linux-системе контроллера HI достаточно прочитать содержимое специального файла, связанного с адресом датчика:
# Чтение данных с датчика 28-01203b4a5c6d
$ cat /sys/bus/w1/devices/28-01203b4a5c6d/w1_slave
Вывод команды будет примерно таким:
79 01 4b 46 7f ff 0c 10 1a : crc=1a YES
79 01 4b 46 7f ff 0c 10 1a t=23562
- `YES` в первой строке означает, что данные прочитаны корректно (проверка целостности CRC пройдена).
- `t=23562` во второй строке — это и есть температура, умноженная на 1000. То есть, реальная температура составляет 23.562 °C.
В Node-RED существуют специальные узлы, которые автоматизируют этот процесс, позволяя просто указать адрес датчика и получать готовое значение температуры в `msg.payload`.
Паразитное питание: Технология 1-Wire позволяет датчикам работать в режиме «паразитного питания», используя всего два провода (Данные и Земля). В этом режиме датчик «ворует» энергию для работы с линии данных. Однако этот режим менее надежен, особенно на длинных линиях (>15-20 м) и при большом количестве датчиков. Для профессиональных инсталляций всегда рекомендуется использовать трехпроводную схему подключения: VCC, GND, Data.---
Итоги: Сравнительный анализ и выбор типа входа
Мы рассмотрели три фундаментально разных режима работы универсальных входов контроллера HI. Выбор правильного режима — это залог построения надежной и функциональной системы. Ниже приведена сравнительная таблица, которая поможет инсталлятору быстро принять решение на объекте.
| Критерий | Дискретный вход (DI) | Аналоговый вход (AI) | Шина 1-Wire |
| ------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------ |
| Тип сигнала | Бинарный (вкл/выкл, замкнуто/разомкнуто) | Непрерывный (напряжение 0-10В) | Цифровой (пакеты данных) |
| Кол-во устройств на 1 порт UI | 1 | 1 | Десятки (теоретически до 100, практически 15-20) |
| Типичный кабель | 2-жильный (например, ШВВП 2x0.5) | 2-жильный экранированный (например, МКЭШ 2x0.5) | 3-жильный (витая пара UTP/FTP Cat5e) |
| Примеры устройств | Кнопки, герконы, датчики протечки, релейные выходы | Датчики CO₂, освещенности, давления; приводы с ОС 0-10В | Датчики температуры (DS18B20) |
| Главное преимущество | Простота и надежность для бинарных состояний | Измерение плавно изменяющихся величин, стандарт индустрии | Экономия портов контроллера и кабеля при большом кол-ве датчиков |
Алгоритм выбора типа входа
При подключении нового датчика или устройства, следуйте этому простому алгоритму:
* Устройство сообщает только два состояния (вкл/выкл, открыто/закрыто)? → Используйте режим DI.
* Устройство выдает плавно изменяющееся напряжение в диапазоне 0-10В? → Используйте режим AI.
* Устройство имеет цифровой интерфейс 1-Wire (чаще всего датчик температуры)? → Используйте режим 1-Wire.
> 🔗 Связанный материал: Вспомните концепции, изложенные в уроке `COURSE-04-M01-L01` «Физический сигнал, логическое событие, состояние системы: фундаментальные различия». Физические сигналы, которые мы научились считывать с входов DI, AI и 1-Wire, являются лишь первым шагом. Внутри контроллера они преобразуются в логические события (например, `door_opened`, `light_level_changed`) и обновляют состояние системы (например, `room.temperature = 22.5`). Понимание этой цепочки "сигнал → событие → состояние" является ядром профессионального подхода к автоматизации.
Что дальше
В этом уроке мы заложили фундамент для работы с наиболее распространенными типами входов. Мы научились различать их по принципу действия, подключать соответствующие устройства и выполнять первичную обработку их сигналов. В следующем уроке мы перейдем к более сложным сценариям, таким как защита от ложных срабатываний (дребезг контактов), и рассмотрим продвинутые методы фильтрации и валидации данных, поступающих с универсальных входов контроллера.