Реалізація перегляду SCADA-даних у мобільних IoT-додатках
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 транспорт).
Для 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()
Ignition SCADA: REST API та WebDev модуль
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 повертає значення тегів з якістю (Good, Bad, Uncertain) та временною міткою. Якість — важливий параметр: якщо датчик втратив зв'язок, значення може бути застарілим з якістю = Bad, а UI повинна це показати.
WinCC REST API через OpenPCS
WinCC (Siemens) — через REST API OpenPCS або WinCC OA WebClient. Siemens TIA Portal V18+ підтримує 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 тільки для вибраного діапазону, інакше діаграма гальмує при скролінгу.
Безпека та контроль доступу
SCADA-дані — чутлива інформація. Кілька обов'язкових заходів:
- Мобільний додаток ніколи не повинен мати прямий доступ до OPC UA сервера з інтернету. Доступ тільки через VPN або reverse proxy з mTLS.
- Авторизація через корпоративний IdP (Active Directory / LDAP).
- Тільки читання: роль «mobile viewer» без прав на запис тегів.
- Журнали сесії: хто читав які теги і коли.
Розробка мобільного SCADA-переглядача з OPC UA та історичними трендами: 4-6 тижнів для однієї платформи. Підтримка кількох SCADA-систем одночасно та складні дашборди з real-time графіками: 2-3 місяці. Вартість розраховується індивідуально.







