IoT industrial

Ignition MQTT: Conectando os Módulos Transmission e Engine a um Broker

Configure os módulos MQTT Transmission e MQTT Engine do Ignition com um broker externo, publique tags em Sparkplug B, consuma-as de volta como tags do Ignition e verifique os payloads decodificados em um portal de broker.

Gateways Ignition na borda e no centro de controle trocando tags Sparkplug B por um broker na nuvem, ilustrando o Ignition MQTT
Rode isso no seu próprio broker MQTTTenha um broker MQTT privado e gerenciado no plano Free e comece com exemplos de código prontos.
Teste grátis Exemplos de código Sem cartão de crédito

A integração Ignition MQTT é uma das formas mais populares de montar uma arquitetura Sparkplug B: um gateway Ignition Edge publica tags, um gateway Ignition central as consome e um broker MQTT fica no meio. Neste tutorial você vai configurar os módulos MQTT Transmission e MQTT Engine com um broker externo em vez do embutido, publicar uma pasta de tags em Sparkplug B, vê-las aparecer como tags no lado consumidor e verificar os dados decodificados de forma independente. Conte com tudo funcionando em menos de uma hora.

Os módulos MQTT do Ignition

Os módulos MQTT para o Ignition são desenvolvidos pela Cirrus Link e distribuídos pela Inductive Automation. Três importam aqui:

Módulo Função Local típico
MQTT Transmission Publica tags do Ignition em Sparkplug B (edge node) Ignition Edge ou um gateway de site
MQTT Engine Assina Sparkplug B e cria tags no Ignition (primary host) Gateway central ou do centro de controle
MQTT Distributor Um broker MQTT rodando dentro do Ignition Opcional; aqui substituído por um broker externo

Usar um broker externo em vez do MQTT Distributor desacopla sua camada de mensagens do ciclo de vida do gateway Ignition. Reinicializações, atualizações e licenciamento do gateway deixam de derrubar o broker, e clientes que não são Ignition, como serviços Python, historiadores ou outros sistemas SCADA, conectam-se ao mesmo broker em pé de igualdade. Um broker MQTT na nuvem é especialmente útil quando os sites de borda não têm caminho de rede direto até o gateway central.

Pré-requisitos

  • Ignition 8.1 ou mais recente: um gateway para o Transmission (a borda) e outro para o Engine (o host). Em laboratório, os dois módulos podem rodar no mesmo gateway.
  • Os módulos MQTT Transmission e MQTT Engine, instalados em Config > System > Modules > Install or Upgrade a Module. Sem licença, rodam em modo de avaliação, que pode ser reiniciado.
  • Um broker MQTT. Em laboratório, o servidor MQTT público em broker.connectmq.com, apenas para testes; em produção, um broker privado com credenciais.
  • Acesso de saída dos dois gateways à porta TCP 1883 (testes) ou 8883 (TLS).

Passo 1: aponte o MQTT Transmission para o broker

  1. Na interface web do gateway Ignition, abra Config > MQTT Transmission > Settings.
  2. Na aba Servers, edite o servidor padrão ou crie um novo:
    • Name: connectmq
    • URL: tcp://broker.connectmq.com:1883 para o laboratório ou ssl://YOUR_BROKER_HOST:8883 para produção
    • Username e Password: vazios para o servidor MQTT público; YOUR_USERNAME e YOUR_PASSWORD para produção
  3. Remova ou desabilite qualquer entrada de servidor que aponte para um MQTT Distributor local, para que o Transmission não divida o tráfego entre brokers.
  4. Salve. O status do servidor deve mudar para conectado em poucos segundos.

Para TLS com certificado Let's Encrypt, o trust store Java que acompanha o Ignition normalmente valida a cadeia, então em geral você não precisa enviar um arquivo de CA. Se a versão do seu módulo expõe um campo de client ID e o seu broker vincula client IDs a credenciais, informe ali o YOUR_CLIENT_ID emitido; cada conexão de módulo precisa de credenciais e client ID próprios.

Passo 2: crie as tags de borda

O MQTT Transmission publica as tags encontradas em um caminho de tags configurado, por padrão a pasta Edge Nodes do tag provider padrão. Os níveis de pasta abaixo dela correspondem aos identificadores Sparkplug:

[default]Edge Nodes/
  cmqdemo-4kz9/            <- Sparkplug Group ID (único no broker público)
    Line1/                 <- Edge Node ID
      Filler/              <- Device ID
        Temperature        (Float, tag de memória ou OPC)
        Speed              (Int4)
        Running            (Boolean)
        Count              (Int8)

No servidor MQTT público, todo topic Sparkplug começa com spBv1.0, então escolha um Group ID aleatório como cmqdemo-4kz9 para não colidir com outros usuários e use tags de memória ou de simulador em vez de valores reais de processo: tudo o que for publicado ali pode ser lido por qualquer pessoa.

Na aba Transmitters, confira se o transmitter padrão usa o tag provider default e o caminho de tags Edge Nodes, e se o Primary Host ID está definido, por exemplo IgnitionHost. Com um primary host ID definido, o edge node espera a mensagem STATE do host antes de publicar e republica os births quando o host volta a ficar online.

Passo 3: configure o MQTT Engine como primary host

  1. Abra Config > MQTT Engine > Settings.
  2. Na aba General, defina o Primary Host ID com o mesmo valor, IgnitionHost. O Engine publicará sua mensagem STATE como retained message, o que informa aos edge nodes que há um host escutando.
  3. Na aba Servers, adicione o mesmo broker. Em produção, use um conjunto de credenciais separado do lado Transmission: dois módulos em dois gateways são dois clientes MQTT distintos.
  4. Na aba Namespaces, deixe habilitado o namespace Sparkplug B padrão.

Salve e abra o Designer. No tag provider MQTT Engine você encontrará Edge Nodes/cmqdemo-4kz9/Line1/Filler com as quatro tags e seus valores. Altere Temperature no lado da borda e a tag no Engine acompanha em instantes.

Passo 4: verifique o tráfego Ignition MQTT de forma independente

Quando algo dá errado, você quer ver o ponto de vista do broker, não só o do Ignition. Os payloads Sparkplug B são codificados em Protobuf, então um assinante bruto mostra dados binários, mas os topics por si só já dizem muito:

mosquitto_sub -h broker.connectmq.com -p 1883 -i ign-watch-4kz9 \
  -t 'spBv1.0/cmqdemo-4kz9/#' -t 'spBv1.0/STATE/#' -v

Você deve ver, nesta ordem: a mensagem STATE do host, o NBIRTH de Line1, o DBIRTH de Filler e depois mensagens DDATA sempre que os valores das tags mudarem. Se aparecerem births repetidos sem dados, o edge node está reconectando sem parar, geralmente por conflito de client ID.

Para decodificar os payloads no seu próprio código, siga o tutorial decodificar Sparkplug B com Python. Em um broker privado do ConnectMQ, o portal faz isso por você: o explorador de topics ao vivo decodifica Sparkplug B em métricas legíveis, e o broker pode republicar dados Sparkplug em topics no estilo ISA-95. Por exemplo, spBv1.0/factory1/DDATA/line1/cnc1 é republicado como connectmq/factory1/production/line1/cnc1/telemetry, para que dashboards e scripts que não falam Sparkplug possam assinar topics simples.

O fluxo de mensagens Sparkplug em resumo

Mensagem Publicada por Finalidade Retida
STATE MQTT Engine (primary host) Host online ou offline Sim
NBIRTH / DBIRTH MQTT Transmission Lista completa de métricas com tipos e valores atuais Não
NDATA / DDATA MQTT Transmission Apenas valores alterados Não
NDEATH Broker, como Last Will do edge node Edge node offline Não
DDEATH MQTT Transmission Dispositivo offline Não
NCMD / DCMD MQTT Engine Escritas e pedidos de rebirth Não

Entender esta tabela resolve a maioria dos quebra-cabeças do Ignition MQTT. As tags no Engine ficam desatualizadas (stale) com um NDEATH, e um pedido de rebirth do Engine atualiza tudo depois de uma lacuna. O guia de payload Sparkplug B explica a estrutura de métricas em profundidade.

Indo para produção

Antes de conectar um site real:

  1. Use um broker privado com TLS. Troque as URLs para ssl://...:8883 e use credenciais emitidas para cada instância de módulo.
  2. Escolha Group e Edge Node IDs significativos. Eles se tornam a espinha dorsal do seu namespace; alinhe-os aos nomes de site e linha, por exemplo uma planta em Campinas e suas linhas de envase.
  3. Ajuste o Transmission. Use bandas mortas nas tags do Ignition para que o DDATA carregue mudanças reais e considere as opções de store-and-forward do Transmission para links instáveis.
  4. Confira os limites do broker em relação ao seu design. O Sparkplug usa QoS 0 para dados e QoS 1 para mensagens STATE e death, além do STATE retido. Planeje a quantidade de conexões: cada instância de módulo em cada gateway é um cliente.
  5. Restrinja as escritas. O Engine pode escrever em tags de borda via DCMD. Decida se isso é permitido e restrinja as tags graváveis na borda.
  6. Monitore o host e as bordas. Gere alertas para NDEATH e para STATE offline, não só para variáveis de processo.

Se você prefere não operar brokers em cada centro de controle, o ConnectMQ como broker MQTT gerenciado cuida de certificados, atualizações e proteção contra inundação por você. Para as questões mais amplas de design de SCADA, veja MQTT em sistemas SCADA e o guia de IoT industrial com MQTT.

Solução de problemas

  • O servidor aparece desconectado. Esquema de URL errado (tcp:// versus ssl://), firewall na porta ou credenciais erradas.
  • Borda conectada, mas sem births. Primary Host ID definido no Transmission, mas o Engine não está conectado ou usa outro ID, então a borda fica esperando o STATE.
  • Births se repetem a cada poucos segundos. Dois clientes compartilham um client ID, ou duas instâncias do Transmission publicam os mesmos Group e Edge Node IDs.
  • As tags do Engine mostram qualidade ruim. A borda enviou NDEATH ou o host pediu um rebirth que nunca chegou. Verifique os logs do gateway de borda.
  • Nada aparece no servidor MQTT público. Confira se os limites do servidor MQTT público atendem ao seu teste: 10 mensagens por segundo por cliente e 64 KB por mensagem.

Conecte o Ignition ao ConnectMQ

Dê aos seus gateways Ignition um broker MQTT gerenciado, compartilhado e sempre ativo que decodifica Sparkplug B por você. Crie um broker Serverless gratuito em app.connectmq.com, sem cartão de crédito, cole a URL e as credenciais no MQTT Transmission e no Engine e veja suas tags aparecerem no explorador de topics. Prefere experimentar antes? O servidor MQTT público (gratuito) funciona com a configuração de laboratório acima, desde que apenas com dados de teste.

Perguntas frequentes

Preciso do MQTT Distributor se uso um broker externo?

Não. Aponte o MQTT Transmission e o MQTT Engine para o broker externo e desabilite ou remova as entradas de servidor do Distributor.

O Ignition pode publicar JSON simples em vez de Sparkplug B?

O MQTT Transmission é construído em torno do Sparkplug B. Para topics JSON personalizados, a Cirrus Link oferece um módulo separado, ou você pode publicar a partir de scripts do gateway com um cliente MQTT padrão.

Por que minhas tags do MQTT Engine ficam desatualizadas?

Geralmente porque o edge node desconectou e seu NDEATH foi publicado, ou porque o host e a borda usam Primary Host IDs diferentes. Verifique o status do servidor nos dois lados.

O plano gratuito suporta Sparkplug B?

Sim. O Sparkplug precisa de QoS 0 e 1 e de retained messages, que o plano gratuito Serverless suporta, dentro dos seus limites de conexões e de tamanho de mensagem.

Artigos relacionados

Cliente MQTT no CODESYS: Publicando Variáveis do CLP em um Broker

Configure a biblioteca IIoT MQTT Client do CODESYS para publicar variáveis do CLP em JSON, verifique-as no servidor MQTT público broker.connectmq.com e depois migre para um broker privado com credenciais e TLS.

8 min de leitura

Todos os artigos →

Seu broker MQTT privado está a poucos cliques de distância

Crie uma conta, receba as credenciais do seu broker e conecte seu primeiro dispositivo — sem servidores para instalar, atualizar ou escalar.