Node-RED

Cliente OPC UA no Node-RED para MQTT com topics ISA-95

Use o node-red-contrib-opcua para assinar variáveis OPC UA em um CLP ou servidor de simulação, mapear node IDs para topics MQTT no estilo ISA-95 e publicar os valores com qualidade e timestamps.

Cliente OPC UA no Node-RED assinando variáveis de CLP e publicando-as em topics MQTT organizados pelos níveis da ISA-95
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

Um fluxo Node-RED OPC UA permite pegar valores de CLPs modernos, comandos CNC e servidores SCADA e publicá-los no MQTT, onde muitos consumidores podem usá-los sem que cada um abra uma sessão OPC UA. Neste tutorial você vai assinar variáveis OPC UA com o node-red-contrib-opcua, mapear seus node IDs para topics MQTT no estilo ISA-95 e publicar cada mudança com a qualidade e o timestamp de origem. Você pode acompanhar com um servidor de simulação gratuito e um broker MQTT gratuito.

Por que combinar OPC UA e MQTT

O OPC UA é excelente dentro da planta: ele tem um modelo de informação rico, espaços de endereçamento navegáveis, tipos de dados, segurança e assinaturas. Ele é menos conveniente para distribuição ampla. Cada cliente mantém uma sessão com o servidor, firewalls entre a planta e a nuvem tornam as conexões diretas complicadas e os controladores podem limitar quantas sessões aceitam.

O MQTT o complementa. Um único gateway mantém uma sessão OPC UA, recebe as mudanças por meio de uma assinatura OPC UA e as publica em um broker. A partir daí, dashboards, historiadores, MES e análises na nuvem assinam topics que entendem. A comparação entre OPC UA e MQTT aborda os prós e contras em detalhes. Em resumo, o OPC UA descreve a máquina, o MQTT distribui os dados e o Node-RED é uma ponte prática entre os dois para pilotos e sites de pequeno a médio porte.

O que você precisa

Componente Finalidade Exemplo
Node-RED 4.x O gateway Notebook, PC industrial ou Raspberry Pi
node-red-contrib-opcua Nós de cliente OPC UA Instale pelo gerenciador de paleta
Servidor OPC UA Fonte de dados Um CLP, ou um servidor de simulação gratuito para testes
Broker MQTT Distribuição broker.connectmq.com para testes, um broker privado para produção

Instale os nós OPC UA:

cd ~/.node-red
npm install node-red-contrib-opcua
# reinicie o Node-RED depois

O pacote é grande porque inclui a pilha node-opcua, então a instalação pode levar alguns minutos em um Raspberry Pi.

Como servidor de testes, o Prosys OPC UA Simulation Server gratuito é muito usado. O endpoint padrão dele tem o formato opc.tcp://<your-pc>:53530/OPCUA/SimulationServer e expõe variáveis simuladas como Counter, Random e Sinusoid. Os node IDs variam conforme a versão, então leia os IDs exatos na visão Objects do servidor; em muitas versões eles têm o formato ns=3;i=1001.

Passo 1: encontrar os node IDs

Toda variável OPC UA tem um node ID formado por um índice de namespace e um identificador, por exemplo ns=3;i=1001 (numérico) ou ns=4;s=Line2.Filler.Temperature (string). Você precisa desses IDs antes de poder assinar.

Duas formas de encontrá-los:

  1. Use o nó OpcUa-Browser no Node-RED: aponte-o para o endpoint e navegue a partir da pasta Objects.
  2. Use um cliente desktop como o UaExpert, selecione uma variável e copie o NodeId.

Anote também o tipo de dado (Double, Int32, Boolean). O nó cliente o utiliza ao escrever, e ele indica como formatar o valor no MQTT.

Passo 2: configurar o cliente OPC UA

Adicione um nó OpcUa-Client e crie uma configuração de endpoint:

  • Endpoint: opc.tcp://<server-host>:53530/OPCUA/SimulationServer
  • Política de segurança: None e modo None para o primeiro teste
  • Action: SUBSCRIBE
  • Interval: 1000 ms (o intervalo de publicação da assinatura OPC UA)

Depois adicione um nó OpcUa-Item por variável, com o item definido como o node ID e o tipo definido como o tipo de dado da variável. Ligue um único nó inject, configurado para disparar uma vez após 2 segundos, a todos os nós item, e ligue os nós item ao cliente. Quando o fluxo inicia, cada item pede ao cliente que monitore aquele nó e, a partir daí, o cliente emite uma mensagem sempre que um valor muda, com o valor em msg.payload e o node ID em msg.topic.

Faça o deploy e adicione um nó debug depois do cliente. Você deve ver o Counter incrementando e o Random mudando a cada segundo. Se o status do cliente mostrar um erro de conexão, verifique a URL do endpoint, principalmente o hostname: muitos servidores anunciam o próprio hostname, que precisa ser resolvido a partir da máquina do Node-RED.

Passo 3: mapear node IDs OPC UA para topics MQTT ISA-95

Publicar em um topic como opcua/ns=3;i=1001 funcionaria tecnicamente, mas ninguém mais adiante sabe o que ele significa. Em vez disso, mapeie cada node ID para um lugar na sua hierarquia de equipamentos: empresa ou site, área, linha, célula e tag. Essa é a ideia por trás das estruturas de topics ISA-95 e do Unified Namespace. O guia de topics MQTT ISA-95 explica os níveis.

Uma tabela de consulta em um nó function mantém o mapeamento explícito e fácil de revisar:

// Nó function "opc ua to isa-95 topic"
// Mapeia node IDs OPC UA para caminhos de equipamento e nomes de tag.
const PREFIX = "connectmq/demo/a7f3k2";    // prefixo de demonstração para o broker público
const MAP = {
    "ns=3;i=1001": { path: "plant1/packaging/line2/filler", tag: "counter", unit: "" },
    "ns=3;i=1002": { path: "plant1/packaging/line2/filler", tag: "pressure", unit: "bar" },
    "ns=3;i=1004": { path: "plant1/packaging/line2/capper", tag: "torque", unit: "Nm" }
};

const nodeId = String(msg.topic);
const entry = MAP[nodeId];
if (!entry) {
    node.warn("Unmapped node ID: " + nodeId);
    return null;
}

// Qualidade: os status codes do node-opcua expõem um nome como "Good" ou "Bad..."
let quality = "Good";
if (msg.statusCode && typeof msg.statusCode === "object" && msg.statusCode.name) {
    quality = msg.statusCode.name;
}

const value = typeof msg.payload === "number"
    ? Math.round(msg.payload * 1000) / 1000
    : msg.payload;

msg.topic = `${PREFIX}/${entry.path}/${entry.tag}`;
msg.payload = {
    value: value,
    unit: entry.unit,
    quality: quality,
    sourceTimestamp: msg.sourceTimestamp || new Date().toISOString(),
    nodeId: nodeId
};
msg.retain = true;
return msg;

O topic resultante, por exemplo connectmq/demo/a7f3k2/plant1/packaging/line2/filler/pressure, tem oito níveis. Isso cabe no limite de oito níveis de topic do broker público; em um broker privado você removeria o prefixo de demonstração e poderia acrescentar um nível de empresa.

Publicar com retain significa que qualquer novo assinante recebe imediatamente o valor mais recente de cada tag, que é exatamente como um Unified Namespace deve se comportar: a árvore de topics representa o estado atual. Mantenha a qualidade e o timestamp de origem no payload. Um historiador precisa saber quando o valor mudou na origem, e não quando o Node-RED o encaminhou, e um valor com qualidade "Bad" não deve entrar em tendências como se fosse real.

Passo 4: publicar no MQTT

Adicione um nó mqtt out com os campos de topic e retain vazios, para que as propriedades da mensagem sejam usadas. Para testes, conecte-se a broker.connectmq.com na porta 1883 com um client ID único; esse é o servidor MQTT público gratuito, então substitua a7f3k2 por uma string aleatória sua e não publique dados reais de produção nele.

Confira a saída em um terminal:

mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-opcua-a7f3k2 -v \
  -t 'connectmq/demo/a7f3k2/plant1/#'

Cada linha mostra um topic e um payload JSON com valor, unidade, qualidade e timestamp.

Escrevendo de volta no OPC UA (com cuidado)

O mesmo nó cliente suporta uma ação WRITE. Um fluxo de comandos via MQTT assinaria um topic de comando dedicado, validaria o valor e a faixa em um nó function, definiria msg.topic como um node ID fixo e o enviaria por um OpcUa-Item configurado com o tipo de dado correto. Como em qualquer caminho de escrita em OT, nunca deixe a mensagem recebida escolher o node ID, registre cada escrita e publique um topic de confirmação. Muitos sites mantêm o gateway somente leitura até que exista uma necessidade clara.

Segurança para produção

A configuração de teste não usa segurança. Para um controlador real:

  1. Use uma política segura. Escolha Basic256Sha256 com o modo SignAndEncrypt na configuração do endpoint.
  2. Confie nos certificados. Na primeira conexão, o servidor normalmente rejeita o certificado de cliente do Node-RED. Mova-o para a lista de confiáveis no servidor (no Prosys, na aba Certificates) e reconecte.
  3. Use um usuário dedicado. Configure um usuário OPC UA somente leitura para o gateway, se o servidor suportar autenticação de usuário.
  4. Proteja o lado MQTT. Conecte-se a um broker privado via TLS na porta 8883 com credenciais, e não ao servidor MQTT público de testes.

Solução de problemas em fluxos Node-RED OPC UA

Sintoma Causa provável Correção
BadCertificateUntrusted ou conexão recusada Certificado de cliente não confiável Confie nele no servidor e faça um novo deploy
Conecta e depois falha com um erro de hostname O servidor anuncia um hostname que não pode ser resolvido Adicione uma entrada em hosts ou configure o endereço anunciado pelo servidor
BadNodeIdUnknown Índice de namespace ou identificador errado Navegue novamente; os índices de namespace podem variar entre servidores
Nenhuma mensagem após o deploy Os itens nunca foram enviados ao cliente Garanta que o inject dispare uma vez na inicialização
Os valores chegam só a cada poucos segundos Intervalo de publicação ou de amostragem grande Reduza o intervalo, dentro do que o servidor permite
A memória do gateway cresce com o tempo Centenas de itens assinados individualmente Agrupe os itens e mantenha pequeno o número de assinaturas

Escalando o padrão

Para um punhado de máquinas, uma instância do Node-RED por site com uma tabela de mapeamento funciona bem. À medida que a tabela cresce, mova-a para um arquivo JSON ou para o contexto de fluxo carregado na inicialização, para que os engenheiros possam revisar as mudanças sem mexer no código. Quando há muitos fabricantes e protocolos envolvidos, combine este fluxo com o gateway Modbus no Node-RED para dispositivos mais antigos e considere o Node-RED com Sparkplug B se os seus consumidores esperam o tratamento de birth, death e estado do Sparkplug. Vale avaliar gateways comerciais quando você precisar de centenas de tags por site com configuração centralizada. Uma árvore de topics ISA-95 bem mapeada também é o ponto de partida para alimentar um gêmeo digital da planta, de uma usina a uma mineradora.

Todos esses gateways precisam de um broker em que possam confiar. Um broker MQTT na nuvem permite que gateways em vários sites publiquem em um único namespace por meio de conexões TLS de saída, e um broker MQTT gerenciado tira a operação desse broker da sua equipe. A ConnectMQ detecta estruturas de topics ISA-95 e de Unified Namespace e mostra os dispositivos por empresa, site, área, linha e célula no portal, o que facilita conferir se a sua tabela de mapeamento gerou a hierarquia que você pretendia. Para relembrar o que um broker MQTT faz nessa arquitetura, ou como configurar os nós MQTT, veja o tutorial Node-RED MQTT.

Publique seus dados OPC UA na ConnectMQ

Cadastre-se em app.connectmq.com no plano Serverless gratuito, sem cartão de crédito. Crie um broker, cole o nome de usuário, a senha e o client ID gerados no nó de configuração MQTT do Node-RED, passe para a porta 8883 com TLS e remova o prefixo de demonstração da tabela de mapeamento. Suas tags OPC UA então aparecem no portal da ConnectMQ organizadas pelos níveis da ISA-95.

Perguntas frequentes

Qual pacote do Node-RED é usado para OPC UA?

O pacote mais usado é o node-red-contrib-opcua, construído sobre a pilha node-opcua. Ele oferece nós de cliente, item, browser e servidor para ler, escrever, assinar e testar.

Devo fazer polling ou assinar valores OPC UA no Node-RED?

Assine sempre que o servidor suportar. Assim o servidor envia apenas as mudanças no intervalo que você definir, o que é mais leve para o controlador e gera atualizações mais rápidas que o polling.

Por que mapear node IDs OPC UA para topics MQTT ISA-95?

Os node IDs só têm significado dentro de um servidor. Topics no estilo ISA-95 descrevem de onde os dados vêm na planta, de modo que qualquer consumidor pode encontrá-los e entendê-los sem conhecer o espaço de endereçamento OPC UA.

O Node-RED consegue se conectar a servidores OPC UA com segurança ativada?

Sim. Escolha uma política de segurança como Basic256Sha256 com SignAndEncrypt e confie no certificado de cliente do Node-RED no servidor. Autenticação por usuário e senha também é suportada.

Artigos relacionados

Node-RED Dashboard 2.0 com MQTT: gauges, gráficos e controles

Um tutorial prático do Node-RED Dashboard 2.0: assine telemetria MQTT ao vivo, exiba-a em gauges e em um gráfico de linha e controle um dispositivo com um switch que publica comandos e reflete o estado real.

9 min de leitura

Histórico de gráficos no Node-RED: mantenha os dados MQTT após reinicializações

Os gráficos do Dashboard esquecem tudo quando o Node-RED reinicia. Este guia mostra duas formas confiáveis de manter o histórico de gráficos no Node-RED para dados MQTT: armazenamento de contexto em arquivo e uma pequena tabela SQLite, ambos reenviados ao Dashboard 2.0 na inicialização.

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.