Node-RED

Node-RED S7: leia variáveis de CLP Siemens e publique no MQTT

Conecte o Node-RED a um CLP Siemens S7 com o node-red-contrib-s7: ative o PUT/GET no TIA Portal, enderece corretamente as variáveis de data blocks, publique as mudanças no MQTT e trate a escrita de setpoints com segurança.

Fluxo Node-RED S7 lendo um data block de um CLP Siemens e publicando valores da máquina em topics 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

Fluxos Node-RED S7 são uma forma prática de tirar dados de CLPs Siemens S7-1200, S7-1500 e dos mais antigos S7-300/400 e levá-los ao MQTT sem mexer muito no programa do CLP. Neste tutorial você vai preparar o CLP no TIA Portal, ler variáveis de data blocks com o node-red-contrib-s7 e publicá-las como JSON em um broker MQTT sempre que mudarem. Você também vai adicionar um caminho de escrita protegido para setpoints e aprender as regras de endereçamento que causam a maioria das falhas na primeira tentativa.

Como o Node-RED conversa com um CLP S7

O node-red-contrib-s7 usa o protocolo de comunicação S7 (ISO-on-TCP, porta 102), o mesmo que as ferramentas de engenharia e as IHMs da Siemens usam. O Node-RED atua como cliente: ele se conecta à CPU, lê uma lista de endereços em um tempo de ciclo fixo e, opcionalmente, escreve valores de volta. Não é preciso hardware extra nem licença no CLP, mas a CPU precisa permitir esse tipo de acesso, que as CPUs modernas bloqueiam por padrão.

Depois que os valores estão no Node-RED, o MQTT assume a distribuição. Em vez de cada dashboard, historiador e ferramenta de análise se conectar ao CLP, um único gateway faz a leitura e um broker entrega valores nomeados a todos os assinantes. Se você quer uma comparação mais ampla de abordagens, o guia de Siemens S7 e MQTT também cobre clientes MQTT nativos do CLP e gateways comerciais.

Passo 1: preparar o CLP no TIA Portal

Para CPUs S7-1200 e S7-1500, faça duas alterações e carregue-as no CLP:

  1. Permita PUT/GET. Abra as propriedades da CPU, vá em Protection & Security → Connection mechanisms e ative "Permit access with PUT/GET communication from remote partner".
  2. Desative o optimized block access em todo data block que o Node-RED deve ler. Clique com o botão direito no data block, abra Properties → Attributes e desmarque "Optimized block access". Compile o bloco; agora ele mostra offsets fixos para cada variável.

O segundo passo é o que dá sentido a endereços absolutos como DB10,REAL0. Com o acesso otimizado, o CLP reorganiza as variáveis internamente e o protocolo S7 não consegue endereçá-las por offset.

O acesso PUT/GET é uma concessão de segurança: qualquer cliente que alcance a porta 102 pode ler e escrever nessas áreas. Mantenha o CLP em uma rede OT isolada, deixe apenas o gateway alcançá-lo e prefira um data block dedicado que contenha só os valores que você quer expor.

CPUs S7-300 e S7-400 não precisam dessas configurações. Use rack 0 e slot 2 para elas, em vez do slot 1 das famílias mais novas.

Passo 2: projetar um data block para o gateway

Crie um data block não otimizado, por exemplo DB10 "GatewayData", e copie para ele, a partir do seu programa, os valores que você quer publicar. Um bloco dedicado mantém a interface estável mesmo quando o programa principal muda.

Variável Tipo Offset Endereço no node-red-contrib-s7
temperature Real 0.0 DB10,REAL0
speed Int 4.0 DB10,INT4
running Bool 6.0 DB10,X6.0
partCount DInt 8.0 DB10,DINT8
setpoint Real 12.0 DB10,REAL12

Outras áreas usam a mesma sintaxe: M0.0 e MW10 para memórias (markers), I0.0 e IW64 para entradas, Q0.1 para saídas e DB10,S20.16 para uma string no offset 20 com comprimento máximo de 16. Sempre pegue os offsets do data block compilado no TIA Portal, e não contando à mão.

Passo 3: instalar e configurar o node-red-contrib-s7

Instale o pacote:

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

Adicione um nó s7 in e crie uma nova configuração de endpoint:

  • Transport: Ethernet (ISO-on-TCP)
  • Address: o endereço IP do CLP, por exemplo 192.168.0.10, porta 102
  • Mode: Rack/Slot, rack 0, slot 1 (S7-1200/1500)
  • Cycle time: 1000 ms
  • Timeout: 2000 ms

Na aba Variables, adicione cada linha da tabela acima com um nome e um endereço. Depois configure o próprio nó s7 in:

  • Mode: "All variables", que emite uma única mensagem cujo payload é um objeto com todas as variáveis.
  • Ative "Emit only when value changes" para que ciclos sem mudança não gerem mensagens.

Faça o deploy e adicione um nó debug. Você deve ver payloads como {"temperature":61.4,"speed":1480,"running":true,"partCount":20391,"setpoint":60}. O status do nó mostra "online" quando a conexão está saudável.

Passo 4: formatar os dados e publicar no MQTT

O objeto bruto está quase pronto para o MQTT, mas vale a pena adicionar um timestamp, arredondar os floats e montar um topic que reflita o lugar da máquina na planta. Um nó function faz isso:

// Nó function "s7 to mqtt"
const v = msg.payload;
if (typeof v !== "object" || v === null) {
    return null;
}

const round = (x, d) => Math.round(x * Math.pow(10, d)) / Math.pow(10, d);

msg.topic = "connectmq/demo/a7f3k2/plant1/line3/press2/telemetry";
msg.payload = {
    temperature: round(Number(v.temperature), 1),
    speed: Number(v.speed),
    running: v.running === true,
    partCount: Number(v.partCount),
    setpoint: round(Number(v.setpoint), 1),
    ts: Date.now()
};
return msg;

Ligue-o a um nó mqtt out com o campo de topic vazio. Para testes, use broker.connectmq.com na porta 1883 com um client ID único; esse é o servidor MQTT público. Substitua a7f3k2 por uma string aleatória sua e nunca envie dados reais de produção para lá, porque qualquer pessoa pode assinar.

Verifique em um terminal:

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

Se você prefere um topic por variável, o que combina com projetos de Unified Namespace, selecione o modo "All variables, one per message". Cada mensagem então traz o nome da variável em msg.topic, e o nó function pode acrescentá-lo ao caminho da máquina.

Publique também a saúde do próprio gateway. Adicione um nó status restrito ao nó s7 in e publique o texto dele em .../press2/gateway/status com retain ativado. Assim os assinantes conseguem diferenciar "a máquina parou" de "o gateway perdeu o CLP".

Passo 5: escrever setpoints a partir do MQTT, com proteções

O nó s7 out escreve uma única variável definida na configuração do endpoint. Um caminho de comando seguro fica assim:

  1. Um nó mqtt in assina um topic dedicado, connectmq/demo/a7f3k2/plant1/line3/press2/setpoint/set. Em um sistema real, isso precisa ser um broker privado e autenticado.
  2. Um nó function valida o valor.
  3. Um nó s7 out configurado para a variável setpoint faz a escrita.
  4. O ciclo de leitura seguinte publica o novo setpoint na telemetria, o que funciona como confirmação.
// Nó function "validate setpoint" -> s7 out (variável: setpoint)
const MIN = 40.0;
const MAX = 80.0;
const value = Number(msg.payload);

if (!Number.isFinite(value) || value < MIN || value > MAX) {
    node.warn(`Rejected setpoint ${msg.payload}; allowed ${MIN}-${MAX}`);
    return null;
}

msg.payload = Math.round(value * 10) / 10;
node.status({ fill: "blue", shape: "dot", text: "wrote " + msg.payload });
return msg;

Deixe o CLP responsável pela segurança. O programa do CLP ainda deve limitar o setpoint e ignorá-lo nos modos em que mudanças remotas não são permitidas. Um gateway que escreve direto na lógica de controle sem essas verificações no CLP é um acidente esperando para acontecer, e em máquinas sujeitas à NR-12 a segurança precisa continuar no sistema de controle, não no gateway.

Solução de problemas em conexões Node-RED S7

Sintoma Causa provável Correção
Timeout de conexão IP errado, firewall, porta 102 bloqueada Faça ping no CLP e teste a porta 102 a partir do gateway
Conecta, mas as leituras falham PUT/GET não permitido Ative-o nas propriedades da CPU e carregue
"Address out of range" ou valores errados Optimized block access ainda ativo Desmarque o atributo, recompile e use os novos offsets
Os valores parecem embaralhados Os offsets mudaram depois de editar o DB Leia de novo os offsets no TIA Portal e atualize as variáveis
Funciona no S7-1200, mas não no S7-300 Slot errado Use rack 0, slot 2 para S7-300/400
A carga da CPU do CLP aumenta Tempo de ciclo curto demais, muitas leituras dispersas Agrupe os valores em um DB e aumente o tempo de ciclo

Uma checagem rápida de porta a partir da máquina do gateway evita muito chute:

# Linux: tem sucesso se a porta 102 estiver acessível
nc -zv 192.168.0.10 102

Checklist para produção

  1. Use um data block dedicado e não otimizado como interface do gateway.
  2. Restrinja o acesso de rede à porta 102 apenas ao gateway.
  3. Publique na mudança com um heartbeat periódico, e não a cada ciclo.
  4. Publique a saúde do gateway como um topic de status retained.
  5. Valide toda escrita no Node-RED e de novo no CLP.
  6. Use um broker MQTT privado com TLS e credenciais por gateway.
  7. Versione seus fluxos para que mudanças de endereço sejam revisadas.

Para onde os dados vão depois

Com os valores do S7 no MQTT, todo o resto vira assinante: dashboards, cálculos de OEE, historiadores e análises na nuvem. A mesma abordagem funciona para outros controladores, como mostram o guia de Node-RED com Modbus e o tutorial de Node-RED com OPC UA para dispositivos Modbus e servidores OPC UA. Para uma visão mais ampla de como tirar os dados dos controladores do chão de fábrica, leia o guia de CLP para a nuvem. Com os dados da prensa organizados em topics, eles também podem alimentar um gêmeo digital da linha.

O gateway só se conecta para fora, até o broker, o que mantém a rede OT fechada para tráfego de entrada. Um broker MQTT gerenciado como a ConnectMQ oferece a esse gateway um endpoint TLS na porta 8883, credenciais geradas no portal e bloqueio de IP após repetidas falhas de login. A ConnectMQ também reconhece topics no estilo ISA-95 como plant1/line3/press2/telemetry e lista os dispositivos por esses níveis, para que você veja de relance quais máquinas estão reportando. Se você ainda está definindo a arquitetura, comece por o que um broker MQTT faz e veja o tutorial Node-RED MQTT para o básico dos nós MQTT.

Conecte seu gateway S7 à 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, ative o TLS na porta 8883 e remova o prefixo de demonstração. Os valores do seu CLP passam a ser publicados de forma privada, e você pode vê-los chegar no explorador de topics ao vivo.

Perguntas frequentes

Quais CLPs Siemens funcionam com o node-red-contrib-s7?

Ele suporta S7-1200 e S7-1500, além das CPUs mais antigas S7-300 e S7-400, via Ethernet. As famílias mais novas precisam de acesso PUT/GET ativado e de data blocks não otimizados.

Por que o Node-RED não consegue ler o data block do meu S7-1500?

O data block provavelmente usa optimized block access, que não tem offsets fixos. Desative-o nos atributos do bloco, recompile, carregue e use os novos offsets no Node-RED.

Quais rack e slot devo usar para um CLP S7?

Use rack 0 e slot 1 para CPUs S7-1200 e S7-1500, e rack 0 e slot 2 para a maioria das CPUs S7-300 e S7-400.

É seguro escrever valores no CLP a partir do MQTT?

Somente com proteções: um topic de comando dedicado em um broker autenticado, validação no Node-RED e verificações de faixa no próprio programa do CLP.

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

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.

10 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.