Ми стикалися з ситуацією, коли майстер зміни змушений повертатися на пульт, щоб перевірити параметри печі. Мобільний SCADA-застосунок вирішує цю проблему. Реалізуємо перегляд SCADA-даних під ключ: від інтеграції з OPC UA до побудови історичних трендів. Наші інженери мають 5+ років досвіду в розробці мобільних SCADA-рішень і гарантують надійне підключення без права керування.
SCADA-система — Supervisory Control and Data Acquisition — живе на стаціонарних робочих станціях оператора. WinCC, Ignition, InduSoft, Aveva — у кожної свій формат даних, свої API, своя історія сумісності. Мобільний застосунок для перегляду SCADA-даних — це не заміна стаціонарного клієнта, а «другі очі» для майстра зміни, який ходить по цеху. Завдання: актуальні дані тегів, тренди, алерти — без права керування.
Чому OPC UA — універсальний шлях до SCADA-даних?
Більшість сучасних SCADA-систем підтримують OPC UA сервер. Це стандартний шлях отримати дані без пропрієтарних API. Мобільний застосунок підключається до OPC UA сервера через TCP або WebSocket (OPC UA over WebSocket, UA Binary транспорт). OPC UA забезпечує шифрування на транспортному рівні та аутентифікацію, що критично для промислової безпеки.
Бібліотека для Android/Kotlin — Eclipse Milo через JVM-шар, або Eclipse4J. Для Flutter — немає офіційної OPC UA бібліотеки, використовуємо Platform Channels до нативного клієнта або REST-шлюз:
// Android, Eclipse Milo OPC UA Client val client = OpcUaClient.create( "opc.tcp://scada-server.factory.local:4840", endpointFilter = { endpoints -> endpoints.filter { it.securityMode == MessageSecurityMode.SignAndEncrypt } .minByOrNull { it.securityPolicyUri } }, configConsumer = { configBuilder -> configBuilder.setIdentityProvider( UsernameProvider("operator", "password") ) configBuilder.setRequestTimeout(UInteger.valueOf(5000)) } ) client.connect().get() // Читання тегів по NodeId val nodeId = NodeId(2, "Furnace1.Temperature") val dataValue = client.readValue(0.0, TimestampsToReturn.Both, nodeId).get() val temperature = (dataValue.value.value as Float).toDouble() val serverTimestamp = dataValue.serverTime Для перегляду кількох сотень тегів одночасно — підписка через OPC UA Subscription замість polling:
val subscription = client.subscriptionManager .createSubscription(1000.0) // publishing interval 1000ms .get() val monitoredItems = nodeIds.map { nodeId -> MonitoredItemCreateRequest( ReadValueId(nodeId, AttributeId.Value.uid(), null, null), MonitoringMode.Reporting, MonitoringParameters( UInteger.valueOf(clientHandleCounter++), 500.0, // sampling interval null, UInteger.valueOf(10), // queue size true ) ) } subscription.createMonitoredItems( TimestampsToReturn.Both, monitoredItems, { item, value -> handleTagUpdate(item.readValueId.nodeId, value) } ).get() | Протокол | Затримка оновлення | Безпека | Сумісність |
|---|---|---|---|
| OPC UA | <50 мс (підписка) | Шифрування + аутентифікація | Майже всі сучасні SCADA |
| REST API | 200–500 мс | Залежить від реалізації | Тільки системи з REST модулем |
Ignition SCADA: як отримати дані через REST API?
Ignition (Inductive Automation) популярний на нових виробництвах. У ньому є WebDev модуль, який дозволяє створювати REST endpoints прямо з Ignition Python scripts. Більш сучасний шлях — Ignition Perspective з WebSocket API для мобільних клієнтів.
Для прямого REST доступу до тегів через Ignition Gateway REST API:
GET https://ignition.factory.com/system/webdev/api/tags?tagPaths= Furnaces/Furnace1/Temperature, Furnaces/Furnace1/Pressure Authorization: Bearer {token} Ignition віддає значення тегів з quality (Good, Bad, Uncertain) і timestamp. Quality — важливий параметр: якщо датчик втратив зв'язок, значення може бути застарілим з quality = Bad, а UI має це показати.
WinCC REST API через OpenPCS
WinCC (Siemens) — через REST API OpenPCS або через WinCC OA WebClient. Siemens TIA Portal підтримує WinCC Unified, який має власний WebSocket API через nginx-проксі. Для старих WinCC Classic — тільки OPC DA (DCOM) або OPC UA з установкою шлюзу Matrikon/Kepware на сервері SCADA.
Як реалізувати історичні тренди?
SCADA зберігає історію тегів у вбудованій БД (Ignition — MySQL/MSSQL, WinCC — SIMATIC historian). Запит через OPC UA Historical Data Access (HDA):
val historyReadRequest = HistoryReadValueId( nodeId = NodeId(2, "Furnace1.Temperature"), indexRange = null, dataEncoding = null ) val readDetails = ReadRawModifiedDetails( isReadModified = false, startTime = startDateTime.toOpcDateTime(), endTime = endDateTime.toOpcDateTime(), numValuesPerNode = UInteger.valueOf(500), isReturnBounds = true ) val historyData = client.historyRead( readDetails, TimestampsToReturn.Source, false, listOf(historyReadRequest) ).get() Для відображення трендів у Flutter — fl_chart з LineChart. При 500+ точках використовуємо showingTooltipIndicators тільки для вибраного діапазону, інакше chart гальмує при скролі.
Як забезпечити безпеку доступу до SCADA-даних?
SCADA-дані — чутлива інформація. Кілька обов'язкових заходів:
- Мобільний застосунок ніколи не повинен мати прямий доступ до OPC UA сервера з інтернету. Тільки через VPN або зворотний проксі з mTLS.
- Авторизація через корпоративний IdP (Active Directory / LDAP).
- Тільки читання: роль «mobile viewer» без прав на запис тегів.
- Сесійні логи: хто читав які теги і коли.
Приклад з практики
На одному з проектів для металургійного заводу ми інтегрували мобільний SCADA-в'ювер з WinCC Unified. Раніше майстер зміни витрачав до 10 хвилин на перехід до пульту для перевірки температури печі. Після впровадження застосунку на Android час отримання даних скоротився до 1.2 секунди завдяки OPC UA Subscription. Кількість позапланових простоїв зменшилася на 12% за перший місяць.
Що входить у роботу?
- Аналіз SCADA-системи та вибір оптимального протоколу (OPC UA, REST, WebSocket).
- Налаштування шлюзу безпеки (VPN, mTLS).
- Розробка мобільного застосунку під iOS або Android (Kotlin/Swift/Flutter).
- Інтеграція real-time дашбордів та історичних трендів.
- Тестування на виробничих даних.
- Документація з експлуатації.
- Навчання операторів.
- Підтримка протягом 1 місяця.
Орієнтири за термінами
Розробка мобільного SCADA-в'ювера з OPC UA та історичними трендами: 4-6 тижнів для однієї платформи. Підтримка кількох SCADA-систем одночасно та складні дашборди з real-time чартами — 2-3 місяці. Вартість розраховується індивідуально.
Свяжіться з нами для оцінки вашого проекту. Отримайте консультацію щодо інтеграції SCADA-даних у мобільний застосунок. Наш досвід і гарантія якості — основа надійного рішення.







