ГлавнаяАкадемияИсполнительные устройства: интерлоки, таймауты → Обзор приводов с управлением направлением

Обзор приводов с управлением направлением

Урок · Исполнительные устройства: интерлоки, таймауты · 30 мин · theory

Введение в приводы с управлением направлением: Open/Close

В системах автоматизации мы часто сталкиваемся с устройствами, для управления которыми недостаточно простого включения и выключения питания. К таким устройствам относятся приводы с управлением направлением (Direction-Controlled Actuator) — механизмы, требующие отдельных команд для движения в противоположных направлениях.

> 📋 Ключевые понятия:

> * Привод с управлением направлением: Исполнительное устройство (обычно электродвигатель), которое имеет как минимум два управляющих входа для запуска движения в противоположных направлениях (например, "Открыть" и "Закрыть", "Вперед" и "Назад", "Вверх" и "Вниз").

> * Типовые примеры: Электрические шторы и жалюзи, рулонные ворота, шлагбаумы, оконные проветриватели, клапаны с реверсивным ходом.

Основное отличие таких приводов от стандартных нагрузок, управляемых одним реле (как мы рассматривали в шаблоне On/Off), заключается в логике управления. Если для лампочки достаточно подать или снять напряжение, то для привода штор необходимо подать напряжение на одну клемму, чтобы они открывались, и на другую, чтобы закрывались.

| Параметр | Стандартное реле (On/Off) | Управление направлением (Open/Close) |

| :--- | :--- | :--- |

| Логика управления | Замкнуть/разомкнуть одну цепь | Подать управляющий сигнал на один из двух входов |

| Количество команд | Две: "ВКЛ", "ВЫКЛ" | Три и более: "ОТКРЫТЬ", "ЗАКРЫТЬ", "СТОП" |

| Типовая нагрузка | Освещение, розетки, обогреватели | Моторы, клапаны, линейные актуаторы |

| Требуемые выходы | 1 реле | 2 реле или специализированный драйвер |

Типовая схема физического подключения

Большинство приводов для штор, ворот или клапанов, работающих от переменного или постоянного тока, имеют схожую схему подключения. Как правило, у них есть три или четыре основных провода:

  • Общий (Common / N): Провод, который является общим для обеих обмоток двигателя. В случае двигателей ~230В это обычно нейтраль (N).
  • Направление 1 (Open / Up): Управляющий провод. Подача фазы (L) на этот провод заставляет двигатель вращаться в одном направлении (например, открывать штору).
  • Направление 2 (Close / Down): Управляющий провод. Подача фазы (L) на этот провод запускает вращение в обратном направлении (закрывает штору).
  • Защитное заземление (PE): Желто-зеленый провод, подключаемый к корпусу привода для обеспечения электробезопасности.
  • Таким образом, задача контроллера сводится к коммутации фазы (~230В) или плюса питания (+24В) на один из двух управляющих входов привода. Для этого идеально подходят два релейных выхода контроллера HI.

    Рассмотрим пример подключения двигателя шторы (~230В):

    Теперь, замыкая реле RL01, мы подаем фазу на вход "Открыть", и штора начинает движение вверх. Замыкая RL02, мы подаем фазу на вход "Закрыть", и штора движется вниз.

    ---

    Логика аппаратного управления: два реле для одного мотора

    Для управления реверсивным двигателем постоянного тока, где направление вращения зависит от полярности подаваемого напряжения, используется схема управления на двух реле. Эта схема, по сути, является упрощенной версией H-моста и позволяет изменять полярность на клеммах мотора с помощью стандартных реле контроллера.

    Почему одного реле недостаточно? Одно реле с контактами `NO/NC/C` может коммутировать один провод между двумя разными цепями, но не может одновременно перевернуть полярность на двух проводах питания мотора. Для этого требуется координация как минимум двух реле.

    Стандартная "двухрелейная" схема

    Рассмотрим схему для управления двигателем постоянного тока (например, 24В) с помощью двух реле контроллера HI.

    * `[PSU: +24V]` — Плюс от блока питания.

    * `[PSU: GND]` — Минус (земля) от блока питания.

    * `[RL-01]`, `[RL-02]` — Два реле контроллера.

    * `(M)` — Двигатель.

    // Схема для реверса полярности на двигателе постоянного тока
    

    [PSU: +24V] ----+---- C (RL-01)

    |

    +---- C (RL-02)

    [PSU: GND] ----+---- NC (RL-01)

    |

    +---- NC (RL-02)

    NO (RL-01) -----+---- Клемма 1 (M)

    |

    NO (RL-02) -----+---- Клемма 2 (M)

    Анализ работы схемы:
  • Состояние покоя (оба реле выключены): Контакты `C` обоих реле соединены с `NC`. На обе клеммы двигателя `(M)` через контакты `NC` подается `GND`. Разность потенциалов равна нулю, двигатель стоит.
  • Движение "Вперед" (включено RL-01, выключено RL-02):
  • * `RL-01` переключается: `C` соединяется с `NO`. На клемму 1 мотора подается `+24V`.

    * `RL-02` остается выключенным: `C` соединено с `NC`. На клемму 2 мотора подается `GND`.

    * Результат: На моторе полярность `(+ , -)`. Двигатель вращается в одном направлении.

  • Движение "Назад" (выключено RL-01, включено RL-02):
  • * `RL-01` выключено: На клемму 1 мотора подается `GND`.

    * `RL-02` включено: На клемму 2 мотора подается `+24V`.

    * Результат: На моторе полярность `(-, +)`. Двигатель вращается в обратном направлении.

    > ⚠️ Внимание: Аппаратная блокировка от одновременного включения реле является обязательной. Подача питания на обе клеммы направления одновременно приведет к короткому замыканию и выходу из строя блока питания или контроллера.

    Если по ошибке включить оба реле (`RL-01` и `RL-02`) одновременно, `+24V` через `NO (RL-01)` попадет на клемму 1, а `+24V` через `NO (RL-02)` — на клемму 2. Это не приведет к КЗ. Проблема возникает в другой схеме, где на C подается разное напряжение. Однако, если речь идет о приводе 230В с двумя входами, то одновременная подача фазы на оба входа может сжечь обмотки двигателя. Поэтому критически важно обеспечить невозможность одновременного включения двух реле, управляющих одним приводом.

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

    ---

    Программная реализация в Node-RED: базовый интерлок

    Даже при наличии аппаратной блокировки, хорошей практикой является реализация программной взаимоблокировки (Software Interlock). Это делает логику потока более чистой, предсказуемой и предотвращает отправку лишних, конфликтующих команд. Программный интерлок — это логика, которая проверяет текущее состояние системы перед отправкой новой команды.

    Предположим, мы управляем воротами через MQTT. У нас есть топики для управления реле:

    Команды управления воротами приходят в топик `hi/devices/gate/set` с полезной нагрузкой `"OPEN"`, `"CLOSE"` или `"STOP"`.

    Пример потока

    ASCII-схема:
    [mqtt in: hi/devices/gate/set] -> [function: "Gate Interlock Logic"] --+-- (open cmd) --> [mqtt out: hi/relays/1/set]
    

    |

    +-- (close cmd) -> [mqtt out: hi/relays/2/set]

    |

    +-- (stop cmd) --> [mqtt out: ...] (для обоих реле)

    Задача узла `function` — не просто преобразовать команду, а проверить, допустима ли она в текущий момент. Для этого мы будем использовать контекст потока (`flow context`) для хранения состояния ворот.

    Возможные состояния: `stopped`, `opening`, `closing`.

    Код для узла `function` "Gate Interlock Logic":
    // Получаем текущее состояние ворот из контекста потока.
    

    // Если его нет, по умолчанию 'stopped'.

    let state = flow.get("gateState") || "stopped";

    // Получаем команду из входящего сообщения

    let command = msg.payload;

    // 1. Логика взаимоблокировки

    switch (command) {

    case "OPEN":

    // Разрешаем команду "OPEN" только если ворота не открываются уже

    // и не закрываются в данный момент.

    if (state === "opening" || state === "closing") {

    node.warn("Command 'OPEN' ignored. Gate is already moving. State: " + state);

    return null; // Блокируем команду

    }

    // Устанавливаем новое состояние и разрешаем команду

    flow.set("gateState", "opening");

    node.status({fill:"yellow", shape:"dot", text:"opening..."});

    // Формируем сообщение для включения реле "Открыть"

    msg.payload = "ON";

    // Используем несколько выходов узла Function для маршрутизации

    return [msg, null, null]; // Отправляем на 1-й выход

    case "CLOSE":

    // Разрешаем команду "CLOSE" только если ворота не двигаются

    if (state === "opening" || state === "closing") {

    node.warn("Command 'CLOSE' ignored. Gate is already moving. State: " + state);

    return null;

    }

    flow.set("gateState", "closing");

    node.status({fill:"yellow", shape:"dot", text:"closing..."});

    // Формируем сообщение для включения реле "Закрыть"

    msg.payload = "ON";

    return [null, msg, null]; // Отправляем на 2-й выход

    case "STOP":

    // Команду "STOP" разрешаем всегда

    flow.set("gateState", "stopped");

    node.status({fill:"grey", shape:"ring", text:"stopped"});

    // Формируем сообщение для выключения ОБОИХ реле

    msg.payload = "OFF";

    return [null, null, msg]; // Отправляем на 3-й выход

    default:

    node.error("Unknown command: " + command, msg);

    return null; // Неизвестная команда

    }

    Этот узел `function` должен иметь 3 выхода, каждый из которых подключен к соответствующему узлу `mqtt out`:

  • Выход 1 -> `mqtt out` (`topic: hi/relays/1/set`) для команды `OPEN`
  • Выход 2 -> `mqtt out` (`topic: hi/relays/2/set`) для команды `CLOSE`
  • Выход 3 -> два узла `mqtt out` (`hi/relays/1/set` и `hi/relays/2/set`) для команды `STOP`.
  • > 💡 Подсказка: Для создания надежной взаимоблокировки используйте узел `rbe` (Report by Exception) или храните состояние в глобальном контексте, чтобы предотвратить отправку конфликтующих команд. В нашем примере мы использовали `flow context`, что является предпочтительным методом, так как он ограничивает область видимости состояния одним потоком, избегая побочных эффектов.

    ---

    Работа с таймаутами для управления состоянием

    Основная проблема с простыми приводами — отсутствие у них встроенной обратной связи о положении. Мы можем отправить команду "Открыть", но не знаем, когда именно штора полностью откроется. Самый простой способ решить эту проблему — управление по таймауту (Timeout-based Control).

    Идея проста:

  • Измерить время, за которое привод совершает полный цикл движения (например, штора полностью открывается за 20 секунд).
  • При отправке команды "Открыть" запустить таймер на 20 секунд.
  • По истечении таймера автоматически отправить команду "Стоп", чтобы выключить реле и остановить двигатель.
  • Это предотвращает перегрев двигателя и позволяет создать "виртуальное" конечное состояние (`open` или `closed`).

    Использование узла `trigger`

    Узел `trigger` идеально подходит для этой задачи. Он работает следующим образом:

    > 🔗 Связанный материал: Более продвинутые методы, такие как работа с концевыми выключателями и энкодерами для точного позиционирования, рассматриваются в уроке `COURSE-05-M06-L02`.

    Пример потока с `trigger`:

    Дополним наш предыдущий поток.

    ASCII-схема:
    // Ветка команды OPEN
    

    [... from function output 1 ...] -> [change: set payload to "ON"] -> [mqtt out: relays/1/set]

    |

    +-> [trigger: 20s] -> [change: set payload to "OFF"] --+-> [mqtt out: relays/1/set]

    |

    +-> [function: "Set State to 'open'"]

    // Ветка команды CLOSE

    [... from function output 2 ...] -> [change: set payload to "ON"] -> [mqtt out: relays/2/set]

    |

    +-> [trigger: 20s] -> [change: set payload to "OFF"] --+-> [mqtt out: relays/2/set]

    |

    +-> [function: "Set State to 'closed'"]

    Настройка узла `trigger` (для полного открытия за 20с): Логика работы потока `OPEN`:
  • Из узла `function` приходит сообщение с `payload: "ON"`.
  • Оно разделяется на две ветки.
  • Первая ветка немедленно отправляет `msg.payload = "ON"` в `mqtt out`, включая реле открытия.
  • Вторая ветка активирует узел `trigger`. Он ждет 20 секунд.
  • Через 20 секунд `trigger` отправляет новое сообщение `{"payload": "OFF"}`.
  • Это сообщение выключает реле открытия через тот же узел `mqtt out`.
  • Одновременно сообщение от `trigger` поступает в узел `function: "Set State to 'open'"`, который обновляет `flow.get("gateState")` на `open` и выводит статус `node.status({fill:"green", shape:"dot", text:"open"})`.
  • Таким образом, мы создали виртуальное состояние. Система "считает", что через 20 секунд после начала движения штора будет полностью открыта. Это приближение, но для многих бытовых задач (шторы, жалюзи) его точности вполне достаточно.

    Структура `msg.payload` для управления реле через MQTT:

    При работе с топиками вида `/set` обычно используется простое строковое значение.

        "ON"
    

        "OFF"
    

    Эти сообщения и формируются в нашем потоке для отправки на релейные выходы контроллера.

    ---

    Итоги и следующие шаги

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

    Ключевые выводы:
  • Двухрелейная схема: является стандартом для управления приводами с раздельными входами "Открыть/Закрыть" или для реверса полярности на двигателях постоянного тока.
  • Важность взаимоблокировки: Сочетание аппаратного интерлока, встроенного в контроллер HI, и программной блокировки в Node-RED — это залог безопасной и безаварийной работы системы. Аппаратная блокировка защищает от catastrophic failure (короткое замыкание), а программная обеспечивает чистоту и предсказуемость логики сценария.
  • Таймауты как базовый инструмент: При отсутствии точной обратной связи от привода, управление по таймауту с помощью узла `trigger` является простым и эффективным способом автоматической остановки двигателя и создания "виртуальных" состояний (`открыто`, `закрыто`).
  • Несмотря на свою эффективность для простых задач, метод управления по таймауту имеет ограничения. Он не учитывает возможные препятствия на пути движения, проскальзывания механизма или изменения скорости работы привода со временем. Система не "знает" реального положения шторы, а лишь "предполагает" его.

    Что дальше?

    В следующем уроке, `COURSE-05-M06-L02: "Реализация обратной связи: Концевые выключатели и энкодеры"`, мы сделаем следующий шаг и научимся работать с реальной обратной связью. Мы рассмотрим: