Лабораторная работа: COURSE-05-M02-LAB01 'Клапан полива по таймеру'
Введение и цели лабораторной работы
Данная лабораторная работа является ключевой практикой для закрепления навыков управления исполнительными устройствами. Мы создадим с нуля полностью рабочую систему автоматического полива, которая активирует подачу воды на заданное время. Этот сценарий является классическим примером применения шаблона "На заданное время" (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-устройств поставляются с заводским адресом `1`. Если на вашей шине RS-485 будет несколько устройств, необходимо присвоить каждому уникальный адрес.
* Найдите на корпусе релейного модуля DIP-переключатели или следуйте инструкции производителя для программной настройки адреса. Для данной лабораторной работы установим `Modbus ID = 10`. Запишите этот адрес, он понадобится для настройки в Node-RED.
* Для связи контроллера 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]`
- `Inject`: Узел для ручного запуска и тестирования. Он будет инициировать поток, отправляя сообщение с параметрами полива.
- `Function`: "Мозг" нашей системы. Здесь будет реализована логика шаблона "Timed" — включение реле и запуск таймера на его отключение.
- `modbus-write`: Исполнительный узел. Он преобразует команду из Node-RED в посылку протокола Modbus и отправляет ее на релейный модуль для физического замыкания или размыкания контактов.
Настройка узла `modbus-write`
* Type: `Serial`
* Serial Port: Укажите порт вашего контроллера, к которому подключен адаптер RS-485 (например, `/dev/ttyUSB0`).
* Serial-Type: `RTU`
* Baud Rate: `9600` (или другое значение, соответствующее настройкам вашего релейного модуля).
* Data Bits: `8`, Parity: `None`, Stop Bits: `1`. Это наиболее распространенная конфигурация (`8N1`).
* 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
}
}
- `msg.payload.timeout`: Ключевой параметр, указывающий длительность работы в секундах.
Узел `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;
Разбор кода
- Шаг 1 (Валидация): Первое, что делает надежный код, — проверяет входящие данные. Мы убеждаемся, что получили `timeout` и это корректное число. Если нет — выводим ошибку и прекращаем работу.
- Шаг 2 (Включение): Мы немедленно отправляем команду на включение (`{ payload: true }`) с помощью функции `node.send()`. Это сообщение получит наш узел `modbus-write`, и реле замкнется.
- Шаг 3 (Таймер): С помощью стандартной функции JavaScript `setTimeout()` мы "планируем" отправку команды на выключение. Внутренняя функция `() => { ... }` будет вызвана ровно через `timeoutMilliseconds`. Когда это произойдет, она сформирует и отправит сообщение на выключение (`{ payload: false }`).
- Шаг 4 (Блокировка): В конце мы возвращаем `null`. Это очень важный момент. Он говорит среде Node-RED, что исходное сообщение (`msg` с `payload.timeout`) не нужно передавать дальше по потоку. Без этого оно бы тоже попало в `modbus-write` и вызвало бы ошибку, так как `modbus-write` не понимает такой `payload`.
---
Тестирование и отладка системы
После сборки схемы и написания кода наступает самый ответственный этап — проверка работоспособности.
> 💡 Подсказка: Настройте панель вывода узла `debug` на отображение полного объекта сообщения (`complete msg object`). Это позволит вам видеть не только `payload`, но и другие важные свойства, такие как `topic`, `_msgid` и информацию об ошибках. Это критически важно для глубокой отладки.
План тестирования
* Разместите узел `Debug` на холсте и подключите его к выходу узла `Function`. Это позволит нам видеть, какие именно команды (`true` и `false`) отправляются на Modbus-реле.
* Разместите еще один узел `Debug` и подключите его к второму выходу узла `modbus-write` (выход для ошибок), чтобы отловить возможные проблемы связи.
* Создайте узел `Inject` и настройте его на отправку тестовой команды.
* Дважды кликните по узлу `Inject`.
* В поле `Payload` выберите тип `JSON`.
* В текстовое поле введите следующий объект:
{
"timeout": 10
}
Мы используем короткий интервал в 10 секунд для быстрого теста.
* По желанию, в поле `Topic` можно указать `commands/irrigation/zone1/set`.
* Разверните (`Deploy`) изменения в Node-RED.
* Откройте боковую панель `Debug`.
* Нажмите на кнопку узла `Inject`.
Ожидаемый результат
- В Node-RED:
2. Статус под узлом `Function` изменится на "Полив активен, осталось 10с".
3. Ровно через 10 секунд в панели `Debug` появится второе сообщение с `payload: false`.
4. Статус под узлом `Function` изменится на "Готово: полив завершен".
- Физически:
2. Электромагнитный клапан также издаст характерный щелчок и откроется (если система подключена к воде, вы увидите поток).
3. Через 10 секунд вы услышите второй щелчок реле, индикатор погаснет, и клапан закроется.
Если поведение системы соответствует описанному, лабораторная работа выполнена успешно. Если что-то пошло не так, systematically проверьте каждый этап: схему подключения, настройки Modbus-клиента, код в узле `Function` и сообщения в панели `Debug`.
---
Итоги и дальнейшие шаги
Поздравляем! Вы успешно собрали, настроили и запрограммировали автоматизированную систему управления клапаном полива на платформе HI. Это не просто учебный пример, а полноценный, готовый к применению на реальном объекте сценарий автоматизации.
В ходе этой лабораторной работы вы закрепили следующие ключевые навыки:- Физическое подключение: Вы научились правильно коммутировать исполнительные устройства, блоки питания и модули расширения, используя шину RS-485.
- Работа с промышленными протоколами: Вы настроили узел для обмена данными по Modbus RTU, указав адрес устройства, функцию и регистр.
- Программирование логики: Вы написали код на JavaScript в узле `Function`, реализующий надежный таймер с валидацией входных данных.
- Применение контрактов: Вы использовали стандартизированный `контракт сообщения` для передачи параметров управления, что делает систему гибкой и расширяемой.
- Отладка и тестирование: Вы применили системный подход к проверке работоспособности, используя инструменты Node-RED и наблюдая за поведением физического оборудования.
Идеи для расширения функционала
Созданная система является отличной базой для дальнейших усовершенствований. Попробуйте самостоятельно реализовать следующие улучшения:
Этот урок заложил прочный фундамент для работы с более сложными исполнительными устройствами и сценариями автоматизации. В следующем модуле мы перейдем к управлению приводами с обратной связью, такими как шаровые краны и сервоприводы.