ГлавнаяАкадемияДатчики и входы: нормализация сигналов → Обзор универсальных входов контроллера: DI, AI, 1-Wire

Обзор универсальных входов контроллера: DI, AI, 1-Wire

Урок 1 · Датчики и входы: нормализация сигналов · 30 мин · theory

Архитектура универсальных входов контроллеров HI

В основе гибкости и экономической эффективности современных систем автоматизации лежит концепция универсальности. Контроллеры платформы HI оснащены набором универсальных входов (UI - Universal Inputs), которые являются ключевым элементом для подключения широкого спектра периферийных устройств. Эти порты спроектированы таким образом, чтобы инсталлятор мог на программном уровне определять их режим работы, адаптируя один и тот же физический порт под разные типы задач.

На корпусе контроллера HI вы найдете 22 таких порта, обычно сгруппированных в блоки и промаркированных как `UI-01`, `UI-02` и так далее. Физически каждый порт представляет собой клеммную колодку для подключения двух или трёх проводов. Однако его истинный потенциал раскрывается в программной среде, например, в Node-RED, где вы можете назначить одному и тому же порту `UI-05` роль считывателя кнопки сегодня, а завтра переконфигурировать его для работы с датчиком освещенности.

> ℹ️ Информация: На контроллерах HI универсальные входы обычно маркируются как 'UI' (Universal Input). Каждый порт может быть индивидуально сконфигурирован в программном обеспечении. Эта унификация позволяет использовать один тип контроллера для множества различных сценариев на объекте, сокращая номенклатуру необходимого оборудования и упрощая складские запасы.

Эта программно-определяемая природа входов позволяет им функционировать в трех основных режимах, которые покрывают подавляющее большинство задач в автоматизации зданий:

  • Дискретный вход (DI - Digital Input): В этом режиме порт регистрирует всего два состояния — «замкнуто» или «разомкнуто». Это идеальный режим для работы с бинарными сигналами, такими как нажатие кнопки, срабатывание геркона на окне или сигнал аварии от стороннего оборудования.
  • Аналоговый вход (AI - Analog Input): Режим для измерения непрерывно изменяющихся физических величин, представленных в виде электрического напряжения. Стандартным для отрасли является сигнал 0-10В, который используется для датчиков освещенности, влажности, давления или для получения обратной связи от управляемых устройств (например, положение клапана).
  • Шина 1-Wire: Специализированный режим, превращающий один универсальный вход в шину данных для подключения целой гирлянды цифровых датчиков. Самым популярным применением является подключение десятков датчиков температуры DS18B20 по одному трехпроводному кабелю.
  • Выбор режима для каждого входа `UI` является первым и фундаментальным шагом при проектировании схемы подключений и разработке логики в Node-RED. Неправильная конфигурация режима не просто приведет к некорректным данным, но и может создать риск для подключенного оборудования.

    ---

    Дискретные входы (DI): работа с 'сухими контактами'

    Режим дискретного входа (DI) — самый простой и один из самых распространенных в автоматизации. Он предназначен для определения одного из двух состояний: есть контакт или нет. Основой для этого режима служит مفهوم «сухого контакта» (Dry Contact).

    Принцип работы 'сухого контакта'

    «Сухой контакт» — это выход на устройстве (например, датчике или кнопке), который представляет собой простое реле или переключатель, не имеющий собственного источника питания. Он не выдает никакого напряжения; его задача — лишь замыкать или размыкать предоставленную ему внешнюю цепь. В нашем случае эту цепь предоставляет контроллер HI.

    Когда вы конфигурируете порт `UI` в режим `DI`, контроллер активирует на нем так называемую внутреннюю подтяжку (pull-up). Это означает, что контроллер подает на вход небольшое напряжение (например, +3.3В или +5В) через резистор. Далее логика проста:

    > 💡 Подсказка: Из-за использования внутренней подтяжки логика работы 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В. Он прост, надежен и интуитивно понятен:

    Этот стандарт широко применяется в:

    АЦП (Аналогово-цифровой преобразователь)

    сердцем любого аналогового входа является АЦП (ADC). Эта микросхема измеряет напряжение на клемме `UI` и преобразует его в число. Разрешение АЦП определяет, на сколько шагов будет разбит диапазон напряжения. Например, 10-битный АЦП, который часто используется в контроллерах, делит диапазон 0-10В на 210 = 1024 шага.

    Это «сырое» (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`. Он позволяет линейно отобразить один числовой диапазон на другой.

    Пошаговая инструкция:
  • Перетащите узел `Range` на холст и соедините его с выходом вашего узла-источника (`hi-input`).
  • Откройте настройки узла `Range`.
  • В секции Диапазон (Range), установите входные значения:
  • * `от`: `0`

    * `до`: `1023`

    (Это соответствует диапазону нашего 10-битного АЦП).

  • Установите целевые значения:
  • * `от`: `0`

    * `до`: `100`

    (Это наш желаемый диапазон в процентах).

  • В опции Действие (Action) выберите `Масштабировать и ограничить результат границами диапазона`. Это гарантирует, что даже если на вход по ошибке придет значение `1100`, на выходе мы получим не более `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

    В 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.

  • Проверьте документацию: Всегда сверяйтесь с паспортом или инструкцией на подключаемое устройство. Там будет четко указан тип его выхода.
  • Спланируйте ресурсы: Если у вас много однотипных датчиков (например, температуры в каждой комнате), использование шины 1-Wire на одном порту `UI` будет гораздо эффективнее, чем занимать 10-15 портов в режиме `AI` или `DI`.
  • > 🔗 Связанный материал: Вспомните концепции, изложенные в уроке `COURSE-04-M01-L01` «Физический сигнал, логическое событие, состояние системы: фундаментальные различия». Физические сигналы, которые мы научились считывать с входов DI, AI и 1-Wire, являются лишь первым шагом. Внутри контроллера они преобразуются в логические события (например, `door_opened`, `light_level_changed`) и обновляют состояние системы (например, `room.temperature = 22.5`). Понимание этой цепочки "сигнал → событие → состояние" является ядром профессионального подхода к автоматизации.

    Что дальше

    В этом уроке мы заложили фундамент для работы с наиболее распространенными типами входов. Мы научились различать их по принципу действия, подключать соответствующие устройства и выполнять первичную обработку их сигналов. В следующем уроке мы перейдем к более сложным сценариям, таким как защита от ложных срабатываний (дребезг контактов), и рассмотрим продвинутые методы фильтрации и валидации данных, поступающих с универсальных входов контроллера.