Розробка мобільного додатку для керування ЧПУ-верстатом

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Розробка мобільного додатку для керування ЧПУ-верстатом
Складний
~1-2 тижні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Розробка мобільного додатку для управління ЧПУ-станком

ЧПУ-станок — це не 3D-принтер і не IoT-датчик. Системи управління класу Fanuc, Siemens Sinumerik, Heidenhain TNC, LinuxCNC — промислове обладнання з жорсткими вимогами до надійності, безпеки та точності управління. Мобільний додаток у цьому контексті не заміняє пульт управління — він його доповнює: моніторинг програми, завантаження NC-файлів, телеметрія стану шпинделя та осей, сповіщення про аварійні зупинки.

Інтерфейси промислових ЧПУ

Кожний виробник ЧПУ забезпечує свій 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) для зчитування стану станка. Agent MTConnect адаптує проприетарні дані в XML-потік. Більшість великих виробників ЧПУ підтримують MTConnect як додатковий інтерфейс.

MTConnect: зчитування даних станка

Agent MTConnect надає HTTP API. Потоковість через 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 потік змін від номера послідовності
    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)
        }
    }
}

Типові DataItem з MTConnect-потоку: execution (ACTIVE/STOPPED/INTERRUPTED), program (назва поточної програми), line (номер рядка G-code), Xact/Yact/Zact (фактичні позиції осей), Sspeed (обороти шпинделя), load (навантаження шпинделя у %).

OPC UA: Siemens Sinumerik

Для Sinumerik 840D sl — OPC UA Server вбудований в NCU. Простір імен Siemens (urn:Siemens:SINUMERIK:NC) містить вузли для всіх параметрів ЧПУ: /NC/Channel/State/actSystemTime, /NC/Spindle/actSpeed, /NC/Axis/actPos.

Підключення через Eclipse Milo (Java/Kotlin):

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")
        }
        // MonitoredItem для кожної осі з інтервалом 100 мс
        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 ->
                // оновлюємо позицію осі
            }
        }
    }
}

Безпека команд управління

Запис команд у ЧПУ (зміна програми, запуск циклу) — потенційно небезпечна операція. Вимоги:

  1. Аутентифікація та авторизація: тільки авторизовані оператори можуть відправляти команди. JWT з коротким TTL, MFA для критичних операцій.
  2. Зона мережі: ЧПУ в ізольованій виробничій мережі, API-шлюз — єдина точка входу з логуванням усіх команд.
  3. Блокування: команда запуску програми блокується якщо дверь станка відкрита (дані з safety PLC). Мобільний додаток не обходить фізичні блокування.
  4. Аудит: кожна команда логується з timestamp, ID користувача, 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 програми (.nc, .mpf для Siemens, .cnc для Fanuc) завантажуються через FTP (LinuxCNC, більшість промислових ЧПУ підтримують 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();
  }
}

Розробка мобільного додатку для моніторингу та управління ЧПУ через MTConnect або OPC UA: 10–16 тижнів. Складність визначається типом ЧПУ та обсягом функцій управління. Вартість розраховується індивідуально після аудиту інтерфейсів конкретного обладнання.