ГлавнаяАкадемияИсполнительные устройства: интерлоки, таймауты → Лабораторная работа: COURSE-05-M02-LAB01 'Клапан полива по таймеру'

Лабораторная работа: COURSE-05-M02-LAB01 'Клапан полива по таймеру'

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

Введение и цели лабораторной работы

Данная лабораторная работа является ключевой практикой для закрепления навыков управления исполнительными устройствами. Мы создадим с нуля полностью рабочую систему автоматического полива, которая активирует подачу воды на заданное время. Этот сценарий является классическим примером применения шаблона "На заданное время" (Timed) и широко используется в системах "умного дома" и автоматизации зданий для управления поливом, вентиляцией, прогревом помещений и другими процессами с ограниченной длительностью.

Основная цель работы — интегрировать физическое оборудование (электромагнитный клапан) с программной логикой на контроллере HI, используя промышленный протокол Modbus RTU, и реализовать надежный механизм управления по таймеру. Вы пройдете весь путь инженера-инсталлятора: от сборки схемы подключения до написания кода в Node-RED и финальной отладки.

> 💡 Подсказка: Выбирайте нормально-закрытый (NC) электромагнитный клапан. Это означает, что клапан перекрывает поток воды, когда на его катушку не подано напряжение. Такой выбор является стандартом безопасности: при потере питания на контроллере или модуле реле полив не начнется самопроизвольно, предотвращая риск затопления.

Для выполнения лабораторной работы вам потребуется следующий набор оборудования и программного обеспечения:

| Компонент | Назначение | Технические характеристики |

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

| Контроллер HI-Core | Выполнение логики автоматизации | Linux (Debian), Node-RED, порт RS-485 |

| Модуль реле Modbus RTU | Исполнительное устройство | 1+ реле с "сухими контактами", поддержка RS-485 |

| Электромагнитный клапан | Управление потоком воды | Нормально-закрытый (NC), питание 24VDC |

| Блок питания 24VDC | Питание клапана | Мощность ≥ 10 Вт |

| Программное обеспечение | Среда разработки | Node-RED (предустановлен на контроллере HI) |

В ходе работы мы будем опираться на концепцию шаблона "На заданное время" (Timed), которую теоретически рассмотрели в уроке `COURSE-05-M02-L03`. Напомним его суть: система получает команду на активацию, включающую параметр длительности (`timeout`). Исполнительное устройство немедленно включается, и одновременно запускается обратный отсчет. По истечении заданного времени устройство автоматически выключается без необходимости посылать вторую, отдельную команду на отключение. Это делает управление атомарным и предсказуемым.

---

Схема подключения и настройка оборудования

Правильное физическое подключение — это фундамент надежной системы. Ошибки на этом этапе могут привести не только к неработоспособности, но и к повреждению дорогостоящего оборудования. Выполняйте все шаги последовательно и аккуратно.

> ⚠️ Внимание: Перед началом работ убедитесь, что все источники питания (220V для контроллера и блока питания, 24VDC для клапана) отключены от сети. Неправильное подключение силовых цепей может привести к короткому замыканию, выходу оборудования из строя или поражению электрическим током.

Пошаговая инструкция по монтажу

  • Настройка Modbus-адреса релейного модуля.
  • * Большинство Modbus-устройств поставляются с заводским адресом `1`. Если на вашей шине RS-485 будет несколько устройств, необходимо присвоить каждому уникальный адрес.

    * Найдите на корпусе релейного модуля DIP-переключатели или следуйте инструкции производителя для программной настройки адреса. Для данной лабораторной работы установим `Modbus ID = 10`. Запишите этот адрес, он понадобится для настройки в Node-RED.

  • Подключение шины RS-485.
  • * Для связи контроллера HI с релейным модулем используется двухпроводная шина RS-485. Используйте кабель типа "витая пара".

    * Подключите клемму `A` на порту RS-485 контроллера к клемме `A` (или `D+`) на релейном модуле.

    * Подключите клемму `B` на порту RS-485 контроллера к клемме `B` (или `D-`) на релейном модуле.

    * Если релейный модуль является единственным или последним устройством на шине, активируйте на нем встроенный терминирующий резистор (120 Ом), если это предусмотрено конструкцией.

  • Подключение силовой цепи клапана.
  • * Электромагнитный клапан является нагрузкой, которой управляет реле. Реле в данном случае выступает как выключатель в цепи питания клапана.

    * Подключите выход `+24V` блока питания к клемме `+` (или `V+`) электромагнитного клапана.

    * Подключите выход `-24V` (GND) блока питания к общей клемме (`COM` или `C`) реле на Modbus-модуле.

    * Подключите нормально-разомкнутую клемму (`NO`) реле к клемме `-` (или `GND`) электромагнитного клапана.

    ASCII-схема подключения (WIRING-IRRIGATION-001)

    Эта схема является эталоном подключения для данного проекта.

    //========= WIRING-IRRIGATION-001: Timed Valve Control =========
    
    

    // Шина данных RS-485 (контроллер <-> релейный модуль)

    [CTRL:HI-Core] {RELAY-MOD:Modbus:ID=10}

    (RS485-1)

    A ----------------(Зеленый)---------------- A (D+)

    B ----------------(Белый)------------------ B (D-)

    GND ----------------(Черный)----------------- GND (если есть)

    // Цепь управления клапаном (24VDC)

    [PSU:24VDC] {RELAY-MOD:Modbus:ID=10}

    +24V -------------------------------------------------- +

    -24V (GND) ----------- C (Общий контакт реле 1)

    NO (Нормально-разомкнутый) ------- -

    // Питание 220VAC для контроллера и блока питания

    ~L~ -----> [CTRL:HI-Core:L], [PSU:24VDC:L]

    ~N~ -----> [CTRL:HI-Core:N], [PSU:24VDC:N]

    ~PE~ ----> [CTRL:HI-Core:PE], [PSU:24VDC:PE]

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

    ---

    Создание потока в Node-RED: Modbus и контракт

    Теперь, когда аппаратная часть готова, перейдем к созданию программной логики в среде Node-RED на контроллере HI. Мы создадим поток, который будет принимать команду с указанием времени полива и передавать ее на релейный модуль по протоколу Modbus.

    Структура потока

    Наш базовый поток будет состоять из трех ключевых узлов, соединенных последовательно:

    `[Inject]` -> `[Function]` -> `[modbus-write]`

    Настройка узла `modbus-write`

  • Перетащите на холст узел `Modbus-Write` из палитры `modbus`.
  • Дважды кликните по нему, чтобы открыть окно настроек.
  • Нажмите на иконку карандаша рядом с полем `Server`, чтобы настроить подключение к Modbus-устройству.
  • * Type: `Serial`

    * Serial Port: Укажите порт вашего контроллера, к которому подключен адаптер RS-485 (например, `/dev/ttyUSB0`).

    * Serial-Type: `RTU`

    * Baud Rate: `9600` (или другое значение, соответствующее настройкам вашего релейного модуля).

    * Data Bits: `8`, Parity: `None`, Stop Bits: `1`. Это наиболее распространенная конфигурация (`8N1`).

  • Сохраните настройки сервера.
  • Теперь настройте сам узел `modbus-write`:
  • * Unit-ID: `10` (адрес, который мы задали нашему релейному модулю).

    * FC: `FC 5: Force Single Coil`. Эта функция используется для управления состоянием одного реле (включить/выключить).

    * Address: `0` (адрес первого реле, если документация использует нумерацию с 1, то для Coil 1 адрес будет 0).

    * Name: "Управление клапаном полива".

    Реализация контракта сообщения

    Как мы определили в уроке `COURSE-05-M02-L04`, для управления устройствами в режиме "на заданное время" используется стандартизированный контракт сообщения. Наш узел `Function` будет ожидать на входе сообщение со следующей структурой:

    {
    

    "topic": "commands/irrigation/zone1/set",

    "payload": {

    "timeout": 120

    }

    }

    Узел `Function` будет принимать это сообщение, а на выход отправлять узлу `modbus-write` сообщение с простым `payload`, который тот понимает: `true` для включения реле и `false` для выключения. Это разделение логики и исполнения является хорошей практикой.

    ---

    Реализация логики таймера в узле Function

    Это центральная часть нашей лабораторной работы. В узле `Function` мы напишем код на JavaScript, который реализует всю логику шаблона "Timed".

    > 🔗 Связанный материал: Подробное описание теоретической базы шаблона "На заданное время" и принципов его работы рассмотрено в уроке `COURSE-05-M02-L03`. Мы здесь реализуем эту теорию на практике.

    Перетащите на холст узел `Function` и поместите его между `Inject` и `modbus-write`. Дважды кликните по нему и вставьте следующий код:

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

    // Контракт: msg.payload должен быть объектом с ключом 'timeout' в секундах.

    const timeoutSeconds = msg.payload.timeout;

    // 1. Валидация входящих данных

    // Проверяем, что timeout передан и является положительным числом.

    if (typeof timeoutSeconds !== 'number' || timeoutSeconds <= 0) {

    // Если данные некорректны, выводим ошибку в лог и останавливаем поток.

    node.error("Неверный формат команды: 'timeout' должен быть положительным числом.", msg);

    // Выводим статус на узле для быстрой диагностики

    node.status({ fill: "red", shape: "dot", text: "Ошибка: неверный timeout" });

    return null; // Прерываем выполнение потока

    }

    // Конвертируем секунды в миллисекунды для функции setTimeout

    const timeoutMilliseconds = timeoutSeconds * 1000;

    // Выводим информативный статус на узле

    node.status({ fill: "blue", shape: "dot", text: `Полив активен, осталось ${timeoutSeconds}с` });

    // 2. Отправка команды на ВКЛЮЧЕНИЕ клапана

    // Формируем новое сообщение для узла modbus-write.

    // Он ожидает булево значение в msg.payload.

    const turnOnMsg = { payload: true };

    node.send(turnOnMsg);

    // 3. Запуск таймера на ВЫКЛЮЧЕНИЕ

    // Функция setTimeout выполнит код внутри нее через указанное количество миллисекунд.

    setTimeout(() => {

    // Этот код выполнится, когда таймер истечет.

    // Формируем сообщение на выключение

    const turnOffMsg = { payload: false };

    // Отправляем команду на ВЫКЛЮЧЕНИЕ

    node.send(turnOffMsg);

    // Обновляем статус узла, показывая, что работа завершена

    node.status({ fill: "green", shape: "dot", text: "Готово: полив завершен" });

    }, timeoutMilliseconds);

    // 4. Блокировка прохождения исходного сообщения

    // Так как мы сами формируем и отправляем нужные сообщения через node.send(),

    // нам нужно предотвратить прохождение оригинального msg дальше по потоку.

    // Для этого возвращаем null.

    return null;

    Разбор кода

    ---

    Тестирование и отладка системы

    После сборки схемы и написания кода наступает самый ответственный этап — проверка работоспособности.

    > 💡 Подсказка: Настройте панель вывода узла `debug` на отображение полного объекта сообщения (`complete msg object`). Это позволит вам видеть не только `payload`, но и другие важные свойства, такие как `topic`, `_msgid` и информацию об ошибках. Это критически важно для глубокой отладки.

    План тестирования

  • Подготовка к тесту.
  • * Разместите узел `Debug` на холсте и подключите его к выходу узла `Function`. Это позволит нам видеть, какие именно команды (`true` и `false`) отправляются на Modbus-реле.

    * Разместите еще один узел `Debug` и подключите его к второму выходу узла `modbus-write` (выход для ошибок), чтобы отловить возможные проблемы связи.

    * Создайте узел `Inject` и настройте его на отправку тестовой команды.

  • Настройка узла `Inject`.
  • * Дважды кликните по узлу `Inject`.

    * В поле `Payload` выберите тип `JSON`.

    * В текстовое поле введите следующий объект:

            {

    "timeout": 10

    }

    Мы используем короткий интервал в 10 секунд для быстрого теста.

    * По желанию, в поле `Topic` можно указать `commands/irrigation/zone1/set`.

  • Запуск и наблюдение.
  • * Разверните (`Deploy`) изменения в Node-RED.

    * Откройте боковую панель `Debug`.

    * Нажмите на кнопку узла `Inject`.

    Ожидаемый результат

    1. Сразу после нажатия `Inject` в панели `Debug` должно появиться сообщение от узла `Function` с `payload: true`.

    2. Статус под узлом `Function` изменится на "Полив активен, осталось 10с".

    3. Ровно через 10 секунд в панели `Debug` появится второе сообщение с `payload: false`.

    4. Статус под узлом `Function` изменится на "Готово: полив завершен".

    1. В момент нажатия `Inject` вы должны услышать щелчок реле на Modbus-модуле. Загорится индикатор, соответствующий первому реле.

    2. Электромагнитный клапан также издаст характерный щелчок и откроется (если система подключена к воде, вы увидите поток).

    3. Через 10 секунд вы услышите второй щелчок реле, индикатор погаснет, и клапан закроется.

    Если поведение системы соответствует описанному, лабораторная работа выполнена успешно. Если что-то пошло не так, systematically проверьте каждый этап: схему подключения, настройки Modbus-клиента, код в узле `Function` и сообщения в панели `Debug`.

    ---

    Итоги и дальнейшие шаги

    Поздравляем! Вы успешно собрали, настроили и запрограммировали автоматизированную систему управления клапаном полива на платформе HI. Это не просто учебный пример, а полноценный, готовый к применению на реальном объекте сценарий автоматизации.

    В ходе этой лабораторной работы вы закрепили следующие ключевые навыки:

    Идеи для расширения функционала

    Созданная система является отличной базой для дальнейших усовершенствований. Попробуйте самостоятельно реализовать следующие улучшения:

  • Добавление ручного управления: Создайте в интерфейсе HI-Point (или в Node-RED Dashboard) кнопку, которая будет отправлять ту же команду с `timeout` для запуска полива вручную.
  • Запуск по расписанию: Используйте узел `Inject` в режиме `interval` или специализированные узлы-планировщики (например, `node-red-contrib-cron-plus`), чтобы запускать полив автоматически в определенное время (например, каждый день в 6 утра).
  • Создание "умного" полива: Это задача для следующего уровня. Добавьте в систему датчик влажности почвы. В узле `Function` перед запуском полива проверяйте показания датчика. Если почва уже влажная, полив следует отменить. Этот механизм называется интерлок (блокировка), и мы подробно рассмотрим его в модуле `COURSE-05-M03`.
  • Этот урок заложил прочный фундамент для работы с более сложными исполнительными устройствами и сценариями автоматизации. В следующем модуле мы перейдем к управлению приводами с обратной связью, такими как шаровые краны и сервоприводы.