ГлавнаяАкадемияИсполнительные устройства: интерлоки, таймауты → Схема управления двумя реле: 'Открыть/Закрыть'

Схема управления двумя реле: 'Открыть/Закрыть'

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

Введение в схемы с двумя реле

В основе многих исполнительных механизмов, требующих изменения направления движения, лежит простой и надежный принцип управления двигателем постоянного тока (DC). Управление направлением вращения вала такого двигателя достигается путем изменения полярности подаваемого на него напряжения. Если на одну клемму двигателя подать «+», а на другую «-», он будет вращаться в одну сторону. Если поменять полярность, направление вращения изменится на противоположное.

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

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

Области применения

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

Проблема одновременного включения

Главная опасность при работе с такой схемой — возможность одновременного включения обоих реле. Как мы увидим в следующей секции, такая ситуация приводит к прямому короткому замыканию (КЗ) на выходе источника питания. Последствия могут быть катастрофическими: от выхода из строя блока питания до повреждения релейного модуля и самого контроллера.

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

---

Схема подключения и выбор реле

Правильное физическое подключение — залог безопасной и долговечной работы системы. Для реализации схемы "Открыть/Закрыть" нам понадобятся два реле с перекидными контактами. У каждого такого реле есть три клеммы для коммутируемой нагрузки:

Схема подключения двигателя

Идея состоит в том, чтобы создать своего рода H-мост на реле. Контакты NO и NC каждого реле подключаются к клеммам двигателя, а питание от блока питания подается на общие (COM) контакты реле.

Рассмотрим схему подключения на примере контроллера HI, используя два его релейных выхода (например, `RL-01` и `RL-02`) и внешний блок питания на 24В DC.

* `CTRL:HI-Core` — Контроллер HI

* `PSU:24VDC` — Блок питания 24В DC

* `` — Двигатель постоянного тока (например, привод шторы)

* `RL-01`, `RL-02` — Релейные выходы контроллера

//========= WIRING-MOTOR-001: DC Motor Reversing Control =========

[PSU:24VDC] [CTRL:HI-Core]

+24V ----(+)----> COM (RL-01) (M1) o----< NC (RL-01)

NO (RL-01) >---------------------------------|

|----< NO (RL-02)

GND ----(-)----> COM (RL-02) (M2) o----< NC (RL-02)

NO (RL-02) >---------------------------------|

|----< NO (RL-01)

// Пояснение логики:

// 1. Оба реле выключены (состояние покоя):

// - M1 соединен с M2 через NC контакты и оба подключены к GND (-) через COM(RL-02). Напряжения нет.

//

// 2. Включено RL-01 ("Открыть"):

// - COM(RL-01) -> NO(RL-01) -> M2. Подается +24V.

// - M1 -> NC(RL-02) -> COM(RL-02). Подключается к GND.

// - Результат: M2 = "+", M1 = "-". Двигатель вращается в одну сторону.

//

// 3. Включено RL-02 ("Закрыть"):

// - COM(RL-02) -> NO(RL-02) -> M1. Подается GND (-). (Внимание: здесь опечатка в распространенных схемах, GND подается не напрямую, а меняется полярность)

// - Правильная логика для схемы выше:

// - Когда включено RL-01: M2 получает +24V, M1 получает GND.

// - Когда включено RL-02: M1 получает +24V (через NO(RL-01) -> NC(RL-02) -> COM(RL-01)), M2 получает GND.

// - Упрощенная, более надежная схема - H-мост:

//============ WIRING-MOTOR-002: Robust DC Motor H-Bridge on Relays =============

[PSU:24VDC] [CTRL:HI-Core]

+24V ----(+)----> COM (RL-01)

|

+---> COM (RL-02)

GND ----(-)----> NC (RL-01) (M1) o----< NO (RL-01)

| |----< NO (RL-02)

+---> NC (RL-02)

(M2) o----< (соединен с M1) - ОШИБКА, СХЕМА НЕВЕРНА.

//============= WIRING-MOTOR-003: ПРАВИЛЬНАЯ И НАДЕЖНАЯ СХЕМА H-моста ===================

[PSU:24VDC] [CTRL:HI-Core]

+24V ----(+)----> COM (RL-01)

|

+---> COM (RL-02)

(M1) o----< NO (RL-01)

GND ----(-)----> NC (RL-01) |----< NC (RL-02)

|

+---> NC (RL-02) (M2) o----< NO (RL-02)

|----< NC (RL-01)

// Логика схемы WIRING-MOTOR-003:

// 1. Реле выключены: M1 и M2 подключены к GND через NC контакты. Движения нет.

// 2. Включен RL-01: M1 -> NO(RL-01) -> COM(RL-01) -> +24V. M2 -> NC(RL-02) -> GND. Вращение вперед.

// 3. Включен RL-02: M2 -> NO(RL-02) -> COM(RL-02) -> +24V. M1 -> NC(RL-01) -> GND. Вращение назад.

⚠️ Внимание: Критически важно! Одновременное включение обоих реле (`RL-01` и `RL-02`) в схеме `WIRING-MOTOR-003` приведет к тому, что `+24V` через `NO(RL-01)` и `NO(RL-02)` будет замкнуто на `GND` через `NC(RL-02)` и `NC(RL-01)`. Это мгновенное короткое замыкание. Всегда реализуйте механизм блокировки, который мы рассмотрим далее.

Выбор реле

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

---

Базовая логика управления в Node-RED

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

Структура MQTT-топиков

На платформе HI принят стандартный формат топиков для управления периферией. Для релейных выходов он выглядит следующим образом:

Создание потока

  • Добавьте узлы `mqtt in`: Создайте два узла `mqtt in` для приема команд "Открыть" и "Закрыть".
  • * Узел 1: `Topic` = `hi/control/curtain1/set`, `Output` = `a parsed JSON object`.

    * Этот узел будет принимать команды для управления шторой.

  • Добавьте узел `switch`: Подключите выход узла `mqtt in` к узлу `switch`. Он будет маршрутизировать команды.
  • * `Property`: `msg.payload.command`

    * Правило 1: `==` (string) `OPEN`

    * Правило 2: `==` (string) `CLOSE`

    * Правило 3: `==` (string) `STOP`

  • Добавьте узлы `change` и `mqtt out`: Для каждого выхода узла `switch` создайте свою логику.
  • * Для `OPEN`: Узел `change` устанавливает `msg.payload` в `ON`. Затем `mqtt out` с топиком `hi/channel/r1/set`.

    * Для `CLOSE`: Узел `change` устанавливает `msg.payload` в `ON`. Затем `mqtt out` с топиком `hi/channel/r2/set`.

    * Для `STOP`: Потребуется два узла `change`, отправляющих `OFF` в оба топика (`hi/channel/r1/set` и `hi/channel/r2/set`).

    Пример `msg.payload` для команды:
    {
    

    "command": "OPEN",

    "source": "dashboard-living-room"

    }

    Пример потока (упрощенный, небезопасный):
    [mqtt in: hi/control/curtain1/set] --> [switch: msg.payload.command] --+-- (OPEN) --> [change: set ON] --> [mqtt out: hi/channel/r1/set]
    

    |

    +-- (CLOSE) --> [change: set ON] --> [mqtt out: hi/channel/r2/set]

    |

    +-- (STOP) --> [change: set OFF] --> [mqtt out: hi/channel/r1/set]

    |

    +-> [change: set OFF] --> [mqtt out: hi/channel/r2/set]

    Если вы соберете этот поток и быстро отправите команды `OPEN`, а затем `CLOSE`, вы можете успеть создать ситуацию, когда оба реле получат команду `ON` почти одновременно, что приведет к КЗ. Это наглядно демонстрирует необходимость программной блокировки.

    ---

    Реализация программной блокировки (Interlock)

    Теперь создадим надежный поток, который полностью исключает риск короткого замыкания. Мы будем использовать один узел `function` как центральный процессор команд, реализующий логику "сначала выключи, потом включи".

    Алгоритм блокировки

  • Получить команду (`OPEN`, `CLOSE` или `STOP`).
  • Перед выполнением любой команды `OPEN` или `CLOSE`: Принудительно отправить команду `OFF` на оба реле.
  • Ввести задержку: Подождать небольшое время (например, 50-100 миллисекунд). Это технологическая пауза, которая гарантирует, что контакты реле успели физически разомкнуться, прежде чем придет следующая команда. Механическое переключение не мгновенно.
  • После задержки: Если исходная команда была `OPEN` или `CLOSE`, отправить команду `ON` на соответствующее реле. Если команда была `STOP`, никаких действий больше не требуется.
  • 💡 Подсказка: Для более надежных систем используйте контекст потока (`flow context`) для хранения текущего состояния привода ('opening', 'closing', 'stopped'). Это позволяет избежать гонки состояний и делает логику более предсказуемой. Как было рассмотрено ранее в уроках, посвященных персистентному контексту, `flow` контекст можно сделать энергонезависимым, что позволит системе восстановить правильное состояние после сбоя питания.

    Реализация в Node-RED

    Мы заменим сложную конструкцию из узлов `switch` и `change` одним узлом `function`, который будет генерировать последовательность сообщений для управления реле.

    Flow Diagram (ASCII):
                                            +----------------------------------+
    

    [mqtt in: hi/control/curtain1/set] ---> | Function: Interlock | --+--> [mqtt out: hi/channel/r1/set]

    +----------------------------------+ |

    +--> [mqtt out: hi/channel/r2/set]

    Код для узла `Function: Interlock`:

    Этот узел будет иметь два выхода: первый для реле `RL-01` ("Открыть"), второй для реле `RL-02` ("Закрыть").

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

    // Ожидаемый контракт: msg.payload = { "command": "OPEN" | "CLOSE" | "STOP" }

    const command = msg.payload.command;

    // Определяем реле, которые нужно остановить

    const relay1_stop = { topic: "hi/channel/r1/set", payload: "OFF" };

    const relay2_stop = { topic: "hi/channel/r2/set", payload: "OFF" };

    // Определяем реле, которые нужно запустить

    const relay1_start = { topic: "hi/channel/r1/set", payload: "ON" };

    const relay2_start = { topic: "hi/channel/r2/set", payload: "ON" };

    // Создаем массив сообщений для отправки.

    // Мы используем возможность Node-RED отправлять массив сообщений для создания последовательности.

    let messageSequence = [];

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

    messageSequence.push(relay1_stop);

    messageSequence.push(relay2_stop);

    // 2. Добавляем сообщение с задержкой. Узел `delay` обработает это.

    // `delay` в миллисекундах. 100 мс - хороший запас для механических реле.

    messageSequence.push({ delay: 100 });

    // 3. В зависимости от команды, добавляем сообщение на включение.

    switch (command) {

    case 'OPEN':

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

    messageSequence.push(relay1_start);

    node.status({fill:"green", shape:"dot", text:"Opening..."});

    break;

    case 'CLOSE':

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

    messageSequence.push(relay2_start);

    node.status({fill:"blue", shape:"dot", text:"Closing..."});

    break;

    case 'STOP':

    // Ничего больше не делаем, только останавливаем

    node.status({fill:"red", shape:"ring", text:"Stopped"});

    break;

    default:

    node.warn("Неизвестная команда: " + command);

    return null; // Если команда не распознана, ничего не делаем.

    }

    // Отправляем всю последовательность сообщений.

    // Она будет обработана последовательно.

    return [messageSequence];

    После узла `Function` необходимо поставить узел `delay`, который будет обрабатывать сообщение `msg.delay`, и уже после него — два узла `mqtt out`.

    Правильная схема потока:
    [mqtt in] -> [Function: Interlock] -> [delay] -> [switch: msg.topic] --+--> [mqtt out: r1]
    

    |

    +--> [mqtt out: r2]

    Узел `delay` настраивается на `Delay message by` `msg.delay`. Узел `switch` после него маршрутизирует сообщения в правильный `mqtt out` узел на основе `msg.topic`.

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

    ---

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

    В этом уроке мы рассмотрели один из фундаментальных паттернов в автоматизации — управление направлением движения с помощью схемы из двух реле.

    Ключевые аспекты, которые необходимо запомнить:
  • Принцип работы: Смена полярности на двигателе постоянного тока позволяет реверсировать его вращение.
  • Схема подключения: Мы изучили правильную и надежную схему подключения по типу H-моста, используя два реле с перекидными контактами (COM, NO, NC).
  • Опасность КЗ: Мы осознали критическую опасность одновременного включения обоих реле и почему это приводит к короткому замыканию.
  • Программная блокировка (Interlock): Мы реализовали в Node-RED надежный механизм программной блокировки с использованием узла `function` и технологической задержки, который гарантирует безопасную работу привода.
  • Преимущества данного подхода очевидны: это простое в реализации, недорогое и универсальное решение, применимое для огромного количества задач, от умного дома до промышленных объектов. Освоение этого паттерна является обязательным навыком для любого инженера-установщика.

    🔗 Связанный материал: В следующем уроке, COURSE-05-M06-L03, мы усовершенствуем нашу схему. Мы добавим таймауты для автоматической остановки привода через заданное время и интегрируем концевые выключатели — физические датчики, которые сообщают системе о достижении крайних положений (полностью открыто/закрыто). Это позволит нам реализовать точное позиционирование и дополнительно повысить надежность системы.