Gerenciamento de receitas Allen-Bradley com matrizes de UDT e uma interface de edição para IHM
Aprenda a criar uma edição de receitas baseada em IHM para o AB Logix 5000 usando arrays de UDT e instruções COP para o armazenamento persistente de parâmetros.
O gerenciamento de receitas nas plataformas Logix funciona melhor quando a HMI nunca grava diretamente no array histórico. Um padrão robusto usa três tags: Recipe_Storage como um array UDT de comprimento 50, Recipe_Display como uma única instância UDT para a tela do operador e Recipe_Index como um DINT que seleciona qual receita armazenada é espelhada na estrutura de exibição. As instruções de cópia (COP) transferem os dados quando o índice muda e novamente ao salvar, para que o operador sempre edite um buffer temporário enquanto o arquivo permanece consistente entre ciclos de energia.
Monitor de tags Logix mostrando Recipe_Storage[50], Recipe_Display e Recipe_Index usados para a edição de receitas vinculada à HMI.
Defina o UDT uma única vez com cada setpoint necessário ao processo — temperaturas, temporizadores, velocidades, códigos de produto e máscaras de intertravamento — e instancie Recipe_Storage como esse UDT[50]. Recipe_Display deve ser do tipo UDT idêntico, e não um conjunto vagamente relacionado de tags atômicas. Tipos homogêneos mantêm os cálculos de comprimento do COP simples e evitam truncamentos silenciosos quando membros forem adicionados posteriormente.
Limitação do índice e caminho de carregamento
Limite Recipe_Index ao intervalo inclusivo de 0 a 49 antes que qualquer COP seja executado. Um índice não limitado proveniente de um objeto de entrada numérica pode causar uma falha no COP ou acessar uma memória indefinida, dependendo de como os limites do array são tratados no projeto. Quando Recipe_Index mudar positivamente (ou quando um botão Carregar explícito for pressionado), copie Recipe_Storage[Recipe_Index] para Recipe_Display. A HMI deve ser vinculada exclusivamente aos membros de Recipe_Display. Essa regra única elimina condições de corrida nas quais duas telas gravam em posições diferentes do array enquanto o operador ainda ajusta os valores.
// Estrutura em pseudocódigo
if Recipe_Index < 0 then Recipe_Index := 0;
if Recipe_Index > 49 then Recipe_Index := 49;
if IndexChanged or LoadPressed then
COP(Recipe_Storage[Recipe_Index], Recipe_Display, 1);
if SavePressed then
COP(Recipe_Display, Recipe_Storage[Recipe_Index], 1);
Tela de receitas da HMI vinculada somente a Recipe_Display, com ações de Carregar/Salvar acionando rotinas COP no controlador.
Caminho de salvamento, retenção e comportamento do download
Ao salvar, copie Recipe_Display de volta para Recipe_Storage[Recipe_Index]. Como Recipe_Storage reside nas tags do controlador, os valores persistem após um ciclo de energia quando o projeto está configurado para a retenção normal de tags. Os dados também são preservados durante um download quando você opta por manter os valores das tags; trate essa caixa de seleção como parte do procedimento operacional padrão (SOP) de receitas, e não como uma conveniência opcional. Os operadores devem entender que baixar um projeto com “reinicializar tags” ativado apagará receitas cuidadosamente ajustadas, a menos que exista um backup offline.
Os fluxos de importação CSV exigem cautela. Muitos utilitários de HMI ou de Excel para tags criam os nomes das tags sem atualizar de forma confiável os valores dos membros dentro de UDTs aninhados, especialmente quando os cabeçalhos das colunas divergem dos nomes dos membros do UDT. Prefira uma rotina de importação explícita que valide cada campo ou recarregue a partir de uma exportação L5X/de tags conhecida como válida após edições em massa. Não presuma que um banner verde de “importação concluída” significa que Recipe_Storage[n].Setpoint agora é igual à célula da planilha.
| Tag | Tipo | Vincular à HMI? | Finalidade |
|---|---|---|---|
| Recipe_Storage | UDT[50] | Não | Arquivo não volátil de receitas |
| Recipe_Display | UDT | Somente sim | Buffer de edição do operador |
| Recipe_Index | DINT | Sim (seletor) | Slot ativo 0–49 |
Diretrizes para a interface da HMI
- Forneça Carregar e Salvar como bits momentâneos discretos tratados no controlador, e não como gravações diretas no array pelo painel.
- Mostre o índice limitado e um campo somente leitura de “nome armazenado”, copiado do UDT de exibição, para que os operadores confirmem qual slot está ativo.
- Iniba o salvamento enquanto a máquina estiver em ciclo, caso os membros da receita afetem o movimento ou os setpoints térmicos durante o lote.
- Registre os eventos de salvamento com o ID do operador e o índice para garantir a rastreabilidade em linhas regulamentadas.
Valide os limites do índice e os downloads preservados
Teste carregando o slot 0, editando um valor sentinela em Recipe_Display, salvando, alterando o índice para 1, retornando a 0 e carregando novamente. O sentinela deve reaparecer somente se o salvamento tiver sido executado. Desligue e ligue o controlador e confirme que Recipe_Storage ainda contém o sentinela. Tente inserir um índice fora do intervalo pela HMI e verifique a limitação. Faça uma importação CSV em um sistema sobressalente e compare membro por membro com o arquivo antes de confiar nesse caminho em produção.
Evite vincular o painel a Recipe_Storage[Recipe_Index].Member. O endereçamento indireto da HMI em arrays é mais difícil de auditar e favorece gravações no slot errado quando a tag de índice e a tela são atualizadas em taxas diferentes. O padrão do UDT de exibição se adapta facilmente quando você posteriormente expande o UDT, adiciona níveis de segurança ou migra o mesmo modelo de receita entre várias células de sistemas PLC e PAC que compartilham um fluxo de trabalho comum para os operadores.
Sobre o autor
Mark Townsend | Engenheiro sênior de automação – sistemas Allen-Bradley
Mark Townsend é engenheiro sênior de automação com mais de 18 anos de experiência em plataformas Allen-Bradley, abrangendo ControlLogix, CompactLogix e o SLC-500 legado. Seu trabalho diário envolve lógica no RSLogix / Studio 5000 e a preparação de HMIs no FactoryTalk View em frotas antigas e mistas.