Мы сталкивались с ситуацией, когда мастер смены вынужден возвращаться на пульт, чтобы проверить параметры печи. Мобильное 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-системы и выбор оптимального протокола (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-данных в мобильное приложение. Наш опыт и гарантия качества — основа надёжного решения.







