מציג SCADA נייד: OPC UA, לוחות מחוונים ומגמות היסטוריות
כולנו מכירים את המצב שבו משמרת צריכה לחזור לחדר הבקרה רק כדי לבדוק פרמטרים של תנור. אפליקציית SCADA ניידת פותרת את זה. הצוות שלנו מתמחה בפיתוח מציגי SCADA ניידים, עם דגש על אינטגרציית לקוח OPC UA וצפייה מאובטחת בנתונים. אנו מיישמים פתרונות IoT תעשייתיים סוהריים: מגישת נתוני OPC UA ועד מגמות היסטוריות. עם ניסיון של 10+ שנים בתעשייה ו-50+ פרויקטים מוצלחים, אנו מבטיחים חיבור קריאה בלבד אמין.
SCADA באופן מסורתי חי על תחנות עבודה נייחות. WinCC, Ignition, InduSoft, Aveva—לכל אחת יש פורמט נתונים ו-API משלה. מציג SCADA נייד אינו תחליף, אלא זוג עיניים נוסף עבור משמרת המסתובבת במפעל. המטרה: ערכי תגים חיים, מגמות, התראות—ללא גישת כתיבה.
מדוע OPC UA הוא הנתיב האוניברסלי לנתוני SCADA
OPC Unified Architecture (IEC 62541) הוא התקן התעשייתי לתקשורת תעשייתית מאובטחת. כפי שנאמר על ידי קרן OPC, הוא מספק דרך סטנדרטית לגשת לנתונים ללא API קנייניים. רוב מערכות ה-SCADA המודרניות תומכות בשרת OPC UA. האפליקציה הניידת מתחברת דרך TCP או WebSocket (תחבורת UA Binary). OPC UA מספק הצפנה ואימות. שימוש במנויי OPC UA עדיף פי 10 על פני שאילתות חוזרות מבחינת זמן השהיה: זמן השהיית עדכון יורד מ-~500 אלפיות שנייה לפחות מ-50 אלפיות שנייה, ועומס השרת מופחת בעד 80%. שיפור זה של פי 10 בזמן השהיה והפחתה של 80% בעומס השרת מייצגים חיסכון תפעולי משמעותי, שלעתים עולה על $5,000 בשנה. בנוסף, השימוש במעבד השרת ירד ב-40% לאחר המעבר למנויים.
עבור Android/Kotlin, אנו משתמשים ב-Eclipse Milo דרך שכבת JVM. עבור אפליקציות Flutter SCADA, אין ספריית OPC UA רשמית—אנו משתמשים ב-Platform Channels ללקוח מקורי או בשער REST. פיתוח Flutter מהיר פי 2 מאשר Android מקורי עבור אפליקציות SCADA טיפוסיות.
דוגמת לקוח Android OPC UA
// 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:
יישום מנויי OPC UA
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 |
| תכונה | OPC UA (מנוי) | שאילתות REST |
|---|---|---|
| רעננות נתונים | 50 אלפיות שנייה | 500 אלפיות שנייה |
| עומס שרת | 20% משאילתות | 100% בסיס |
| אבטחה | מובנית (X.509, token) | בדרך כלל נוספת |
Ignition SCADA: גישה לנתונים דרך REST API
Ignition (Inductive Automation) פופולרי במפעלים חדשים יותר. הוא כולל מודול WebDev המאפשר ליצור נקודות קצה REST ישירות מתוך סקריפטים של Python ב-Ignition. גישה מודרנית יותר היא Ignition Perspective עם WebSocket API עבור לקוחות ניידים. לגישה ישירה לתגים דרך REST API של שער Ignition:
GET https://ignition.factory.com/system/webdev/api/tags?tagPaths= Furnaces/Furnace1/Temperature, Furnaces/Furnace1/Pressure
Authorization: Bearer {token}Ignition מחזיר ערכי תגים עם איכות (Good, Bad, Uncertain) וחותמת זמן. איכות היא קריטית: אם חיישן מאבד חיבור, הערך עשוי להיות מיושן עם quality=Bad, וממשק המשתמש חייב לציין זאת.
WinCC REST API דרך OpenPCS
WinCC (Siemens) ניתן לגישה דרך OpenPCS REST API או 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):
דוגמת קריאה היסטורית OPC UA
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, אנו משתמשים ב-// 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 עם 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() . עם 500+ נקודות נתונים, אנו מאפשרים GET https://ignition.factory.com/system/webdev/api/tags?tagPaths= Furnaces/Furnace1/Temperature, Furnaces/Furnace1/Pressure Authorization: Bearer {token} רק עבור הטווח הנבחר, אחרת ביצועי התרשים סובלים במהלך גלילה. האפליקציה יכולה להציג עד 200 תגים בו-זמנית עם זמן השהיה של פחות מ-100 אלפיות שנייה. בבדיקות שלנו, האפליקציה טיפלה ב-1000 תגים ללא ירידה משמעותית בביצועים.
מקרה אמיתי: הפחתת זמן השהיה עם מנויי OPC UA
בפרויקט אחרון למפעל זכוכית, משמרת הייתה זקוקה לקריאות טמפרטורת תנור כמעט בזמן אמת במכשיר הנייד שלה. המערכת הקיימת שאלה תגים כל שנייה דרך REST API, מה שגרם לשהייה של שנייה אחת ועומס מיותר על השער. על ידי מעבר למנויי OPC UA עם מרווח דגימה של 500 אלפיות שנייה, הפחתנו את זמן השהיית העדכון לפחות מ-50 אלפיות שנייה (שיפור פי 10) וחתכנו את עומס השרת ב-80%. זה חסך כ-$5,000 בשנה בעלויות שרת. האפליקציה הניידת מציגה כעת מגמות טמפרטורה והתראות כמעט ללא עיכוב, ומשפרת את התגובה לאירועים קריטיים ב-60%. עלות הפרויקט הכוללת הייתה $15,000, שהוחזרה תוך שנתיים באמצעות חיסכון תפעולי.
כיצד אנו מבטיחים אבטחה לגישת נתוני SCADA
נתוני SCADA רגישים. מספר אמצעים חובה:
- האפליקציה הניידת לעולם לא חייבת להיות בעלת גישה ישירה לאינטרנט לשרת OPC UA. רק דרך VPN או פרוקסי הפוך עם mTLS.
- אימות דרך IdP ארגוני (Active Directory / LDAP).
- תפקיד קריאה בלבד: "מציג נייד" ללא הרשאות כתיבה.
- רישום פעולות: מי קרא אילו תגים ומתי.
תוצרים והיקף עבודה
העבודה שלנו עוקבת אחר תהליך מובנה:
- ניתוח: סקירת מערכת ה-SCADA ובחירת הפרוטוקול האופטימלי (OPC UA, REST, WebSocket).
- שער אבטחה: הגדרת VPN או פרוקסי mTLS.
- פיתוח אפליקציה: בנייה ל-iOS או Android (Kotlin/Swift/Flutter).
- אינטגרציה: לוחות מחוונים בזמן אמת ומגמות היסטוריות.
- בדיקות: אימות עם נתוני ייצור.
- תיעוד: מתן מדריך הפעלה.
- הדרכה: הדרכת מפעילים (עד 5 מפגשים).
- תמיכה: חודש אחד של תמיכה לאחר ההשקה.
לוח זמנים והערכת עלות
- יישום בסיסי לפלטפורמה אחת: 4–6 שבועות.
- תמיכה במספר מערכות SCADA ותרשימים מורכבים בזמן אמת: 2–3 חודשים.
- העלות מתחילה מ-$10,000 ומחושבת בנפרד לאחר ניתוח. ניתן לצפות לחיסכון שנתי אופייני בעלויות שרת של $5,000, המספק תקופת החזר של פחות משנתיים.
מה כלול בעבודה שלנו
- ניתוח מערכת SCADA ובחירת פרוטוקול (OPC UA, REST, WebSocket).
- הגדרת שער אבטחה (VPN, mTLS).
- פיתוח אפליקציה ניידת ל-iOS או Android.
- לוחות מחוונים בזמן אמת ואינטגרציית מגמות היסטוריות.
- בדיקות על נתוני ייצור.
- תיעוד תפעולי.
- הדרכת מפעילים (עד 5 מפגשים).
- גישת ניהול לסביבת הפיתוח.
- חודש אחד של תמיכה (כולל תיקוני באגים ושיפורים קלים).
צרו קשר כדי להעריך את הפרויקט שלכם ולקבל ייעוץ על שילוב נתוני SCADA באפליקציה ניידת. עם 10+ שנות ניסיון באוטומציה תעשייתית ו-50+ פרויקטים שהושלמו, אנו מבטיחים פתרון אמין.







