Gestión de recetas de Allen-Bradley con matrices de UDT y una interfaz de edición en la HMI
Aprende a crear una edición de recetas basada en HMI para AB Logix 5000 mediante matrices UDT y las instrucciones COP para el almacenamiento persistente de p...
La gestión de recetas en plataformas Logix funciona mejor cuando la HMI nunca escribe directamente en el array histórico. Un patrón resistente utiliza tres tags: Recipe_Storage como un array UDT de longitud 50, Recipe_Display como una instancia UDT individual para la pantalla del operador y Recipe_Index como un DINT que selecciona qué receta almacenada se refleja en la estructura de visualización. Las instrucciones de copia (COP) mueven los datos cuando cambia el índice y nuevamente al guardar, de modo que el operador siempre edita un búfer temporal mientras el archivo histórico permanece coherente entre ciclos de alimentación.
Monitor de tags Logix que muestra Recipe_Storage[50], Recipe_Display y Recipe_Index utilizados para la edición de recetas vinculada a la HMI.
Defina el UDT una sola vez con todos los valores de consigna que necesite el proceso —temperaturas, temporizadores, velocidades, códigos de producto y máscaras de enclavamiento— y, a continuación, cree Recipe_Storage como UDT[50]. Recipe_Display debe ser del mismo tipo UDT idéntico, no un conjunto de tags atómicos vagamente relacionados. Los tipos homogéneos mantienen triviales los cálculos de longitud de COP y evitan truncamientos silenciosos cuando posteriormente se agregan miembros.
Limitación del índice y ruta de carga
Limite Recipe_Index al rango inclusivo de 0 a 49 antes de ejecutar cualquier COP. Un índice sin limitar proveniente de un objeto de entrada numérica puede provocar un fallo del COP o recuperar memoria indefinida, según cómo se gestionen los límites del array en el proyecto. Cuando Recipe_Index cambie de forma ascendente —o al pulsar explícitamente Load— copie Recipe_Storage[Recipe_Index] en Recipe_Display. La HMI debe vincularse exclusivamente a los miembros de Recipe_Display. Esta única regla elimina las condiciones de carrera en las que dos pantallas escriben en distintas posiciones del array mientras un operador todavía ajusta los valores.
// Estructura de 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);
Pantalla de recetas HMI vinculada únicamente a Recipe_Display, con acciones Load/Save que activan rutinas COP del controlador.
Ruta de guardado, retención y comportamiento durante la descarga
Al guardar, copie Recipe_Display de vuelta en Recipe_Storage[Recipe_Index]. Como Recipe_Storage reside en los tags del controlador, los valores se conservan después de un ciclo de alimentación cuando el proyecto está configurado para la retención normal de tags. Los datos también se conservan durante una descarga si elige mantener los valores de los tags; considere esa casilla parte del procedimiento operativo estándar de recetas, no una comodidad opcional. Los operadores deben entender que descargar un proyecto con “reinicializar tags” habilitado borrará las recetas ajustadas cuidadosamente, a menos que exista una copia de seguridad sin conexión.
Los flujos de importación CSV deben tratarse con escepticismo. Muchas utilidades de HMI o de Excel a tags crean los nombres de los tags sin actualizar de forma fiable los valores de los miembros dentro de UDT anidados, especialmente cuando los encabezados de las columnas no coinciden con los nombres de los miembros del UDT. Prefiera una rutina de importación explícita que valide cada campo, o vuelva a cargar desde una exportación L5X/de tags conocida y confiable después de realizar ediciones masivas. No dé por hecho que un aviso verde de “importación completada” significa que Recipe_Storage[n].Setpoint ahora equivale a la celda de la hoja de cálculo.
| Tag | Tipo | ¿Vincular a la HMI? | Propósito |
|---|---|---|---|
| Recipe_Storage | UDT[50] | No | Archivo de recetas no volátil |
| Recipe_Display | UDT | Solo sí | Búfer de edición del operador |
| Recipe_Index | DINT | Sí (selector) | Posición activa 0–49 |
Directrices para la interfaz HMI
- Proporcione Load y Save como bits momentáneos independientes gestionados en el controlador, no como escrituras directas en el array desde el panel.
- Muestre el índice limitado y un campo de “nombre almacenado” de solo lectura copiado del UDT de visualización, para que los operadores confirmen qué posición está activa.
- Inhiba Save mientras la máquina esté en ciclo si los miembros de la receta afectan al movimiento o a los valores de consigna térmicos durante el lote.
- Registre los eventos de guardado con el ID del operador y el índice para garantizar la trazabilidad en líneas reguladas.
Validar los límites del índice y las descargas conservadas
Realice una prueba cargando la posición 0, editando un valor centinela en Recipe_Display, guardando, cambiando el índice a 1, regresando a 0 y cargando de nuevo. El centinela debe reaparecer únicamente si se ejecutó Save. Apague y vuelva a encender el controlador y confirme que Recipe_Storage todavía contiene el centinela. Intente introducir desde la HMI un índice fuera de rango y verifique la limitación. Pruebe una importación CSV en un sistema de reserva y compare los miembros uno por uno con el archivo antes de confiar en ese flujo en producción.
Evite vincular el panel a Recipe_Storage[Recipe_Index].Member. El direccionamiento indirecto de la HMI en arrays es más difícil de auditar e invita a escribir en la posición equivocada cuando el tag de índice y la pantalla se actualizan a ritmos diferentes. El patrón del UDT de visualización se amplía limpiamente cuando posteriormente expande el UDT, agrega niveles de seguridad o migra el mismo modelo de recetas entre varias celdas de sistemas PLC y PAC que comparten un flujo de trabajo común para los operadores.
Sobre el autor
Mark Townsend | Ingeniero sénior de automatización – Sistemas Allen-Bradley
Mark Townsend es un ingeniero sénior de automatización con más de 18 años de experiencia en plataformas Allen-Bradley, incluidos ControlLogix, CompactLogix y el antiguo SLC-500. Su trabajo diario consiste en desarrollar lógica en RSLogix / Studio 5000 y poner en marcha HMI FactoryTalk View en flotas antiguas y mixtas.