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:
- 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".
- 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, porta102 - Mode: Rack/Slot, rack
0, slot1(S7-1200/1500) - Cycle time:
1000ms - Timeout:
2000ms
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:
- Um nó
mqtt inassina um topic dedicado,connectmq/demo/a7f3k2/plant1/line3/press2/setpoint/set. Em um sistema real, isso precisa ser um broker privado e autenticado. - Um nó function valida o valor.
- Um nó s7 out configurado para a variável
setpointfaz a escrita. - 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
- Use um data block dedicado e não otimizado como interface do gateway.
- Restrinja o acesso de rede à porta 102 apenas ao gateway.
- Publique na mudança com um heartbeat periódico, e não a cada ciclo.
- Publique a saúde do gateway como um topic de status retained.
- Valide toda escrita no Node-RED e de novo no CLP.
- Use um broker MQTT privado com TLS e credenciais por gateway.
- 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.



