Теплотехник и Flutter: Android-SCADA, где новая котельная — это новый конфиг
Мобильную SCADA на Flutter может собрать инженер КИПиА, если сделать движок конфигурируемым: теги, экраны и тревоги описываются файлом, код остаётся один. Новая котельная получает новый конфиг вместо новой сборки. Труднее всего получается другое: работа в фоне Android, безопасный доступ и запись команд в контроллер.
📟 Три часа ночи: давление упало, а экран остался в диспетчерской
На котельной падает давление в контуре отопления. Контроллер фиксирует событие, но журнал тревог лежит на АРМ в диспетчерской. Теплотехнику звонит дежурный: лампа мигает, причина неизвестна. Встал насос или пошла утечка, выясняется только выездом.
SCADA на объекте работает, лицензия куплена, но мобильного клиента у неё нет. Либо он есть, стоит отдельных денег и показывает урезанный набор экранов. Поэтому инженер решает написать своё приложение: подключиться к контроллеру с телефона и увидеть давление, температуру подачи и состояние насосов.
Ставка понятна без расчётов. Каждый выезд вслепую съедает ночь. А задержка с реакцией на остановку циркуляции в мороз заканчивается размороженным контуром и домом без отопления. Ниже типовой путь такого проекта. Сценарий собирательный, это не история конкретного заказчика.
🔧 Почему граница между КИПиА и IT тоньше, чем кажется
К пятидесяти годам инженер КИПиА знает о SCADA больше, чем видно со стороны. Датчик иногда врёт. Значение без отметки качества нельзя показывать как живое. У тревоги нужен гистерезис, иначе она мигает вокруг уставки. Это половина архитектуры, и курсы программирования её не дают.
Остальное ложится на привычные понятия:
- ✓регистр Modbus становится тегом с именем, типом и масштабом;
- ✓цикл опроса становится потоком значений (Stream в Dart);
- ✓уставка с гистерезисом становится правилом тревоги;
- ✓мнемосхема становится набором виджетов на холсте.
Flutter подходит по двум причинам. Один код даёт приложения для Android и iOS. Hot reload показывает правку мнемосхемы сразу, без пересборки, поэтому схему удобно подгонять на глаз. Dart при этом читается легко, если вы писали на ST в контроллерах или на любом C-подобном языке.
🧱 Архитектура движка: один конфиг и четыре слоя
Универсальность держится на одном правиле: движок ничего не знает про конкретную котельную. Он знает про теги, виджеты и правила, а объект описывает конфигурационный файл.
Драйвер протокола
Modbus TCP работает в локальной сети объекта. Если контроллер говорит по RS-485, между ним и телефоном ставят шлюз. OPC UA и MQTT подключаются отдельными драйверами с тем же интерфейсом: соединиться, прочитать теги, записать тег. Из практики КИПиА сюда добавляются два нюанса. Число с плавающей запятой занимает два регистра, а порядок слов у контроллеров разных производителей отличается, поэтому его задают в конфиге для каждого тега. И читать лучше блок до 125 регистров одним запросом, а не по запросу на тег: иначе опрос большого числа тегов заметно растягивается.
Хранилище тегов
У каждого тега три поля: значение, метка времени и качество (норма, плохое, устарело). Экраны читают только из хранилища и сами в контроллер не ходят. Опрос крутится в отдельном изоляте, поэтому интерфейс не подвисает, когда контроллер отвечает медленно. Историю для трендов держит серверный архив: на телефоне лежит только короткое окно последних значений.
Экраны из конфига
В файле перечислены виджеты: числовое значение, индикатор насоса, задвижка, тренд. Каждый привязан к тегу по имени. Трубы и насосы рисует CustomPainter по координатам из того же файла. Новый объект добавляется новым файлом, а обновление не ждёт проверки в магазине приложений.
Тревоги и права
Правило тревоги состоит из тега, условия, уставки, гистерезиса и задержки срабатывания. Роли делят доступ: наблюдатель смотрит, оператор подтверждает тревоги и отправляет команды, наладчик правит уставки. Каждая запись попадает в журнал.
Порядок работ: от одного регистра до пилота на объекте
- ✓Выписать карту регистров в таблицу: адрес, тип, масштаб, порядок слов, единицы измерения, допустимый диапазон. Ошибка в этой таблице потом дороже любой ошибки в коде.
- ✓Прочитать один тег по Modbus TCP консольной программой на Dart и сверить значение с панелью контроллера.
- ✓Собрать хранилище тегов и один экран с числом и временем последнего обновления.
- ✓Вынести теги и экран в конфиг и проверить, что второй объект запускается без правки кода.
- ✓Подключить тревоги и запустить пилот; диспетчерская SCADA работает параллельно.
Параллельная работа со старой SCADA на время пилота обязательна. Расхождение значений вскрывает ошибки масштаба и порядка слов быстрее любых тестов, а оператор тем временем не остаётся без привычного экрана.
⚠️ Где движок ломается: фон Android, устаревшие данные и запись
Первая ловушка: фон. Приложение работает без сбоев, пока экран горит. Инженер убирает телефон в карман, и через какое-то время выясняется, что тревога не пришла. Причина в экономии батареи: в режиме Doze Android ограничивает доступ к сети, и опрос молча останавливается. Поэтому тревоги нельзя считать внутри приложения. Их вычисляет серверная часть или шлюз на объекте, а на телефон приходит push.
Для опроса в фоне нужен foreground service с постоянным уведомлением. Оболочки ряда производителей убивают фоновые процессы агрессивнее стандартного Android, поэтому приложение просит пользователя исключить его из оптимизации батареи. Google-сервисы доступны не на всех устройствах, так что канал уведомлений закладывают с запасным вариантом: RuStore Push или собственный брокер MQTT.
Вторая ловушка: значение без времени. Связь с контроллером пропала, а на экране висит последнее давление, зелёное и спокойное. Оператор читает его как живое. Поэтому виджет следит за меткой времени: если обновлений нет дольше заданного интервала, значение сереет и появляется подпись «нет связи».
Третья ловушка: запись. Кнопка «включить резервный насос» отправляет команду в работающее оборудование. Нужны роль, диалог подтверждения, проверка допустимого диапазона, журнал «кто, когда, что» и чтение обратной связи. Команда считается выполненной, когда контроллер подтвердил новое состояние, а не когда ушёл пакет. Защиты и блокировки остаются в программе контроллера. Телефон не должен быть единственным барьером между оборудованием и аварией.
Отдельно о доступе. Порт 502 в интернет не открывают. Удалённая работа идёт через VPN или через шлюз, который сам подключается к брокеру MQTT, и тогда входящих соединений на объекте нет. Если объект относится к критической информационной инфраструктуре, требования к удалённому доступу жёстче, и обсуждать их нужно до первой строчки кода.
🌙 Та же ночь, но с приложением в кармане
Следующее падение давления выглядит иначе. Дежурный называет тег, теплотехник открывает экран и смотрит тренд за последние часы. Давление уходило плавно, а не скачком, насосы работают. Вероятнее утечка в контуре, чем отказ циркуляции, и бригаду отправляют сразу с нужным инструментом. В другую ночь причина окажется в остановившемся насосе: оператор подтвердит запуск резервного прямо с телефона и увидит обратную связь от контроллера. Ночной выезд остаётся там, где без него не обойтись.
📊 Свой движок, готовая SCADA или заказная разработка
Свой движок не всегда лучший вариант. Выбор зависит от числа объектов, протоколов и от того, кто будет чинить код через год, когда автор уйдёт в отпуск или на другую работу.
| Вариант | Что получаете | Где упирается | Когда выбирать |
|---|---|---|---|
| Мобильный клиент готовой SCADA | Готовые экраны и поддержка производителя | Лицензия по числу клиентов или тегов, ограниченный набор виджетов, привязка к одному вендору | Объект один, SCADA уже стоит, хватает просмотра значений |
| Свой движок на Flutter силами инженера | Полная гибкость и затраты времени вместо лицензий | Поддержка держится на одном человеке, фон Android, безопасность, публикация в магазинах | Пилот на одном объекте, внутренний инструмент |
| Заказная разработка | Приложение с ролями, push-тревогами, журналом действий и интеграцией с 1С | Бюджет: от 500 000 ₽ | Объектов несколько, доступ нужен подрядчикам или клиентам, данные идут в учёт |
| Веб-интерфейс SCADA в WebView | Быстрый запуск без разработки | Неудобен на телефоне, нет фоновой работы и нативных уведомлений | Временная мера до выбора основного решения |
Прототип на одном объекте закрывает вопрос «что происходит прямо сейчас». Проблемы начинаются, когда приложением пользуются другие. Появляются роли, аудит действий, публикация в RuStore, обновления под новые версии Android. Поддержка всего этого ложится на инженера поверх основной работы.
Считать стоит и поддержку: Android меняет правила работы в фоне почти с каждой крупной версией, поэтому приложение нужно обновлять, даже когда на объекте ничего не менялось.
💼 Когда проект перерастает прототип: что мы делаем и сколько это стоит
Обычно прототип доживает до момента, когда отчёты по расходу тепла нужны директору, а доступ к нескольким объектам нужен подрядчику. После этого приложению нужна команда разработки.
Мы занимаемся разработкой мобильных приложений и подключаем их к 1С. Связка мобильного приложения с учётом в таких проектах выглядит так. Тревога с объекта создаёт заявку на ремонт в 1С: это задача для интеграции приложения с 1С. Показания попадают в отчёт по потреблению. Сервисная бригада подрядчика видит только свои объекты, для этого подходит схема B2B-приложения с 1С.
Разработка мобильного приложения стоит от 500 000 ₽. Итог зависит от числа протоколов, ролей и интеграций. Типовой состав проекта: драйверы протоколов, хранилище тегов, конструктор экранов, push-тревоги, роли и журнал действий. Актуальные условия собраны на странице цен и тарифов.
В техническое задание стоит вписать границу ответственности: приложение показывает и передаёт команды, а защиты остаются в контроллере. Тогда через год никто не спорит, кто отвечает за остановку оборудования.
Рабочий прототип инженера выбрасывать не нужно: он становится техническим заданием. Карта регистров, список тегов и сценарии тревог избавляют подрядчика от выяснения, что к чему подключено. Для оценки достаточно карты регистров и перечня тревог.
❓ Частые вопросы
Можно ли написать мобильную SCADA на Flutter без опыта в программировании?
Прототип для одного объекта можно, если есть время и карта регистров контроллера. Инженер КИПиА быстро осваивает Dart, потому что понимает теги, уставки и качество сигнала. Основные сложности появляются позже: фоновая работа Android, push-тревоги, безопасный удалённый доступ и запись команд. Для них обычно нужен опытный мобильный разработчик.
Какие протоколы поддерживает мобильная SCADA на Flutter?
Движок не привязан к протоколу: каждый протокол подключается драйвером с одинаковым интерфейсом. Чаще всего начинают с Modbus TCP в локальной сети объекта. Контроллеры на RS-485 подключают через шлюз, а OPC UA и MQTT добавляют отдельными драйверами, когда нужен удалённый доступ или работа через брокер.
Безопасно ли управлять оборудованием котельной с телефона?
Безопасно, если соблюдены условия: защиты и блокировки остаются в программе контроллера, каждая команда проходит через роль, подтверждение и журнал, а доступ идёт через VPN или шлюз без открытых портов. Телефон не должен быть единственным барьером. Для объектов КИИ требования к удалённому доступу строже.
Сколько стоит разработка мобильного приложения для диспетчеризации?
Разработка мобильного приложения у нас стоит от 500 000 ₽. Итоговая сумма зависит от числа протоколов и объектов, ролей, тревог и интеграций, например с 1С. Для оценки понадобятся карта регистров контроллера, перечень тревог и описание ролей. Готовый прототип сокращает время на аналитику.
Чем своя SCADA на Flutter лучше мобильного клиента готовой SCADA?
Свой движок снимает ограничения лицензий и набора виджетов, а экраны меняются конфигом без новой версии в магазине. Взамен поддержка ложится на вас: фон Android, безопасность и обновления. Готовый клиент проще, когда объект один, SCADA уже стоит и хватает просмотра значений. Решать стоит по числу объектов и по тому, кто будет поддерживать код.
Или позвоните: +7 906 045-28-27 — в рабочее время с 9:00 до 19:00
Остались вопросы? Нужна помощь?
Менеджеры компании с радостью ответят на ваши вопросы, произведут расчет стоимости услуг и подготовят индивидуальное коммерческое предложение.
Бесплатная консультация

