La surveillance des machines CNC répond à la question qui fait débat dans tous les ateliers d'usinage : quelle part de la journée les broches passent-elles réellement à usiner ? Dans ce tutoriel, vous allez collecter l'état d'exécution, le programme actif, la charge broche et le compteur de pièces d'une commande numérique, les publier via MQTT et calculer un taux d'utilisation fiable. Les exemples utilisent MTConnect, avec des remarques sur d'autres commandes et une solution de repli par capteur de courant pour les machines anciennes.
Pourquoi la surveillance des machines CNC est rentable
La plupart des ateliers surestiment leur taux d'utilisation. Une machine qui semble occupée peut attendre un contrôle de première pièce, un outil, une modification de programme ou un opérateur qui conduit deux autres machines. Sans données, ces trous se cachent dans le poste. Dès que l'état d'exécution est enregistré seconde par seconde, la structure des pertes devient visible : réglages longs sur certaines pièces, cycles de chauffe trop longs, ou machine à l'arrêt chaque après-midi parce que la matière arrive en retard.
Une bonne surveillance CNC apporte aussi davantage que le taux d'utilisation. Les tendances de charge broche révèlent l'usure des outils, les compteurs de pièces alimentent les devis et la planification, et les noms de programme relient le temps machine à des commandes précises.
Quels signaux collecter
| Signal | Source typique | Pourquoi c'est important |
|---|---|---|
| État d'exécution (ACTIVE, READY, STOPPED, INTERRUPTED, FEED_HOLD) | Commande numérique | Base du taux d'utilisation et des arrêts |
| Mode de la commande (AUTOMATIC, MANUAL, MDI, EDIT) | Commande numérique | Distingue la production du réglage et de la mise au point |
| Nom du programme actif | Commande numérique | Relie le temps aux commandes et aux pièces |
| Charge broche (%) | Commande numérique | Distingue usinage et coupe dans le vide, détecte l'usure d'outil |
| Vitesse de broche et correction d'avance | Commande numérique | Montre quand les opérateurs ralentissent les programmes |
| Compteur de pièces | Commande numérique ou variable de macro | Comptage de production et temps de cycle |
| Code et message d'alarme | Commande numérique | Motifs d'arrêt sans saisie opérateur |
| Courant du moteur de broche | Capteur TC externe | Solution de repli pour les machines sans port de données |
Commencez par l'exécution, le mode, le programme et le compteur de pièces. Ces quatre signaux donnent le taux d'utilisation par commande. Ajoutez la charge broche et les alarmes une fois les bases stabilisées.
Extraire les données de la commande numérique
La manière de lire la commande dépend de la marque et de l'âge de la machine :
- MTConnect. De nombreuses machines récentes sont livrées avec un adaptateur MTConnect, ou peuvent en recevoir un. Un agent MTConnect expose l'état courant de la machine en XML via HTTP, ce qui est facile à interroger et indépendant du constructeur. Le guide MTConnect vers MQTT détaille la configuration de l'agent.
- OPC UA. Plusieurs commandes proposent un serveur OPC UA en option. Un client OPC UA en périphérie lit les mêmes valeurs.
- Bibliothèques constructeur. Certaines familles de commandes fournissent leur propre protocole ou bibliothèque pour lire l'état. Elles fonctionnent, mais lient le code de votre passerelle à une seule marque.
- E/S TOR et capteurs de courant. Pour les machines anciennes sans port réseau, câblez le voyant de départ cycle ou posez un transformateur de courant sur le câble du moteur de broche. Vous perdez les noms de programme mais obtenez un signal de marche fiable.
Quelle que soit la source, le principe après la périphérie reste le même : normaliser les valeurs dans un schéma JSON unique et les publier vers un broker MQTT. Les tableaux de bord, calculateurs de TRS et outils de maintenance restent ainsi indépendants des marques de commandes.
Conception des topics et du payload
Utilisez un topic par machine pour l'état et un autre pour les données de commande, qui changent plus lentement :
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"
}
Publiez le message d'état en retained afin que tout nouvel abonné connaisse immédiatement l'état actuel de chaque machine. Si vous utilisez déjà Sparkplug B dans l'atelier, ConnectMQ peut décoder ces payloads et les republier dans des topics ISA-95 comme connectmq/factory1/production/line1/cnc1/telemetry : les deux conventions peuvent ainsi coexister.
Construire la passerelle MTConnect vers MQTT
Cette passerelle Python interroge chaque seconde le point d'accès /current d'un agent MTConnect, extrait les data items que vous configurez et ne publie un message que lorsque quelque chose change, plus un heartbeat toutes les 30 secondes. Trouvez les identifiants de vos data items en ouvrant http://<agent>:5000/probe dans un navigateur.
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"
# Associe les noms de champs JSON aux valeurs dataItemId issues de /probe
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):
# Ignore les champs qui changent en permanence pour ne publier que les vrais changements d'état
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 arrêté ou problème réseau
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)
Deux détails comptent. D'abord, la charge et la vitesse de broche sont exclues de la détection de changement parce qu'elles fluctuent en permanence ; elles sont tout de même transmises avec chaque changement d'état et chaque heartbeat. Si vous avez besoin d'une tendance de charge pour l'usure d'outil, publiez-la sur un topic load distinct à fréquence fixe. Ensuite, le message Last Will marque la machine OFFLINE si la passerelle tombe, afin qu'une passerelle hors service ne soit jamais confondue avec une machine en marche.
Observez la sortie depuis n'importe quel terminal :
mosquitto_sub -h broker.connectmq.com -p 1883 -i cnc-viewer-k2m8q4 -t "connectmq/demo/k2m8q4/plant1/machining/+/state" -v
Transformer l'état en taux d'utilisation
Le taux d'utilisation est le temps passé dans un état productif divisé par le temps disponible. Définissez explicitement les états, car « en marche » ne signifie pas la même chose pour tout le monde :
- Usinage : exécution ACTIVE, mode AUTOMATIC. C'est le temps productif.
- Mise au point ou réglage : exécution ACTIVE en MANUAL ou MDI, ou nom de programme correspondant à votre convention de nommage des réglages.
- Prête mais inactive : exécution READY ou STOPPED sans alarme. Généralement en attente d'un opérateur, de matière ou d'un contrôle.
- Arrêt d'avance ou interruption : l'opérateur a suspendu le cycle. Souvent un contrôle qualité ou un problème de copeaux.
- Alarme : une alarme active. À planifier pour un suivi maintenance.
- Hors ligne : aucune donnée. À traiter comme inconnu, pas comme inactif.
Un abonné qui enregistre chaque transition d'état avec un horodatage peut additionner les durées par état et par poste. Ce même flux d'événements alimente le suivi des arrêts machine, et en y ajoutant les compteurs de pièces et les temps de cycle idéaux, il devient un TRS. Le principe général, valable pour tout type de machine, est décrit dans la surveillance de l'état des machines.
Les pièges de la collecte de données CNC
- Considérer READY comme en marche. Une machine avec un programme chargé et la porte fermée ne produit pas. Seul ACTIVE en AUTOMATIC compte comme usinage.
- Remises à zéro du compteur de pièces. Les opérateurs remettent souvent le compteur à zéro au changement de commande. Enregistrez le nom du programme avec chaque comptage pour que les remises à zéro soient explicables, et calculez la production à partir des incréments, pas des valeurs absolues.
- Dérive d'horloge. Horodatez au niveau de la passerelle avec une horloge synchronisée (NTP), pas au niveau du tableau de bord, sinon les durées d'état seront fausses d'une machine à l'autre.
- Interrogation trop rapide. Interroger
/currentchaque seconde suffit largement pour l'état. Une fréquence plus élevée charge l'agent sans améliorer la précision du taux d'utilisation. - Segmentation réseau. Les réseaux machines sont souvent isolés. Faites tourner la passerelle sur un PC relié d'un côté au réseau machines et, de l'autre, à une connexion sortante uniquement vers le broker sur le port 8883, afin que rien sur Internet ne puisse atteindre les commandes.
D'une machine à tout l'atelier
Commencez par les deux ou trois machines qui suscitent le plus de discussions de planification. Quand les chiffres correspondent à ce que voient les opérateurs, déployez sur le reste de l'atelier avec le même schéma de payload. Comme toutes les machines publient dans une même arborescence de topics, un seul abonnement avec un wildcard comme plant1/machining/+/state alimente le tableau de bord de l'atelier ; le tutoriel tableau de bord de suivi de ligne de production montre comment le construire avec Grafana.
Pour la production, quittez le serveur MQTT public gratuit, réservé aux tests et prototypes, pour un broker privé. Un broker MQTT managé comme ConnectMQ attribue à chaque passerelle ses propres identifiants en TLS sur le port 8883, et la vue des appareils du portail regroupe les machines par niveau ISA-95 pour voir d'un coup d'œil quelles passerelles sont connectées. Les règles d'alerte sur seuil du portail peuvent signaler, par exemple, une charge broche supérieure à une limite. Si vous voulez d'abord comprendre les rouages, découvrez ce qu'est un broker MQTT, et pour une vue d'ensemble, consultez le guide de l'industrie intelligente.
Commencez à surveiller vos machines CNC sur ConnectMQ
Inscrivez-vous sur app.connectmq.com, créez un broker avec l'offre Serverless gratuite, sans carte bancaire, et remplacez l'hôte, le port et les identifiants dans la passerelle ci-dessus. Votre première machine peut diffuser ses données d'utilisation en moins d'une heure.
Questions fréquentes
Faut-il MTConnect pour surveiller une machine CNC ?
Non. MTConnect est pratique et indépendant du constructeur, mais OPC UA, les bibliothèques constructeur ou un simple capteur de courant sur le moteur de broche fonctionnent aussi. Le côté MQTT reste identique.
Quelle est la précision du taux d'utilisation mesuré par un capteur de courant ?
Il indique de façon fiable quand la broche tourne, ce qui est un bon indicateur de l'usinage. Il ne peut pas donner le programme ni le mode : le réglage et la coupe dans le vide peuvent donc ressembler à de la production.
Quelle bande passante consomme la surveillance CNC ?
Très peu. Les messages d'état pèsent quelques centaines d'octets et sont envoyés lors des changements plus un heartbeat : même un grand atelier ne produit qu'un débit de messages modeste.
Peut-on surveiller des machines anciennes sans port réseau ?
Oui. Câblez le voyant de départ cycle ou de cycle en cours sur une entrée TOR d'un ESP32 ou d'un petit automate, ou utilisez un transformateur de courant, et publiez l'état de marche via MQTT.



