Smart Manufacturing

CNC-Maschinenüberwachung mit MQTT: Spindellast, Programm und Auslastung

Erfahren Sie, wie Sie Ausführungsstatus, aktives Programm, Spindellast und Stückzahl von CNC-Maschinen erfassen, über MQTT veröffentlichen und daraus eine ehrliche Auslastungskennzahl machen.

Illustration zur CNC-Maschinenüberwachung mit einem Bearbeitungszentrum, das Spindellast und Programmstatus über MQTT an ein Auslastungsdiagramm streamt
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Die CNC-Maschinenüberwachung beantwortet die Frage, über die in jeder Zerspanungsfertigung gestritten wird: Wie viel des Tages zerspanen die Spindeln tatsächlich? In diesem Tutorial erfassen Sie Ausführungsstatus, aktives Programm, Spindellast und Stückzahl von einer CNC-Steuerung, veröffentlichen sie über MQTT und berechnen eine Auslastung, der Sie vertrauen können. Die Beispiele nutzen MTConnect, mit Hinweisen zu anderen Steuerungen und einer Stromsensor-Lösung für ältere Maschinen.

Warum sich CNC-Maschinenüberwachung lohnt

Die meisten Betriebe überschätzen ihre Auslastung. Eine Maschine, die beschäftigt aussieht, wartet womöglich auf eine Erstmusterprüfung, ein Werkzeug, eine Programmänderung oder einen Bediener, der gerade zwei andere Maschinen betreut. Ohne Daten verstecken sich diese Lücken in der Schicht. Sobald der Ausführungsstatus sekundengenau protokolliert wird, wird das Verlustmuster sichtbar: lange Rüstzeiten bei bestimmten Aufträgen, zu lange Warmlaufzyklen oder eine Maschine, die jeden Nachmittag stillsteht, weil das Material zu spät kommt.

Gute CNC-Überwachung hilft auch über die Auslastung hinaus. Trends der Spindellast zeigen Werkzeugverschleiß, Stückzahlen fließen in Kalkulation und Planung ein, und Programmnamen verknüpfen Maschinenzeit mit konkreten Aufträgen.

Welche Signale erfasst werden sollten

Signal Typische Quelle Warum es wichtig ist
Ausführungsstatus (ACTIVE, READY, STOPPED, INTERRUPTED, FEED_HOLD) Steuerung Kern von Auslastung und Stillstand
Steuerungsmodus (AUTOMATIC, MANUAL, MDI, EDIT) Steuerung Trennt Produktion von Rüsten und Einfahren
Name des aktiven Programms Steuerung Verknüpft Zeit mit Aufträgen und Teilen
Spindellast (%) Steuerung Erkennt Zerspanen vs. Luftschnitt, Werkzeugverschleiß
Spindeldrehzahl und Vorschub-Override Steuerung Zeigt, wenn Bediener Programme verlangsamen
Stückzahl Steuerung oder Makrovariable Produktionszählung und Zykluszeit
Alarmcode und -meldung Steuerung Stillstandsgründe ohne Bedienereingabe
Strom des Spindelmotors Externer Stromwandler Ersatzlösung für Maschinen ohne Datenschnittstelle

Beginnen Sie mit Ausführungsstatus, Modus, Programm und Stückzahl. Diese vier liefern die Auslastung pro Auftrag. Ergänzen Sie Spindellast und Alarme, sobald die Grundlagen stabil laufen.

Daten aus der Steuerung holen

Wie Sie die Steuerung auslesen, hängt von Hersteller und Alter ab:

  • MTConnect. Viele moderne Maschinen werden mit einem MTConnect-Adapter ausgeliefert, oder er lässt sich nachrüsten. Ein MTConnect-Agent stellt den aktuellen Maschinenzustand per HTTP als XML bereit, was sich leicht abfragen lässt und herstellerneutral ist. Die Anleitung MTConnect zu MQTT beschreibt die Einrichtung des Agenten im Detail.
  • OPC UA. Mehrere Steuerungen bieten optional einen OPC-UA-Server. Ein OPC-UA-Client am Edge liest dieselben Werte.
  • Herstellerbibliotheken. Einige Steuerungsfamilien bringen ein eigenes Protokoll oder eine eigene Bibliothek zum Auslesen des Status mit. Das funktioniert, bindet Ihren Gateway-Code aber an einen Hersteller.
  • Digitale E/A und Stromsensoren. Bei Altmaschinen ohne Netzwerkanschluss verdrahten Sie die Zyklusstart-Lampe oder klemmen einen Stromwandler an die Zuleitung des Spindelmotors. Programmnamen gehen dabei verloren, ein zuverlässiges Laufsignal erhalten Sie trotzdem.

Unabhängig von der Quelle ist das Muster nach dem Edge immer gleich: Normalisieren Sie die Werte in ein einheitliches JSON-Schema und veröffentlichen Sie sie an einen MQTT-Broker. So bleiben Dashboards, OEE-Rechner und Instandhaltungswerkzeuge unabhängig von Steuerungsherstellern.

Topic- und Payload-Design

Verwenden Sie pro Maschine ein Topic für den Status und eines für sich langsamer ändernde Auftragsdaten:

connectmq/demo/<your-id>/plant1/machining/cnc01/state
connectmq/demo/<your-id>/plant1/machining/cnc01/job
{
  "execution": "ACTIVE",
  "mode": "AUTOMATIC",
  "spindle_load": 42.5,
  "spindle_speed": 8000,
  "part_count": 117,
  "alarm": null,
  "ts": "2026-10-16T09:14:05Z"
}

Veröffentlichen Sie die Statusnachricht retained, damit jeder neue Subscriber sofort den aktuellen Zustand jeder Maschine kennt. Diese Struktur folgt der ISA-95-Hierarchie (Werk → Bereich → Maschine) und ist damit die Basis eines Unified Namespace (UNS), in dem alle Maschinen eines Werks unter einem einheitlichen Topic-Baum erreichbar sind. Setzen Sie in der Fertigung bereits Sparkplug B ein, kann ConnectMQ diese Payloads dekodieren und in ISA-95-Topics wie connectmq/factory1/production/line1/cnc1/telemetry erneut veröffentlichen, sodass beide Konventionen nebeneinander bestehen können.

Das Gateway von MTConnect zu MQTT bauen

Dieses Python-Gateway fragt jede Sekunde den Endpunkt /current eines MTConnect-Agenten ab, extrahiert die konfigurierten Datenpunkte und veröffentlicht nur dann eine Nachricht, wenn sich etwas ändert, plus einen Heartbeat alle 30 Sekunden. Ihre Datenpunkt-IDs finden Sie, indem Sie http://<agent>:5000/probe im Browser öffnen.

import json
import time
import urllib.request
import xml.etree.ElementTree as ET
from datetime import datetime, timezone

import paho.mqtt.client as mqtt

AGENT_URL = "http://192.168.10.50:5000/current"
TOPIC = "connectmq/demo/k2m8q4/plant1/machining/cnc01/state"

# JSON-Feldnamen den dataItemId-Werten aus /probe zuordnen
DATA_ITEMS = {
    "execution": "exec",
    "mode": "mode",
    "program": "pgm",
    "spindle_load": "Sload",
    "spindle_speed": "Srpm",
    "part_count": "pc",
}
NUMERIC = {"spindle_load", "spindle_speed", "part_count"}


def read_agent():
    with urllib.request.urlopen(AGENT_URL, timeout=3) as resp:
        root = ET.fromstring(resp.read())
    by_id = {el.get("dataItemId"): el.text for el in root.iter() if el.get("dataItemId")}
    result = {}
    for field, item_id in DATA_ITEMS.items():
        value = by_id.get(item_id)
        if value in (None, "UNAVAILABLE"):
            result[field] = None
        elif field in NUMERIC:
            result[field] = float(value)
        else:
            result[field] = value
    return result


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="cnc01-gw-k2m8q4")
client.on_connect = on_connect
client.will_set(TOPIC, json.dumps({"execution": "OFFLINE"}), qos=1, retain=True)
client.connect("broker.connectmq.com", 1883, keepalive=30)
client.loop_start()

def fingerprint(data):
    # Ständig schwankende Felder ignorieren, damit nur echte Zustandswechsel veröffentlicht werden
    return {k: v for k, v in data.items() if k not in ("spindle_load", "spindle_speed")}


last_fp, last_time = None, 0.0
while True:
    try:
        data = read_agent()
    except Exception as exc:  # Agent nicht erreichbar oder Netzwerkproblem
        data = {"execution": "UNAVAILABLE", "error": str(exc)}
    fp = fingerprint(data)
    if fp != last_fp or time.time() - last_time > 30:
        data["ts"] = datetime.now(timezone.utc).isoformat()
        client.publish(TOPIC, json.dumps(data), qos=1, retain=True)
        last_fp, last_time = fp, time.time()
    time.sleep(1)

Zwei Details sind wichtig. Erstens sind Spindellast und Drehzahl von der Änderungsprüfung ausgenommen, weil sie ständig schwanken; sie werden dennoch mit jedem Zustandswechsel und jedem Heartbeat übertragen. Wenn Sie einen Lasttrend für den Werkzeugverschleiß benötigen, veröffentlichen Sie ihn mit fester Rate auf einem separaten Topic load. Zweitens markiert die Last-Will-Nachricht die Maschine als OFFLINE, wenn das Gateway ausfällt, sodass ein ausgefallenes Gateway nie mit einer laufenden Maschine verwechselt wird.

Verfolgen Sie die Ausgabe in einem beliebigen Terminal:

mosquitto_sub -h broker.connectmq.com -p 1883 -i cnc-viewer-k2m8q4 -t "connectmq/demo/k2m8q4/plant1/machining/+/state" -v

Vom Zustand zur Auslastung

Auslastung ist die Zeit in einem produktiven Zustand geteilt durch die verfügbare Zeit. Definieren Sie die Zustände ausdrücklich, denn „läuft“ bedeutet für verschiedene Menschen Verschiedenes:

  1. Zerspanen: Ausführung ACTIVE, Modus AUTOMATIC. Das ist produktive Zeit.
  2. Einfahren oder Rüsten: Ausführung ACTIVE in MANUAL oder MDI oder ein Programmname, der Ihrer Namenskonvention für Rüstprogramme entspricht.
  3. Bereit, aber im Leerlauf: Ausführung READY oder STOPPED ohne Alarm. Meist Warten auf Bediener, Material oder Prüfung.
  4. Vorschub-Halt oder unterbrochen: Der Bediener hat den Zyklus angehalten. Oft eine Qualitätsprüfung oder ein Spänproblem.
  5. Alarm: ein aktiver Alarm. Für die Nachverfolgung durch die Instandhaltung vorgemerkt.
  6. Offline: keine Daten. Als unbekannt behandeln, nicht als Leerlauf.

Ein Subscriber, der jeden Zustandswechsel mit Zeitstempel speichert, kann die Dauern pro Zustand und Schicht aufsummieren. Derselbe Ereignisstrom speist die Erfassung von Maschinenstillständen, und mit Stückzahlen und idealen Zykluszeiten wird daraus OEE. Das allgemeine Muster für jeden Maschinentyp beschreibt die Überwachung des Maschinenstatus.

Fallstricke bei der CNC-Datenerfassung

  • READY als Laufen werten. Eine Maschine mit geladenem Programm und geschlossener Tür produziert nicht. Nur ACTIVE in AUTOMATIC zählt als Zerspanen.
  • Zurückgesetzte Stückzähler. Bediener setzen den Zähler beim Auftragswechsel oft zurück. Protokollieren Sie den Programmnamen mit jeder Zählung, damit Rücksetzungen erklärbar sind, und berechnen Sie die Produktion aus Inkrementen statt aus Absolutwerten.
  • Uhrenabweichung. Setzen Sie den Zeitstempel im Gateway mit synchronisierter Uhr (NTP), nicht im Dashboard, sonst stimmen die Zustandsdauern maschinenübergreifend nicht.
  • Zu schnelles Abfragen. Eine Abfrage von /current pro Sekunde reicht für den Status völlig. Schnelleres Abfragen belastet den Agenten, ohne die Genauigkeit der Auslastung zu verbessern.
  • Netzwerksegmentierung. Maschinennetze sind oft isoliert. Betreiben Sie das Gateway auf einem PC mit einem Bein im Maschinennetz und einer rein ausgehenden Verbindung zum Broker auf Port 8883, damit nichts aus dem Internet die Steuerungen erreichen kann.

Von einer Maschine zur ganzen Fertigung

Beginnen Sie mit den zwei oder drei Maschinen, die die meisten Diskussionen in der Planung verursachen. Wenn die Zahlen mit dem übereinstimmen, was die Bediener sehen, rollen Sie mit demselben Payload-Schema auf die übrige Fertigung aus. Da alle Maschinen in einen Topic-Baum veröffentlichen, speist ein einziges Abonnement mit Platzhalter wie plant1/machining/+/state das Hallen-Dashboard; das Tutorial zum Dashboard für die Überwachung von Produktionslinien zeigt, wie Sie es mit Grafana bauen.

Für die Produktion wechseln Sie vom öffentlichen MQTT-Broker zu einem privaten. Ein verwalteter MQTT-Broker wie ConnectMQ gibt jedem Gateway eigene Zugangsdaten über TLS auf Port 8883, und die Geräteansicht im Portal gruppiert Maschinen nach ISA-95-Ebene, sodass Sie auf einen Blick sehen, welche Gateways verbunden sind. Schwellenwert-Alarmregeln im Portal können zum Beispiel eine Spindellast oberhalb eines Grenzwerts melden. Wenn Sie zuerst die Bausteine verstehen möchten, lesen Sie, was ein MQTT-Broker ist, und für das Gesamtbild den Smart-Manufacturing-Leitfaden.

Starten Sie die Überwachung Ihrer CNC-Maschinen mit ConnectMQ

Registrieren Sie sich unter app.connectmq.com, erstellen Sie einen Broker im kostenlosen Serverless-Plan ohne Kreditkarte und ersetzen Sie Host, Port und Zugangsdaten im obigen Gateway. Ihre erste Maschine kann innerhalb einer Stunde Auslastungsdaten streamen.

Häufig gestellte Fragen

Brauche ich MTConnect, um eine CNC-Maschine zu überwachen?

Nein. MTConnect ist bequem und herstellerneutral, doch OPC UA, Herstellerbibliotheken oder ein einfacher Stromsensor am Spindelmotor funktionieren ebenfalls. Die MQTT-Seite bleibt gleich.

Wie genau ist die Auslastung aus einem Stromsensor?

Er zeigt zuverlässig, wann sich die Spindel dreht, was ein guter Näherungswert für das Zerspanen ist. Programm oder Modus kann er nicht erkennen, sodass Rüsten und Luftschnitte wie Produktion aussehen können.

Wie viel Bandbreite benötigt die CNC-Überwachung?

Sehr wenig. Statusnachrichten umfassen einige hundert Bytes und werden bei Änderungen plus Heartbeat gesendet, sodass selbst eine große Fertigung nur eine moderate Nachrichtenrate erzeugt.

Kann ich ältere Maschinen ohne Netzwerkanschluss überwachen?

Ja. Verdrahten Sie die Zyklusstart- oder In-Zyklus-Lampe mit einem digitalen Eingang eines ESP32 oder einer kleinen SPS, oder verwenden Sie einen Stromwandler, und veröffentlichen Sie den Laufzustand über MQTT.

Verwandte Artikel

OEE vs. TEEP vs. OOE: Welche Kennzahl sollten Sie verwenden?

OEE, OOE und TEEP teilen sich die Faktoren Leistung und Qualität, beziehen sich aber auf unterschiedliche Zeitbasen. Dieser Vergleich rechnet ein Beispiel durch und listet die MQTT-Signale, die jede Kennzahl benötigt.

7 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.