«Русло»: как строится IIoT-платформа для закрытой сети предприятия
Заказчики промышленных систем задают один и тот же вопрос: «А вы можете без облака?». В цехе интернета нет, а иногда его нельзя подключать по требованиям безопасности. Из этого вопроса выросла «Русло» — IIoT-платформа, которая собирает телеметрию с оборудования, хранит её и показывает инженерам. Расскажу, какие решения лежат в основе и почему они такие.
Какую задачу решает платформа
На производстве десятки станков и датчиков, и каждый говорит на своём протоколе. Нужно собрать данные, не потерять их, показать в понятном виде и вовремя предупредить, что показатель вышел за порог. Всё это должно работать внутри закрытой сети предприятия, без облачных зависимостей и сторонних лицензий.
Четыре канала приёма данных
«Русло» принимает телеметрию по четырём независимым каналам:
| Протокол | Где встречается |
|---|---|
| MQTT | датчики и шлюзы, публикующие данные сами |
| HTTP | интеграции и скрипты |
| Modbus TCP | контроллеры и приборы |
| OPC UA | современные системы автоматизации |
Здесь важна деталь: платформа использует метку времени источника, а не время опроса. Если шлюз накопил данные из-за сбоя связи и отправил их пачкой, они лягут на график в тот момент, когда реально были измерены. Для анализа технологического процесса это принципиально: иначе кривые поплывут, а выводы окажутся неверными.
Предприятие как дерево
Данные организованы деревом «завод → цех → участок → станок → показатель». Это не просто удобная навигация. Доступ ограничивается по ветке: мастер участка видит свой участок, начальник цеха — цех, директор — всё. Права строятся на структуре предприятия, а не на списке разрешённых экранов.
Хранение временных рядов в ClickHouse
Телеметрия — это огромный поток однотипных записей. Обычная реляционная база на таком потоке задыхается, поэтому для временных рядов я выбрал ClickHouse. Платформа:
- автоматически считает минутные и часовые агрегаты, чтобы графики за месяц строились мгновенно;
- использует многоуровневое хранение: свежие данные хранятся подробно, старые — в агрегированном виде;
- не заставляет инженера думать о том, откуда берётся тот или иной график.
Для остальных данных платформы (пользователи, права, настройки) в стеке стоит Postgres. Каждое хранилище отвечает за то, в чём оно сильно.
Мнемосхемы, уведомления и расширения
Интерфейс на Vue 3 дополняют:
- 2.5D-мнемосхемы цеха — наглядная схема, где видно, какой агрегат в каком состоянии;
- уведомления по порогам с журналом доставки: можно проверить, что сообщение ушло и кому;
- модули расширений от сторонних разработчиков. Они устанавливаются как пакеты и появляются в интерфейсе без пересборки платформы.
Работа без интернета
Закрытая сеть — не ограничение, а проектное требование. Поэтому в «Русле»:
- нет обращений к облачным сервисам во время работы;
- нет сторонних лицензий и доступа в интернет;
- весь стек разворачивается на серверах предприятия.
Платформа написана на Rust. Для такой системы мне важны три свойства языка: безопасность работы с памятью, отсутствие сборщика мусора с неожиданными паузами и возможность собрать самодостаточный артефакт. Подробнее, почему безопасность закладывается на этапе проектирования, — в статье Безопасная разработка ПО: как защита закладывается с первого дня.
Как проверять такую платформу
Платформа, которая собирает телеметрию, должна быть проверена на потерях и задержках. Для этого я использую отдельный стенд — «Исток». Он генерирует поток данных, проверяет целостность по SHA-256 и измеряет задержку. Так нагрузочное тестирование становится частью разработки, а не формальностью перед сдачей. Как вообще строится проверка перед релизом, я описал в статье Тестирование и приёмка ПО: как убедиться, что система работает до релиза.
Нужна похожая система?
Если вам нужна платформа сбора и анализа данных для производства, а также любой продукт с жёсткими требованиями к надёжности и изоляции сети, давайте обсудим: Telegram @w1shmaster. Начнём с Архитектура ПО: проектирование и планирование до первой строки кода, потому что именно оно определяет, сколько система проживёт.