
Почему SCADA устарела и что не устраивало
Моя старая SCADA-система (на базе Wonderware) работала на отдельном ПК с Windows XP. Она управляла отоплением, освещением и вентиляцией. Основные недостатки: закрытая лицензия ($2000+ за копию), невозможность удалённого доступа без VPN, сложность добавления новых устройств (требовалось перепрограммирование PLC и перекомпиляция SCADA). Кроме того, каждый год требовалось продление поддержки. Наконец, WinCC из той же эпохи тоже не блистала гибкостью.
Выбор ioBroker как современной альтернативы
ioBroker — open-source платформа для автоматизации, работающая на Node.js. Она поддерживает сотни адаптеров, включая MQTT, HTTP, Zigbee, и имеет REST API. Главное преимущество: модульность. Я смог оставить PLC как конечные устройства, а управление вынести на ioBroker. Однако для связи с PLC требовался адаптер OPC DA — его нет. Пришлось создавать мост между OPC DA и OPC UA.
Проектирование самописного OPC-сервера
Я выбрал Node.js и библиотеку node-opcua для реализации OPC UA сервера. Сперва хотел использовать готовые шлюзы, но они стоили дорого ($500+) и не давали гибкости. Мой сервер должен: 1) читать данные через OPC DA (используя DCOM) — для этого пришлось написать C++ модуль, оборачивающий COM-интерфейс; 2) представлять их как OPC UA переменные. Ниже фрагмент кода сервера (упрощённый).
const { OPCUAServer, DataType, Variant } = require('node-opcua');
const opcDaClient = require('./opcDaClient'); // самописный модуль
const server = new OPCUAServer({
port: 4840,
resourcePath: '/UA/PLC',
buildInfo: { productName: 'MyOPCServer', buildNumber: '1' }
});
server.initialize(async () => {
const namespace = server.engine.getNamespace(1);
const folder = namespace.addObject({ organizedBy: server.engine.rootFolder.objects, browseName: 'PLCData' });
// Добавляем переменные для каждого PLC
['Temperature', 'Pressure', 'Light'].forEach(name => {
namespace.addVariable({
componentOf: folder,
browseName: name,
dataType: DataType.Float,
value: { get: () => new Variant({ dataType: DataType.Float, value: opcDaClient.read(name) }) }
});
});
await server.start();
console.log('OPC UA server is running on port 4840');
});Важно: Код выше предполагает наличие C++ модуля для DCOM. Для упрощения можно использовать готовую библиотеку opc-da-client (npm), которая обёртывает OPC DA через OPCEnum. Однако на практике DCOM требует настройки безопасности на Windows-машине с PLC.Сравнение старой SCADA и новой связки ioBroker + OPC сервер
| Параметр | SCADA (Wonderware) | ioBroker + самописный OPC |
|---|---|---|
| Стоимость лицензии | $2000 + ежегодное продление | Бесплатно (open-source) |
| Гибкость | Низкая (только Windows) | Высокая (любая OS, Docker) |
| Интеграция с новыми устройствами | Требует PLC-программиста | Через адаптеры ioBroker (MQTT, BLE и т.д.) |
| Удалённый доступ | VPN или RDP | Веб-интерфейс, облачные сервисы |
| Сложность разработки | Средняя (графический редактор) | Высокая (требует Node.js, понимания OPC) |
| Масштабируемость | До 10 PLC | Не ограничена |
Настройка ioBroker для работы с OPC-сервером
Установите адаптер OPC UA в ioBroker и укажите адрес вашего сервера: opc.tcp://localhost:4840/UA/PLC. Адаптер автоматически обнаружит все переменные. Затем можно создавать сценарии, визуализации и дашборды. Пример скрипта для записи значения:
const temperature = getState('opcua.0.PLCData.Temperature').val;
if (temperature > 25) {
setState('opcua.0.PLCData.Light', 0); // выключить свет
}Советы и предостережения
- Безопасность: OPC UA поддерживает шифрование, включите его в настройках сервера.
- Производительность: Используйте OPC DA через локальный COM (без сетевого DCOM) для снижения задержек.
- Отказоустойчивость: Добавьте watchdog для перезапуска OPC-сервера при сбое.
Личное наблюдение автора
Самым сложным оказалось наладить DCOM между машинами с разными версиями Windows. В итоге я запустил OPC DA клиент на том же ПК, где стояла SCADA, и передавал данные по TCP в мой Node.js сервер на Linux. Это добавило задержку в 50 мс, но для умного дома это некритично. Зато теперь я могу управлять светом и отоплением через Telegram-бота, чего раньше не было. Проект занял около месяца вечеров, но экономия на лицензиях окупилась за полгода.
Часто задаваемые вопросы
Вопрос: Можно ли обойтись без написания OPC-сервера, используя готовые шлюзы?
Ответ: Да, существуют коммерческие шлюзы (например, Kepware, Matrikon), но они стоят от $1000. Самописный вариант дешевле и даёт полный контроль.
Вопрос: Какие альтернативы ioBroker существуют?
Ответ: Home Assistant, OpenHAB. Но ioBroker имеет лучшую поддержку OPC UA через адаптер.
Резюме
Миграция с монолитной SCADA на ioBroker возможна даже при наличии старых PLC с OPC DA. Ключевое — написать промежуточный OPC-сервер. Мой опыт показывает, что это реально сделать силами одного разработчика за разумное время. В итоге получаем современную, гибкую и недорогую систему умного дома.