פיתוח אפליקציית שליטה ניידת למכונות CNC
אנו מפתחים אפליקציות ניידות למכונות CNC תעשייתיות. Fanuc, Siemens Sinumerik, Heidenhain TNC, LinuxCNC — לציוד זה דרישות מחמירות לאמינות, בטיחות ודיוק. אפליקציה ניידת משלימה את לוח הבקרה של המפעיל: מאפשרת שליטה בביצוע התוכנית, העלאת קודי G, ניטור טלמטריה של הציר והצירים, וקבלת התראות חירום. על ידי אינטגרציה עם פרוטוקולים מודרניים כמו MTConnect ו-OPC UA, אתה מקבל נתוני מכונה בזמן אמת מכל מכשיר — אפילו מטאבלט. זה מועיל במיוחד לניטור מרחוק ולתגובה מהירה לתקלות.
אתגר טיפוסי הוא אינטגרציה עם ממשקים הטרוגניים. ללא ניסיון עמוק, קל לבחור בפרוטוקול הלא נכון או להיתקל בתכונות לא מתועדות. במשך יותר מ-10 שנים, חיברנו יותר מ-50 מכונות מיצרנים שונים, והפחתנו את זמן האינטגרציה ב-40%. לדוגמה, באמצעות MTConnect תפסנו נתונים ב-95% עומס מכונה, מה שאיפשר לנו לחזות בלאי כלים ולהפחית השבתות לא מתוכננות. החיסכון ללקוח הגיע עד 15,000 דולר לשנה רק ממניעת עצירות חירום.
חשוב להבין: שליטה ניידת ב-CNC היא לא צעצוע. טעויות עלולות לגרום נזק לכלים או לפגמים. לכן, הליבה של הארכיטקטורה שלנו היא בטיחות, ביקורת ובידוד. להלן, נסקור אילו פרוטוקולים וגישות אנו משתמשים בהם.
ממשקי CNC תעשייתיים
כל יצרן CNC מספק API משלו. רמת הפתיחות משתנה:
| מערכת | פרוטוקול/API | תעבורה |
|---|---|---|
| Siemens Sinumerik | OPC UA (S7 אופציונלי) | Ethernet |
| Fanuc FOCAS | FOCAS2 DLL (Windows) או REST דרך MTConnect | TCP |
| Mitsubishi CNC | CNC Open API REST | Ethernet |
| LinuxCNC | XML-RPC, HAL remote | TCP |
| Heidenhain TNC | ממשק DNC, LSV2 | RS-232/Ethernet |
| Haas | MTConnect / Haas API | Ethernet |
MTConnect — תקן פתוח (ANSI/MTC1.4) לקריאת מצב מכונה. רוב היצרנים הגדולים תומכים בו כממשק נוסף.
איך לבחור פרוטוקול: MTConnect לעומת OPC UA?
MTConnect פשוט יותר וטוב יותר לקריאת נתונים: מהירות שאילתה עד 10 הרץ, אינטגרציית HTTP קלה. OPC UA מיועד להחלפה דו-כיוונית ושליטה: עד 20 הרץ, מנגנוני אבטחה מובנים. לניטור בלבד, MTConnect מספיק. לשליטה פעילה (הפעלת תוכניות, תיקון קואורדינטות) בחר ב-OPC UA. OPC UA מהיר פי 2 בערך לפעולות כתיבה אך דורש יותר הגדרה.
| קריטריון | MTConnect | OPC UA |
|---|---|---|
| מטרה | ניטור (קריאה בלבד) | קריאה + כתיבה |
| מהירות | עד 10 הרץ | עד 20 הרץ |
| אבטחה | אין מובנית | הצפנה, אימות |
| מורכבות | נמוכה | בינונית |
| תמיכה | רחבה (Fanuc, Haas, Mazak) | Siemens, Beckhoff, ABB |
MTConnect: קריאת נתוני מכונה
סוכן MTConnect מספק API HTTP. קריאות זורמות דרך current (תמונת מצב) ו-sample (היסטוריה עם חיץ):
class MTConnectClient(private val agentUrl: String) {
suspend fun getCurrent(): MTConnectDocument {
val response = httpClient.get("$agentUrl/current") {
accept(ContentType.Application.Xml)
}
return parseMTConnectXml(response.bodyAsText())
}
// Long-polling стрим изменений от sequence number
fun streamSamples(from: Long? = null): Flow<MTConnectEvent> = flow {
var nextSequence = from
while (true) {
val url = if (nextSequence != null) "$agentUrl/sample?from=$nextSequence&count=100" else "$agentUrl/sample?count=100"
val response = httpClient.get(url)
val doc = parseMTConnectXml(response.bodyAsText())
doc.streams.forEach { stream ->
stream.events.forEach { event ->
emit(event)
}
}
nextSequence = doc.header.nextSequence
if (doc.streams.isEmpty()) delay(500)
}
}
}פריטי נתונים טיפוסיים: class MTConnectClient(private val agentUrl: String) { suspend fun getCurrent(): MTConnectDocument { val response = httpClient.get("$agentUrl/current") { accept(ContentType.Application.Xml) } return parseMTConnectXml(response.bodyAsText()) } // Long-polling стрим изменений от sequence number fun streamSamples(from: Long? = null): Flow<MTConnectEvent> = flow { var nextSequence = from while (true) { val url = if (nextSequence != null) "$agentUrl/sample?from=$nextSequence&count=100" else "$agentUrl/sample?count=100" val response = httpClient.get(url) val doc = parseMTConnectXml(response.bodyAsText()) doc.streams.forEach { stream -> stream.events.forEach { event -> emit(event) } } nextSequence = doc.header.nextSequence if (doc.streams.isEmpty()) delay(500) } } } (ACTIVE/STOPPED/INTERRUPTED), execution, program, line/Xact/Yact, Zact, Sspeed. ניתן להגדיר מרווח שאילתה נמוך עד 100 אלפיות השנייה.
OPC UA: Siemens Sinumerik
עבור Sinumerik 840D sl — שרת OPC UA מובנה ב-NCU. מרחב השמות של Siemens (load) מכיל צמתים לכל הפרמטרים. חיבור דרך Eclipse Milo:
class SinumerikOpcUaClient(private val endpoint: String) {
private lateinit var client: OpcUaClient
suspend fun connect() {
val endpoints = DiscoveryClient.getEndpoints(endpoint).await()
val ep = endpoints.first { it.securityPolicyUri == SecurityPolicy.None.uri }
client = OpcUaClient.create(
ep.endpointUrl,
endpointFilter = { it == ep },
configurer = { config ->
config.setIdentityProvider(UsernameProvider("OpcUaClient", "password"))
}
)
client.connect().await()
}
suspend fun readSpindleSpeed(): Double {
val nodeId = NodeId.parse("ns=2;s=/NC/Spindle[u1,1]/actSpeed")
val value = client.readValue(0.0, TimestampsToReturn.Both, nodeId).await()
return (value.value.value as Number).toDouble()
}
fun subscribeToAxisPositions(callback: (AxisPositions) -> Unit) {
val subscription = client.subscriptionManager.createSubscription(500.0).await()
val nodes = listOf("Xact", "Yact", "Zact").map { axis ->
NodeId.parse("ns=2;s=/NC/Channel[u1,1]/MachineAxis[$axis]/actPos")
}
subscription.createMonitoredItems(
TimestampsToReturn.Both,
nodes.map { MonitoredItemCreateRequest(
ReadValueId(it, AttributeId.Value.uid(), null, null),
MonitoringMode.Reporting,
MonitoringParameters(0.0, 100.0, null, 10, true)
) },
) { item, _ ->
item.setValueConsumer { _, value ->
/* обновляем позицию оси */
}
}
}
}OPC UA נותן לנו עדכוני נתונים ב-20 הרץ, מהיר משמעותית מה-10 הרץ האופייני של MTConnect.
למה בטיחות קריטית לשליטה ניידת?
כתיבת פקודות ל-CNC היא פעולה מסוכנת פוטנציאלית. פרצת אבטחה עלולה לגרום לשבירת כלי או לפציעה. אנו מיישמים הגנה בארבע שכבות:
- אימות והרשאה: JWT עם TTL קצר, MFA לפעולות קריטיות.
- אזור רשת: CNC ברשת ייצור מבודדת, שער API כנקודת כניסה יחידה.
- מנעולים: פקודת התנעת תוכנית חסומה אם דלת המכונה פתוחה (נתונים מ-PLC הבטיחות). האפליקציה אינה עוקפת מנעולים פיזיים.
- ביקורת: כל פקודה מתועדת עם חותמת זמן, מזהה משתמש, כתובת IP מקור.
suspend fun startProgram(programName: String) {
val state = getMachineState()
require(state.doorsClosed) { "Дверь станка открыта" }
require(state.execution == Execution.STOPPED) { "Станок не остановлен" }
require(state.emergencyStop == EmergencyStop.ARMED) { "E-Stop не взведён" }
auditLogger.log(Action.START_PROGRAM, programName, currentUser)
mtConnectAdapter.sendCommand(StartProgramCommand(programName))
} העלאת תוכניות NC
קבצי G-code (urn:Siemens:SINUMERIK:NC, class SinumerikOpcUaClient(private val endpoint: String) { private lateinit var client: OpcUaClient suspend fun connect() { val endpoints = DiscoveryClient.getEndpoints(endpoint).await() val ep = endpoints.first { it.securityPolicyUri == SecurityPolicy.None.uri } client = OpcUaClient.create(ep.endpointUrl, endpointFilter = { it == ep }, configurer = { config -> config.setIdentityProvider(UsernameProvider("OpcUaClient", "password")) }) client.connect().await() } suspend fun readSpindleSpeed(): Double { val nodeId = NodeId.parse("ns=2;s=/NC/Spindle[u1,1]/actSpeed") val value = client.readValue(0.0, TimestampsToReturn.Both, nodeId).await() return (value.value.value as Number).toDouble() } fun subscribeToAxisPositions(callback: (AxisPositions) -> Unit) { val subscription = client.subscriptionManager.createSubscription(500.0).await() val nodes = listOf("Xact", "Yact", "Zact").map { axis -> NodeId.parse("ns=2;s=/NC/Channel[u1,1]/MachineAxis[$axis]/actPos") } subscription.createMonitoredItems( TimestampsToReturn.Both, nodes.map { MonitoredItemCreateRequest(ReadValueId(it, AttributeId.Value.uid(), null, null), MonitoringMode.Reporting, MonitoringParameters(0.0, 100.0, null, 10, true)) }, ) { item, _ -> item.setValueConsumer { _, value -> /* обновляем позицию оси */ } } } } עבור Siemens, suspend fun startProgram(programName: String) { val state = getMachineState() require(state.doorsClosed) { "Дверь станка открыта" } require(state.execution == Execution.STOPPED) { "Станок не остановлен" } require(state.emergencyStop == EmergencyStop.ARMED) { "E-Stop не взведён" } auditLogger.log(Action.START_PROGRAM, programName, currentUser) mtConnectAdapter.sendCommand(StartProgramCommand(programName)) } עבור Fanuc) מועלים דרך FTP או ממשק DNC. דוגמה ב-Flutter:
Future<void> uploadNcProgram(File program, String remotePath) async {
final ftp = FtpConnect(
host: machineIp,
user: ftpUser,
pass: ftpPassword,
timeout: 30,
);
try {
await ftp.connect();
await ftp.changeDirectory(remotePath);
final uploaded = await ftp.uploadFile(program);
if (!uploaded) throw Exception('FTP upload failed');
} finally {
await ftp.disconnect();
}
} תהליך ולוח זמנים
אנו עובדים באופן אינקרמנטלי עם שלבים ברורים:
- אנליטיקה (שבועיים): ביקורת ממשקי הציוד שלך, איסוף דרישות.
- אב-טיפוס (3 שבועות): הדגמת ניטור בסיסי על מכונה אמיתית.
- פיתוח (6–8 שבועות): יישום כל התכונות — שליטה, העלאת קבצים, אבטחה.
- בדיקות (שבועיים): על מתקן הבדיקה שלך עם מעורבות מפעילים.
- פריסה והדרכה (שבוע): התקנה על טאבלטים, הדרכה.
פרויקט טיפוסי אורך 10 עד 16 שבועות. העלות מחושבת באופן אישי לאחר הביקורת — טווח טיפוסי 25,000–45,000 דולר בהתאם למורכבות. להערכה מדויקת, צור קשר עם המהנדסים שלנו.
מה כלול (תוצרים)
- דוח ביקורת ממשקי CNC ורשת.
- פיתוח מודול ניטור (MTConnect או OPC UA) עם לוח מחוונים להדמיית נתונים.
- יישום פקודות שליטה עם מערכת מנעולים (פקודות מאומתות, בדיקות מצב).
- אינטגרציה עם מערכות קיימות (MES, ERP) דרך REST API.
- העלאה וסנכרון של תוכניות NC דרך FTP מוצפן.
- התראות חירום (push, דוא"ל) עם טריגרים הניתנים להגדרה.
- פריסה על מכשירי iOS/Android (פלטפורמה אחת כלולה, חוצת-פלטפורמות אופציונלית).
- הדרכת מפעילים (יום אחד באתר או מרחוק) ומדריך משתמש.
- תיעוד מערכת: דיאגרמת ארכיטקטורה, מפרטי API, ניתוח אבטחה.
- 3 חודשי תמיכה ותיקוני באגים (תמיכה מורחבת אופציונלית זמינה).
טעויות אינטגרציה נפוצות
- שימוש בפרוטוקולים לא מאובטחים (Telnet, FTP פשוט). אנו אוכפים SFTP/FTPS.
- התעלמות מהשהיית רשת: פקודות חייבות לבדוק מצב לפני שליחה. מרווח ההשהיה שלנו הוא 200 אלפיות השנייה.
- חוסר יתירות: האפליקציה חייבת לשחזר סשן בצורה חלקה בעת אובדן חיבור. אנו מיישמים חיבור מחדש אוטומטי עם backoff אקספוננציאלי.
- עומס יתר על CNC עם בקשות: אין לשאול בתדירות גבוהה מ-100 אלפיות השנייה ללא צורך. אנו קובעים מרווח מינימלי של 200 אלפיות השנייה.
למה לבחור בנו
אנו נמצאים בתחום האוטומציה התעשייתית כבר יותר מעשור. במהלך תקופה זו, השלמנו יותר מ-50 פרויקטים למפעלים ובתי מלאכה. המהנדסים שלנו מוסמכים בתקני הבטיחות IEC 62443. אנו מבטיחים שהאפליקציה תעבור את בדיקת App Store (סעיף 5.1) ולא תעורר חששות אבטחה. חיסכון בזמן מפעיל מגיע ל-40%, והפחתת השבתות עד 30%. בפרויקט אחד, החיסכון הסתכם ב-15,000 דולר לשנה על ידי הפחתת עצירות לא מתוכננות. בהשוואה ללוחות בקרה מסורתיים, האפליקציה הניידת שלנו מגדילה את ניידות המפעיל ב-60% ומפחיתה את זמן התגובה להתראות ב-50%. אם אתה רוצה פתרון שליטה אמין ב-CNC, בקש ייעוץ. קבל גרסת הדגמה לציוד שלך היום.







