Feature

SCADA sem biblioteca de símbolos

Uma HMI de estação elevatória em um único Custom Widget, escrito pelo TagoAI a partir de uma descrição: o que aparece na tela, como os comandos chegam ao campo e o prompt para você montar a sua.

Fabio Rosa ·
SCADA sem biblioteca de símbolos

A tela abaixo é de uma estação elevatória de esgoto: um poço de sucção, duas bombas, uma válvula de recalque, vazão e pressão ao vivo, comandos do operador com etapa de confirmação, uma lista de alarmes e uma tendência de nível. É um único Custom Widget em um dashboard da TagoIO. O TagoAI escreveu o widget a partir de uma descrição em texto, e a montagem inteira, incluindo o simulador que alimenta a tela, levou uma tarde.

Pump Station PS-01, uma HMI estilo SCADA renderizada por um único Custom Widget da TagoIO: o poço de sucção em 69,3% com as linhas de setpoint e de alarme, a bomba P-101 ligada e a P-102 desligada, a válvula V-101 aberta, os comandos do operador, a lista de alarmes e a tendência de nível das últimas quatro horas.

Este post mostra o que está na tela, como dados e comandos passam pela plataforma e como montar a mesma tela na sua própria conta. O prompt de onde partimos no TagoAI está incluído, para você começar por ele e trocar os nossos equipamentos pelos seus.

Por que a TagoIO não tem biblioteca de símbolos

Telas SCADA são desenhadas do mesmo jeito há décadas: uma biblioteca de símbolos (tanques, bombas, válvulas), um canvas com coordenadas fixas e uma janela de associação de tags para cada símbolo. A biblioteca define o teto. Todo equipamento que o fornecedor não desenhou vira tarefa de desenvolvimento, em geral edição de SVG mais uma camada de script que só aquela ferramenta entende.

A TagoIO nunca lançou uma biblioteca de símbolos, e não vai lançar. Um Custom Widget pode ser um componente React que a plataforma empacota e hospeda, com hooks que entregam dados ao vivo do dispositivo e gravam comandos de volta. Desde julho de 2026, o TagoAI escreve esses componentes a partir de um prompt, no painel de chat dele, no próprio dashboard. Um P&ID vira uma descrição: “um poço de sucção com duas bombas, uma válvula de recalque e um transmissor de pressão no barrilete”. Aquele equipamento fora do padrão que o seu cliente opera vira só mais uma frase. O diagrama se redimensiona sozinho porque é SVG dentro de um único widget, então não há grid de colunas fixas para administrar.

A troca é clara. Você não ganha 100 símbolos para arrastar pela tela. Ganha uma tela desenhada para o seu processo, no estilo que os seus operadores esperam, e que você muda descrevendo a mudança.

O que aparece na tela

O diagrama segue a prática de HMI de alto desempenho: fundo neutro, equipamentos em cinza e cor reservada para indicar estado. Ciano significa líquido, fluxo, válvula aberta ou motor ligado. Âmbar e vermelho são exclusivos de alarmes, limites de alarme e avisos, e assim um problema se destaca de todo o resto da tela.

Poço de sucção. O nível preenche o tanque, com uma pequena onda na superfície. Linhas tracejadas marcam o setpoint (SP) e os limites de alarme de nível alto e baixo (HH, LL). O número grande é a leitura do transmissor de nível LT-101.

Bombas P-101 e P-102. O rotor gira enquanto a bomba está ligada, e o rótulo mostra a corrente do motor. Uma falha deixa a bomba vermelha, com um anel pulsante, e os botões Start e Stop dão lugar ao botão Reset fault.

Válvula V-101 e barrilete. Uma bomba ligada anima a própria tubulação, e o barrilete só é animado enquanto a válvula está aberta. Desligue as duas bombas e o barrilete fica parado. O PT-101 mostra a pressão de recalque, o FT-102 mostra a vazão de saída, e uma pressão acima de 5,5 bar deixa o instrumento em âmbar.

Comandos do operador. Start e Stop para cada bomba, Open e Close para a válvula e um ajuste de setpoint com botões de mais e menos. Todo comando pede confirmação, e depois um comando de bomba ou de válvula mostra PENDING até o campo reportar o novo estado ou até passarem 20 segundos. Os comandos de equipamento ficam bloqueados enquanto a estação está em AUTO; o setpoint continua editável.

Alarmes e tendência. Os alarmes ativos são calculados a partir dos valores ao vivo: nível acima de HH, nível abaixo de LL, bomba ligada com a válvula fechada, falha no acionamento ou 30 minutos sem dados. Logo abaixo fica o histórico de alarmes com o estado de reconhecimento, e um botão Acknowledge no cabeçalho do painel reconhece todas as entradas de uma vez. A tendência mostra as últimas quatro horas de nível com as mesmas referências de SP, HH e LL.

Cabeçalho. A chave AUTO/MANUAL, um indicador ao vivo com a idade do registro mais recente que o widget recebeu e um contador de alarmes que pisca enquanto houver um alarme de alta severidade ativo.

Como funciona

Tudo o que aparece na tela é uma variável do dispositivo, e todo comando é um registro no dispositivo. O widget nunca confia no próprio clique em uma bomba ou válvula: ele marca o equipamento como PENDING e espera o estado voltar do campo.

O caminho dos dados da HMI: o PLC ou a RTU reporta o estado por um gateway ao dispositivo Pump Station 01, e o widget lê esse estado ao vivo; um comando do operador vira um registro no dispositivo, o registro dispara a Analysis Pump Station Controller, e ela manda o comando de campo de volta ao PLC.

O dispositivo Pump Station 01 guarda todos os valores da tela: wet_well_level com o setpoint e os limites, inflow, outflow, discharge_pressure, o estado, a corrente e o tempo de operação de cada bomba, valve_state, station_mode, e os eventos de alarme com os reconhecimentos. O widget lê essas variáveis, conforme vinculadas nas fontes de dados dele, com o hook useRealtimeData do SDK de Custom Widget da TagoIO. Ao carregar, ele recebe os registros armazenados mais recentes, até o limite de registros definido no widget, e depois cada registro novo assim que chega. Com isso, a tendência, os alarmes ativos e os marcadores de PENDING são todos calculados a partir de um único fluxo de dados.

Os comandos fazem o caminho inverso. Quando o operador confirma o Start da P-102, o widget chama sendData, do hook useSendData, com { variable: "pump_2_cmd", value: "start" }. O dashboard grava esse registro no dispositivo e, como o widget está configurado para rodar uma Analysis ao enviar dados, executa a Pump Station Controller com o registro como escopo. É na Analysis que fica o comando de campo de verdade: uma publicação MQTT, um downlink LoRaWAN, um comando TagoTiP via MQTT ou uma chamada HTTP a um gateway. Na demo, ela também simula a resposta do processo, então o nível varia e as bombas mudam de estado sem nenhum hardware.

Os alarmes usam os mesmos registros. A cada execução, a Analysis grava um evento de alarme para cada condição que se tornou verdadeira desde a execução anterior; o alarme de dados desatualizados fica por conta do widget. O widget calcula a lista de alarmes ativos a partir dos valores ao vivo e marca as entradas do histórico como reconhecidas quando um registro alarm_ack é mais recente que o evento.

Monte você mesmo

Você precisa de uma conta na TagoIO com o TagoAI ativado no perfil (Profile Settings, Services, AI Provider) e de cerca de uma hora. A primeira versão não exige hardware: a Analysis simula a estação.

  1. Crie o dispositivo. Para uma estação simulada, use Custom HTTPS: não pede número de série, e o parser mantém os seus registros exatamente como foram enviados. Escolha armazenamento mutável para poder editar valores à mão depois. Envie um primeiro lote de registros com os nomes de variável que a montagem usa: wet_well_level, level_setpoint, level_high_alarm, level_low_alarm, inflow, outflow, discharge_pressure, pump_1_state, pump_1_speed, pump_1_current, pump_1_runtime, as mesmas quatro para a bomba 2, valve_state, station_mode, alarm, alarm_ack e alarm_state. Algumas dezenas de pontos de wet_well_level espalhados pelas últimas horas dão à tendência algo para desenhar.
  2. Crie um dashboard Normal e abra o painel do TagoAI. Cole o prompt abaixo, coloque o nome do seu dispositivo e envie. O TagoAI cria o Custom Widget, escreve o código e configura as fontes de dados do widget. Ajuste pelo chat: “aumente as bombas”, “coloque os alarmes acima da tendência”, “use os nossos nomes de tag”.
  3. Confira os vínculos. Abra as configurações do widget e confirme que as fontes de dados listam todas as variáveis que a tela lê e todos os comandos que ela grava (pump_1_cmd, pump_2_cmd, pump_1_reset, pump_2_reset, valve_cmd, level_setpoint, station_mode, alarm_ack), e que carregam registros suficientes para preencher a tendência de quatro horas. Uma variável que não está vinculada é descartada sem aviso quando o widget a envia.
  4. Crie a Analysis de controle. Runtime Deno ou Node, com o token do dispositivo como variável de ambiente. Leia o último valor de cada variável de estado, aplique os comandos que chegaram no escopo, envie o comando de campo e grave o novo estado de volta. Selecione essa Analysis na opção “Run analysis when sending data” do widget. Para uma demo, adicione uma etapa de simulação para o nível responder às bombas.
  5. Adicione um widget Input Control abaixo da HMI com campos de texto para as variáveis de processo. Digitar fault em pump_1_state ou 90 em wet_well_level é o jeito mais rápido de testar na tela os estados de equipamento e de alarme.
  6. Dimensione o widget. Largura total e cerca de 800 px de altura, com fundo transparente, Disable shadow ativado e Header visibility em Show only buttons. Um botão no cabeçalho que roda a Analysis com escopo vazio vira um controle prático de “avançar simulação”.

O prompt de onde partimos, pronto para adaptar:

Crie uma HMI estilo SCADA para uma estação elevatória de esgoto como um único widget ocupando o canvas inteiro, com dados do dispositivo Pump Station 01. Estilo escuro de HMI de alto desempenho: fundo neutro, equipamentos em cinza, cor só para estado e alarmes.

Desenhe um diagrama de processo em SVG: um poço de sucção mostrando wet_well_level como nível preenchido, com uma linha de setpoint (level_setpoint) e linhas de alarme alto/baixo (level_high_alarm, level_low_alarm); uma tubulação de chegada com inflow; duas bombas centrífugas P-101 e P-102, com o estado vindo de pump_1_state e pump_2_state (running, stopped, fault), rotores girando enquanto estiverem ligadas e rótulos com pump_1_current / pump_2_current; um barrilete de recalque com a válvula V-101 (valve_state open ou closed), o transmissor de pressão PT-101 (discharge_pressure) e o medidor de vazão de saída FT-102 (outflow). Anime o fluxo só nas tubulações por onde estiver passando líquido.

Adicione um painel do operador: botões Ligar e Desligar para cada bomba (enviam pump_1_cmd ou pump_2_cmd = start ou stop), Abrir e Fechar para a válvula (enviam valve_cmd), um ajuste de setpoint com botões de mais e menos (envia level_setpoint) e uma chave AUTO/MANUAL (envia station_mode) que bloqueia os comandos de equipamento enquanto estiver em AUTO. Todo comando precisa de uma etapa de confirmação e de um estado PENDENTE até o dispositivo reportar o novo valor.

Adicione um painel de alarmes: alarmes ativos calculados a partir dos valores ao vivo (nível acima do limite alto, nível abaixo do limite baixo, bomba ligada com a válvula fechada, falha de bomba, 30 minutos sem dados) e o histórico da variável alarm com o estado de reconhecimento; um botão Reconhecer envia alarm_ack. Adicione uma faixa de KPI (inflow, outflow, pressão, correntes dos motores, horas de operação) e uma tendência de nível de quatro horas com as mesmas linhas de setpoint e de limite.

O resultado do TagoAI varia de uma execução para outra, e a precisão do prompt faz diferença. Peça uma mudança por vez e mantenha os nomes de tag iguais aos do dispositivo; a maioria dos erros vem de uma variável com um nome no prompt e outro no dispositivo.

Da demo para o campo

Troque o simulador. Mantenha a Analysis, apague a etapa de simulação e o estado que ela grava de volta, e aponte o comando de campo para o seu gateway: um tópico MQTT que o PLC assina, um downlink LoRaWAN ou um comando TagoTiP via MQTT. Daí em diante, o estado do dispositivo vem do PLC, e a tela continua igual. Crie o dispositivo de produção com armazenamento Hybrid: um dispositivo mutável guarda até 50.000 registros, enquanto um Hybrid manda as leituras para uma parte imutável e mantém comandos e setpoints editáveis.

Atenda a frota com uma tela só. Monte o mesmo widget em um Blueprint Dashboard. O widget se vincula a um dispositivo Blueprint e passa a mostrar a estação que o usuário escolher, então uma única HMI cobre todas as estações elevatórias da companhia de saneamento. Mostre a estação selecionada no cabeçalho e faça a Analysis agir sobre o dispositivo de onde veio cada comando, e não sobre um dispositivo fixo.

Leve a tela aos operadores pelo TagoRUN. Custom Widgets funcionam nos portais do TagoRUN. Entregue a HMI na sua aplicação com a sua marca, com o Access Management definindo quais usuários veem quais estações. Todo comando que um operador envia fica guardado como registro do dispositivo, com data e hora, então o histórico de comandos faz parte dos dados da própria estação.

Dispare alertas fora da tela. Rode a Analysis também a partir de uma Action sobre a telemetria que chega, para que os registros de alarme sejam gravados mesmo quando ninguém está clicando. Uma Action na variável alarm então envia uma notificação push, um webhook, ou e-mail e SMS pela sua conta SMTP, SendGrid ou Twilio, assim que um novo registro de alarme é gravado. Uma Action agendada também pode rodar a Analysis para escalonar um alarme que continua sem reconhecimento.

Mantenha a tela honesta. O widget mostra a idade do registro mais recente que recebeu e dispara um alarme de dados desatualizados depois de 30 minutos sem registros. Em uma estação real, conte só a telemetria de campo no cálculo dessa idade; uma HMI que parece ao vivo com o link fora do ar é pior que uma tela em branco.

Desenhe o seu processo

Abra um dashboard Normal ou Blueprint, clique no ícone do TagoAI, cole o prompt e troque as nossas tags pelas suas. Um parque de tanques, uma central de água gelada, um skid de compressores ou uma linha de embalagem seguem o mesmo padrão: variáveis entrando, comandos saindo por uma Analysis e uma tela descrita em linguagem simples.

Leia a visão geral do Custom Widget, o guia de HMIs estilo SCADA e a documentação do TagoAI para mais detalhes, e publique a tela que você montar na Comunidade TagoIO. Queremos ver o resultado.