O monitoramento de máquinas CNC responde à pergunta que gera discussão em toda usinagem: quanto do dia os spindles estão realmente cortando? Neste tutorial você vai coletar estado de execução, programa ativo, carga do spindle e contagem de peças de um comando CNC, publicá-los via MQTT e calcular uma utilização em que dá para confiar. Os exemplos usam MTConnect, com observações sobre outros comandos e uma alternativa com sensor de corrente para máquinas mais antigas.
Por que o monitoramento de máquinas CNC compensa
A maioria das usinagens superestima a utilização. Uma máquina que parece ocupada pode estar esperando a inspeção de primeira peça, uma ferramenta, uma edição de programa ou um operador que está cuidando de outras duas máquinas. Sem dados, essas lacunas ficam escondidas dentro do turno. Quando o estado de execução é registrado segundo a segundo, o padrão de perdas fica visível: setups longos em certos trabalhos, ciclos de aquecimento longos demais ou uma máquina que fica ociosa toda tarde porque o material chega atrasado.
Um bom monitoramento de CNC também ajuda além da utilização. As tendências de carga do spindle revelam desgaste de ferramenta, as contagens de peças alimentam orçamentos e programação, e os nomes de programa conectam o tempo de máquina a trabalhos específicos.
Quais sinais coletar
| Sinal | Fonte típica | Por que importa |
|---|---|---|
| Estado de execução (ACTIVE, READY, STOPPED, INTERRUPTED, FEED_HOLD) | Comando | Base da utilização e das paradas |
| Modo do comando (AUTOMATIC, MANUAL, MDI, EDIT) | Comando | Separa produção de setup e de prova de programa |
| Nome do programa ativo | Comando | Vincula o tempo a trabalhos e peças |
| Carga do spindle (%) | Comando | Distingue corte de corte no vazio, desgaste de ferramenta |
| Rotação do spindle e override de avanço | Comando | Mostra operadores reduzindo a velocidade dos programas |
| Contagem de peças | Comando ou variável de macro | Contagem de produção e tempo de ciclo |
| Código e mensagem de alarme | Comando | Motivos de parada sem apontamento do operador |
| Corrente do motor do spindle | Sensor TC externo | Alternativa para máquinas sem porta de dados |
Comece com execução, modo, programa e contagem de peças. Esses quatro produzem a utilização por trabalho. Adicione carga do spindle e alarmes quando o básico estiver estável.
Tirando os dados do comando
A forma de ler o comando depende da marca e da idade:
- MTConnect. Muitas máquinas modernas já vêm com um adaptador MTConnect, ou é possível adicionar um. Um agente MTConnect expõe o estado atual da máquina via HTTP em XML, fácil de consultar e independente de fabricante. O guia de MTConnect para MQTT cobre a configuração do agente em detalhes.
- OPC UA. Vários comandos oferecem um servidor OPC UA como opcional. Um client OPC UA na borda lê os mesmos valores.
- Bibliotecas do fabricante. Algumas famílias de comando oferecem protocolo ou biblioteca próprios para leitura de status. Funcionam, mas amarram o código do seu gateway a uma marca.
- I/O discreto e sensores de corrente. Para máquinas legadas sem porta de rede, ligue a lâmpada de início de ciclo ou prenda um transformador de corrente no cabo do motor do spindle. Você perde os nomes de programa, mas ainda obtém um sinal confiável de máquina em operação.
Qualquer que seja a fonte, o padrão depois da borda é o mesmo: normalize os valores em um único schema JSON e publique em um broker MQTT. Isso mantém dashboards, calculadoras de OEE e ferramentas de manutenção independentes da marca do comando.
Projeto de topics e payload
Use um topic por máquina para o estado e outro para os dados de trabalho, que mudam mais devagar:
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"
}
Publique a mensagem de estado como retida para que qualquer novo assinante saiba imediatamente a condição atual de cada máquina. Se você já usa Sparkplug B no chão de fábrica, a ConnectMQ pode decodificar esses payloads e republicá-los em topics ISA-95 como connectmq/factory1/production/line1/cnc1/telemetry, para que as duas convenções convivam.
Construa o gateway MTConnect para MQTT
Este gateway em Python consulta o endpoint /current de um agente MTConnect a cada segundo, extrai os data items que você configurar e publica uma mensagem apenas quando algo muda, além de um heartbeat a cada 30 segundos. Descubra os IDs dos seus data items abrindo http://<agent>:5000/probe no navegador.
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"
# Mapeia os nomes de campo JSON para os valores dataItemId do /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):
# Ignora campos que mudam o tempo todo para publicar apenas mudanças reais de estado
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: # agente fora do ar ou problema de rede
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)
Dois detalhes importam. Primeiro, a carga e a rotação do spindle ficam fora da verificação de mudança porque oscilam o tempo todo; ainda assim, elas seguem junto com cada mudança de estado e cada heartbeat. Se você precisa de uma tendência de carga para desgaste de ferramenta, publique-a em um topic load separado, a uma taxa fixa. Segundo, a mensagem Last Will marca a máquina como OFFLINE se o gateway morrer, para que um gateway parado nunca seja confundido com uma máquina em operação.
Acompanhe a saída em qualquer terminal:
mosquitto_sub -h broker.connectmq.com -p 1883 -i cnc-viewer-k2m8q4 -t "connectmq/demo/k2m8q4/plant1/machining/+/state" -v
Transformando estado em utilização
Utilização é o tempo em estado produtivo dividido pelo tempo disponível. Defina os estados explicitamente, porque "rodando" significa coisas diferentes para pessoas diferentes:
- Cortando: execução ACTIVE, modo AUTOMATIC. Este é o tempo produtivo.
- Prova de programa ou setup: execução ACTIVE em MANUAL ou MDI, ou um nome de programa que segue a sua convenção de nomes de setup.
- Pronta, mas ociosa: execução READY ou STOPPED sem alarme. Geralmente esperando operador, material ou inspeção.
- Feed hold ou interrompida: o operador pausou o ciclo. Muitas vezes uma verificação de qualidade ou problema com cavacos.
- Alarme: um alarme ativo. Encaminhado para acompanhamento da manutenção.
- Offline: sem dados. Trate como desconhecido, não como ocioso.
Um assinante que armazena cada transição de estado com timestamp pode somar as durações por estado e por turno. Esse mesmo fluxo de eventos alimenta o acompanhamento de paradas de máquina e, quando você adiciona contagens de peças e tempos de ciclo ideais, vira OEE. O padrão mais amplo para qualquer tipo de máquina está descrito em monitoramento de status de máquinas.
Armadilhas na coleta de dados de CNC
- Tratar READY como rodando. Uma máquina com programa carregado e porta fechada não está produzindo. Só ACTIVE em AUTOMATIC conta como corte.
- Zeramento da contagem de peças. Os operadores costumam zerar o contador na troca de trabalho. Registre o nome do programa com cada contagem para que os zeramentos sejam explicáveis, e calcule a produção a partir dos incrementos, não dos valores absolutos.
- Desvio de relógio. Registre o timestamp no gateway com relógio sincronizado (NTP), não no dashboard, ou as durações de estado ficarão erradas entre máquinas.
- Consultar rápido demais. Uma consulta por segundo ao
/currenté mais do que suficiente para o estado. Consultas mais rápidas sobrecarregam o agente sem melhorar a precisão da utilização. - Segmentação de rede. As redes de máquinas costumam ser isoladas. Execute o gateway em um PC com uma perna na rede de máquinas e uma conexão apenas de saída para o broker na porta 8883, para que nada na internet consiga alcançar os comandos.
De uma máquina à fábrica inteira
Comece pelas duas ou três máquinas que geram mais discussões de programação. Quando os números baterem com o que os operadores veem, expanda para o resto da fábrica com o mesmo schema de payload. Como todas as máquinas publicam em uma única árvore de topics, uma única assinatura com wildcard como plant1/machining/+/state alimenta o dashboard da fábrica; o tutorial de dashboard de monitoramento de linha de produção mostra como montá-lo com Grafana.
Para produção, saia do servidor MQTT público, que serve apenas para testes e protótipos, e vá para um broker privado. Um broker MQTT gerenciado como a ConnectMQ dá a cada gateway credenciais próprias via TLS na porta 8883, e a visão de dispositivos do portal agrupa as máquinas por nível ISA-95 para você ver de relance quais gateways estão conectados. Regras de alerta por limite no portal podem sinalizar, por exemplo, carga do spindle acima de um limite. Se quiser entender as peças primeiro, leia sobre o que é um broker MQTT e, para o panorama geral, veja o guia de manufatura inteligente.
Comece a monitorar suas máquinas CNC na ConnectMQ
Cadastre-se em app.connectmq.com, crie um broker no plano Serverless gratuito, sem cartão de crédito, e substitua host, porta e credenciais no gateway acima. Sua primeira máquina pode estar transmitindo dados de utilização em menos de uma hora.
Perguntas frequentes
Preciso de MTConnect para monitorar uma máquina CNC?
Não. O MTConnect é prático e independente de fabricante, mas OPC UA, bibliotecas do fabricante ou um simples sensor de corrente no motor do spindle também funcionam. O lado MQTT continua o mesmo.
Quão precisa é a utilização medida por um sensor de corrente?
Ele indica com confiabilidade quando o spindle está girando, o que é uma boa aproximação do corte. Ele não informa o programa nem o modo, então setup e corte no vazio podem parecer produção.
Quanta banda o monitoramento de CNC usa?
Muito pouca. As mensagens de estado têm algumas centenas de bytes e são enviadas na mudança mais um heartbeat, então até uma fábrica grande gera uma taxa de mensagens modesta.
Posso monitorar máquinas antigas sem porta de rede?
Sim. Ligue a lâmpada de início de ciclo ou de ciclo em andamento a uma entrada digital de um ESP32 ou de um pequeno CLP, ou use um transformador de corrente, e publique o estado de operação via MQTT.



