Функция ПЛК и Safe-State
Функция ПЛК и отказоустойчивость в Node-RED
В мире промышленной автоматизации ПЛК (Программируемый Логический Контроллер) является краеугольным камнем надежности. Это специализированное вычислительное устройство, спроектированное для работы в жестких условиях и гарантирующее детерминированное, предсказуемое выполнение управляющих программ в режиме реального времени. Ключевые отличия классического ПЛК от обычного компьютера или одноплатника (как наш контроллер) заключаются в аппаратной и программной архитектуре, нацеленной на максимальную отказоустойчивость.
Такие контроллеры имеют:
- Операционную систему реального времени (ОСРВ), которая гарантирует выполнение критических задач в строго отведенные временные окна.
- Сторожевые таймеры (Watchdog), которые перезагружают устройство в случае зависания основной программы.
- Энергонезависимую память для хранения не только программы, но и текущего состояния всех переменных.
- Гальванически изолированные входы и выходы для защиты от электрических помех и скачков напряжения.
Адаптация концепции ПЛК для систем умного дома
Контроллер нашей платформы, работающий под управлением Debian Linux и Node-RED, по своей сути является "мягким" ПЛК (Soft PLC). Он предоставляет огромную гибкость, широкие возможности интеграции и удобную среду для визуального программирования. Однако стандартная операционная система общего назначения, такая как Debian, не является системой реального времени. Процесс Node-RED может быть остановлен операционной системой, завершиться с ошибкой из-за нехватки памяти или "зависнуть" из-за некорректно написанного потока.
> ⚠️ Внимание: Доверять всю логику, особенно связанную с безопасностью и жизнеобеспечением, исключительно программной среде уровня Node-RED — критическая архитектурная ошибка. Необходимо разделять уровни ответственности.
Именно поэтому наш контроллер имеет гибридную архитектуру. Он сочетает в себе:
Этот нижний, исполнительный уровень выступает в роли страховки. Если верхний уровень (Node-RED) по какой-либо причине выходит из строя, именно исполнительный уровень должен перевести систему в заранее определенное безопасное состояние.
---
Концепция 'Safe-State': проектирование безопасного отказа
Безопасное Состояние (Safe-State) — это предопределенное состояние выходов и исполнительных механизмов, в которое система автоматически переходит в случае отказа управляющей логики верхнего уровня. Это не просто технический термин, а фундаментальная концепция проектирования отказоустойчивых систем. Задача инженера — на этапе проектирования системы ответить на вопрос: "Что должно произойти с каждым устройством, если контроллер зависнет или перезагрузится?".Сценарии отказа могут быть разнообразными:
- Сбой питания: Контроллер внезапно выключился и включился. В каком состоянии должны быть реле после загрузки?
- Зависание процесса Node-RED: Основной процесс, выполняющий всю автоматизацию, перестал отвечать.
- Сбой SD-карты: Файловая система, на которой хранятся потоки Node-RED, перешла в режим "только чтение" или полностью вышла из строя.
- Обновление ПО: Контроллер был штатно перезагружен для установки обновлений, но процесс запуска Node-RED завершился с ошибкой.
> ⚠️ Внимание: Отсутствие продуманного 'Safe-State' может привести не только к дискомфорту (например, неработающий свет), но и к аварийным ситуациям: работе котла отопления без циркуляции, неперекрытые клапаны при протечке, включенные без присмотра мощные электроприборы.
Типовые стратегии Safe-State
Выбор стратегии зависит от функции, которую выполняет конкретный выход контроллера.
| Стратегия | Описание | Примеры применения | Реализация на платформе HI |
| ----------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
| Fail-Safe (Выключено) | Самая распространенная и безопасная стратегия. При отказе все выходы переходят в положение "Выключено". | Освещение, розетки, полив, мультимедиа-оборудование, нагревательные элементы. | Установка состояния "Off" для реле при загрузке в настройках контроллера. |
| Сохранить последнее состояние | Система пытается восстановить то состояние, которое было у выхода до сбоя. | Дежурное/аварийное освещение, некоторые режимы вентиляции, питание сетевого оборудования. | Использование энергонезависимой памяти EEPROM (как рассмотрено в уроке COURSE-01-M07-L03) для хранения состояния. |
| Перейти в аварийный режим | Система активирует специальный, заранее запрограммированный режим работы. | Включить циркуляционный насос котла на минимальную скорость, перевести вентиляцию в приточный режим. | Реализуется через встроенный движок правил (`wb-rules`), не зависящий от Node-RED. |
Проектирование Safe-State — это обязательный этап, который должен быть задокументирован в проектной документации для каждого управляемого контура.
---
Практика: Настройка Safe-State на контроллерах Wirenboard
Наш контроллер, будучи идеологическим наследником Wirenboard, предоставляет схожие мощные механизмы для настройки Safe-State на аппаратном уровне, вне зависимости от работы Node-RED.
> 🔗 Связанный материал: Этот механизм дополняет возможности, рассмотренные в уроке `COURSE-01-M07-L03: Роль EEPROM для надёжного хранения`. Состояние при загрузке может быть записано в энергонезависимую память, что позволяет реализовать стратегию "Сохранить последнее состояние".
Настройка через Web-интерфейс
Это самый простой и быстрый способ для реализации стратегии "Fail-Safe".
Теперь, после каждой перезагрузки контроллера, независимо от того, запустился Node-RED или нет, эти реле гарантированно будут выключены.
Продвинутый способ: использование движка правил `wb-rules`
Для реализации более сложных стратегий, таких как "Аварийный режим" или "Сторожевой таймер для MQTT", используется встроенный движок правил `wb-rules`. Он работает как отдельный легковесный сервис и не зависит от Node-RED. Правила пишутся на простом JavaScript-подобном языке.
Пример: Сторожевой таймер для системы защиты от протечек Задача: Система защиты от протечек управляется через Node-RED. Реле `RL-10` открывает клапан подачи воды. Мы хотим быть уверены, что если Node-RED "зависнет" и перестанет посылать управляющие команды, клапан автоматически закроется через 5 минут. Логика:// Определяем устройство и его элементы управления
defineVirtualDevice("nodered_watchdog", {
title: "Node-RED Watchdog",
cells: {
// Виртуальный таймер на 300 секунд (5 минут)
timer: {
type: "timer",
value: 300 // seconds
}
}
});
// Правило, которое реагирует на сообщение от Node-RED
defineRule("rule_nodered_heartbeat", {
// Выполняется, когда меняется значение в топике .../nodered/control
when: function (value, devName, cellName) {
return devName === "hi_platform/system/watchdog/nodered";
},
// Действие: сбросить таймер
then: function (value, devName, cellName) {
log("Node-RED heartbeat received. Resetting watchdog timer.");
dev["nodered_watchdog"]["timer"] = 300; // Сбрасываем таймер на 5 минут
}
});
// Правило, которое срабатывает, когда таймер истекает
defineRule("rule_leak_protection_failsafe", {
// Выполняется, когда таймер nodered_watchdog досчитал до нуля
when: function (value, devName, cellName) {
return devName === "nodered_watchdog" && cellName === "timer" && value === 0;
},
// Действие: закрыть клапан воды
then: function (value, devName, cellName) {
log.error("Node-RED watchdog timed out! Closing water valve as a precaution.");
// dev["wb-mr6c_35"] - это ID релейного модуля в системе
// "K10" - это ID элемента управления (контрола) реле
dev["wb-mr6c_35"]["K10"] = false; // Отправляем команду на выключение
// Опционально: отправить уведомление администратору через другой канал
}
});
Этот пример демонстрирует мощь двухуровневой архитектуры: Node-RED управляет штатной логикой, а независимый сервис `wb-rules` страхует систему от его отказа.
---
Программная инициализация: Восстановление логики в Node-RED
После того как аппаратный уровень обеспечил базовую безопасность (Safe-State), задача программного уровня (Node-RED) — корректно восстановить свою работу и привести систему в актуальное рабочее состояние. Этот процесс называется программной инициализацией.
> 💡 Подсказка: Разделяйте 'Safe-State' (аппаратный уровень) и 'Initial State' (программный). Safe-State — это про безопасность при отказе. Initial State — про восстановление сложной логики после штатной перезагрузки.
Запуск потока инициализации
Стандартный и самый надежный способ запустить логику инициализации — использовать узел `Inject`.
Эта задержка критически важна. Она дает время операционной системе полностью загрузиться, а всем необходимым драйверам и сервисам (например, MQTT-брокеру, Modbus-клиенту) — установиться и подключиться к устройствам. Попытка опросить устройства сразу после старта Node-RED, скорее всего, приведет к ошибкам.
Построение потока инициализации
Поток инициализации должен выполнить следующие действия:
// Flow: COURSE-01-M07-FLOW01 - System Initialization
// Triggered on Node-RED start
[Inject: 15s delay]--+-->[Function: Prepare MQTT request]-->[MQTT Out: hi/office/light/get]
|
+-->[Function: Prepare Modbus request]-->[Modbus-Read: Thermostat]
|
+-->[Function: Set default variables]
Пример `msg` для запроса состояния по MQTT:
Узел `Function: Prepare MQTT request` может формировать вот такое сообщение:
// Этот поток запускается один раз при старте Node-RED
// Он нужен, чтобы запросить актуальное состояние у всех устройств
// и привести внутренние переменные и UI в соответствие.
msg.topic = 'hi/system/request_state';
// Контракт сообщения для запроса состояний
msg.payload = {
"requester": "nodered-init-flow",
"timestamp": Date.now(),
"targets": ["all"] // Запросить состояние у всех, кто слушает этот топик
};
// Устанавливаем флаг retain=false, т.к. этот запрос актуален только в момент запуска
msg.retain = false;
node.status({fill:"blue",shape:"dot",text:"Requesting all states"});
return msg;
Устройства, получив такое сообщение, должны опубликовать свое текущее состояние в свои `state` топики (например, `hi/office/light/state`). Другой поток в Node-RED, подписанный на эти топики, обновит переменные и интерфейс.
---
Резюме: Двухуровневая модель надёжности
В этом уроке мы рассмотрели двухуровневый подход к построению отказоустойчивой системы умного дома, который является стандартом в нашей академии. Эта модель разделяет ответственность между аппаратным и программным обеспечением, создавая синергию надежности и гибкости.
Уровень 1: Аппаратный 'Safe-State' (Контроллер)- Задача: Обеспечение базовой физической безопасности при полном отказе управляющего ПО.
- Реализация: Настройка состояния выходов при загрузке (через Web-интерфейс) и использование независимого движка правил (`wb-rules`) для реализации сторожевых таймеров и аварийной логики.
- Результат: Предсказуемое и безопасное поведение системы в самых критических ситуациях (зависание, сбой питания).
- Задача: Восстановление сложной пользовательской логики, сценариев и состояний после штатной перезагрузки или редеплоя.
- Реализация: Использование узла `Inject` с задержкой для запуска потока инициализации, который опрашивает реальное состояние устройств и синхронизирует с ним переменные контекста и пользовательский интерфейс.
- Результат: Корректное возобновление работы всех автоматизаций и предоставление пользователю актуальной информации о состоянии системы.
Только совместное применение этих двух подходов позволяет создавать системы автоматизации, которые являются не просто "умными", но и по-настояшему надежными и безопасными, соответствуя высоким стандартам профессионального внедрения.
Что дальше
Теперь, когда вы понимаете теоретические основы и практические методы обеспечения отказоустойчивости, вы готовы применить эти знания на практике. В следующих лабораторных работах вы самостоятельно настроите 'Safe-State' для релейного модуля и создадите поток инициализации в Node-RED для комплексного сценария управления освещением и климатом.