La excepción de índice de matriz fuera de límites ocurre cuando intentamos acceder a un elemento más allá de la capacidad de almacenamiento del índice. Es crucial verificar el tamaño de los registros totales con el índice que se está utilizando para evitar este tipo de errores.
Descripción del Problema
Una HMI PanelView proporciona un valor de entrada del usuario entre 0 y 60 a través de un Selector de Lista de Control. Este valor debe indexar en una matriz Product_ID[60] que contiene 60 cadenas únicas de 3 caracteres, recuperando la cadena correspondiente en una tag Selected_ID.
Análisis de la Causa Raíz
La instrucción FSC busca en una matriz comparando cada elemento secuencialmente hasta encontrar una coincidencia. Esto es innecesario cuando el valor de entrada corresponde directamente a la posición del índice de la matriz. Es crítico entender que la matriz Product_ID[60] contiene elementos en los índices 0-59, no 0-60.
Intentar acceder a Product_ID[60] lee más allá de los límites de la matriz, potencialmente retornando datos basura o incluso causando una falla del procesador (una falla mayor tipo 4, código 20 - S:FS/0). Por lo tanto, es fundamental limitar siempre los valores de entrada a 0-59 en la lógica del PLC, independientemente de las restricciones impuestas por la HMI.
Soluciones
1. Direccionamiento Indirecto
Una solución efectiva es el uso de direccionamiento indirecto para referenciar el elemento de la matriz directamente, utilizando el valor de entrada de la HMI como índice.
Lea también: Análisis de la Inflación Argentina Década Reciente
Implementación en Lógica de Escalera
En la lógica de escalera, se asume que Input_Val (DINT) es el valor HMI entre 0-59, Product_ID[60] (STRING[60]) es la matriz de IDs de producto, y Selected_ID (STRING) es la tag de salida. La sintaxis de direccionamiento indirecto en Logix 5000 utiliza la notación [] con la tag de índice.
Un ejemplo de implementación podría ser el siguiente:
XIC Input_Valid
OTE Enable_Search
MOV |(Product_ID[Input_Val])| Selected_ID
Como alternativa, se puede usar la función de proceso/computación (CPT):
CPT |(Product_ID[Input_Val])| "Selected_ID"
Lea también: Impuesto Sobre la Renta
Es importante notar que la sintaxis Product_ID[Input_Val] requiere que Input_Val sea un DINT o un tipo entero compatible. Para índices SINT o INT, se debe usar una conversión, por ejemplo: Product_ID[DINT_TO_INT(Input_Val)].
2. Búsqueda Secuencial (FSC)
En situaciones donde se busca un VALOR específico dentro de la matriz (por ejemplo, encontrar qué índice contiene "ABC"), o cuando los criterios de búsqueda son desconocidos o deben calcularse, se puede realizar una búsqueda secuencial. Esto implica una coincidencia de patrones entre elementos de la matriz.
Un ejemplo de la instrucción FSC para buscar una cadena "ABC" en la matriz Product_ID sería:
FSC |Product_ID[0]| 60 "ABC" 1 1
// Parámetros: (matriz, longitud, valor_a_encontrar, bit_encontrado, control)
Errores Comunes y Consideraciones
- Error de "off-by-one": Una matriz declarada como Array[60] tiene índices válidos de 0-59, no de 0-60. Este es un error muy común que lleva a accesos fuera de límites.
- Tipo de dato incompatible: Usar un índice de tipo INT en una matriz que espera un DINT puede truncar valores, lo que también puede resultar en un acceso incorrecto.
- Verificación de límites faltante: Las restricciones impuestas por la HMI por sí solas no son suficientes. Siempre se requiere una validación adicional en la lógica del PLC para asegurar que los índices estén dentro del rango permitido.
- Falla del procesador: En algunas versiones de ControlLogix, el acceso a una posición fuera de los límites de la matriz puede generar una falla mayor del procesador, deteniendo la operación del sistema.
Pasos de Verificación
Para garantizar el correcto funcionamiento y evitar errores de índice fuera de los límites, se recomiendan los siguientes pasos de verificación:
Lea también: Índice de Inflación Mundial: Un análisis profundo
- Verificar que la matriz Product_ID esté declarada correctamente, por ejemplo, como Product_ID[60] del tipo de dato STRING[3].
- Confirmar que el tipo de dato de la tag Input_Val sea DINT, o el tipo adecuado para la indexación.
- Monitorear la tag Selected_ID después de que cambie la entrada de la HMI; esta debe actualizarse en un escaneo.
- Probar condiciones límite para Input_Val, incluyendo 0 (el primer índice), 59 (el último índice válido) y 60 (un valor fuera de rango).
- Verificar que no haya fallas mayores del sistema cuando se presenten valores fuera de rango, lo cual es indicativo de un manejo incorrecto del error.
Especificaciones de Tags
Para el escenario presentado, las especificaciones de las tags clave son las siguientes:
- Product_ID: Matriz de IDs de producto de 3 caracteres (STRING[60])
- Input_Val: Entrada de HMI (0-59) (DINT)
- Selected_ID: Resultado de cadena de salida (STRING)
- Temp_Index: Índice con verificación de límites (DINT)
Referencia
Para una comprensión más profunda de la sintaxis de direccionamiento indirecto, se puede consultar la publicación de Allen-Bradley 1756-PM001 (Controladores Logix 5000 - Datos de Tags y E/S).
