Operaciones de Comparación
Lógica de decisión y Rangos
La comparación de valores es el motor de la lógica de decisión industrial. Domine los comparadores estándar, las pruebas de rango y las verificaciones de validez.
¿Qué son las operaciones de comparación en TIA Portal?
Las operaciones de comparación permiten comparar dos valores del mismo tipo de datos (Enteros, Reales, Tiempo, etc.) o verificar si un valor se encuentra dentro o fuera de un rango definido. Son fundamentales para crear umbrales de alarma, condiciones de transición y bucles de regulación.
TIA Portal ofrece comparadores estándar (==, <>, >=, etc.), instrucciones de rango (IN_Range, OUT_Range), pruebas de validez para números de coma flotante e instrucciones avanzadas para tipos de datos Variant y punteros DB.
Comparadores Estándar
Evaluación de la igualdad y desigualdades entre dos operandos
CMP == — Igual (Equal)
==Qué hace
Compara dos operandos (IN1 e IN2). Si IN1 es igual a IN2, la instrucción devuelve TRUE. Admite casi todos los tipos de datos simples.
Cuándo usarlo
Verificar si un contador ha alcanzado su objetivo, si una consigna HMI coincide con el valor actual, o si un estado de máquina específico está activo.
Consejos Pro
Atención con los tipos Real: la igualdad estricta puede fallar debido a la precisión. Prefiera un margen o rango.
En SCL: IF value1 = value2 THEN ...
Puede comparar cadenas de caracteres (String) para verificar códigos de identificación.
CMP <> — Diferente (Not equal)
<>Qué hace
Devuelve TRUE si ambos operandos IN1 e IN2 son diferentes. Es lo inverso a la igualdad.
Cuándo usarlo
Detectar un cambio de valor, asegurarse de que un sensor no devuelva 0, o verificar que un modo de funcionamiento no sea el prohibido.
Consejos Pro
A menudo se utiliza para activar una acción en cuanto un valor se desvía de su consigna.
En SCL: IF value1 <> value2 THEN ...
Puede usarse para comparar marcas de tiempo (DTL) para ver si una fecha ha cambiado.
CMP >= — Mayor o igual
>=Qué hace
Devuelve TRUE si el primer valor (IN1) es mayor o igual que el segundo (IN2).
Cuándo usarlo
Activar una alarma de nivel alto, permitir el calentamiento mientras no se alcance una temperatura.
Consejos Pro
Ideal para umbrales de seguridad donde el valor límite debe incluirse en la condición.
En SCL: IF level >= setpoint THEN ...
Puede usarse con tipos Time para verificar si ha transcurrido una duración mínima.
CMP <= — Menor o igual
<=Qué hace
Devuelve TRUE si IN1 es menor o igual que IN2.
Cuándo usarlo
Monitoreo de bajo nivel, parada de una bomba, validación de una presión mínima.
Consejos Pro
A menudo se acopla a una histéresis para evitar rebotes en la salida.
Funciona de forma nativa con tipos Date y Time.
En SCL: IF pressure <= min_limit THEN ...
CMP > — Mayor (Greater than)
>Qué hace
Devuelve TRUE si IN1 es estrictamente mayor que IN2.
Cuándo usarlo
Comparación estricta que no debe incluir el valor objetivo.
Consejos Pro
Menos utilizado que >= en automatización, pero útil para algoritmos matemáticos.
En SCL: IF current > max THEN ...
Preferible para comparaciones de índices de bucles (FOR).
CMP < — Menor (Less than)
<Qué hace
Devuelve TRUE si IN1 es estrictamente menor que IN2.
Cuándo usarlo
Pruebas de límites inferiores estrictos.
Consejos Pro
Útil para verificar si un valor es 'negativo' (val < 0).
En SCL: IF val < 0 THEN ...
Funciona con caracteres (orden alfabético).
Operaciones de Rango
Verificación de pertenencia a un intervalo [MIN..MAX]
IN_Range — Dentro del rango
IN_RangeQué hace
Verifica si un valor (VAL) se encuentra entre un límite mínimo (MIN) y un límite máximo (MAX). El intervalo es cerrado: MIN <= VAL <= MAX.
Cuándo usarlo
Monitoreo de ventana de funcionamiento (ej: presión entre 2 y 5 bares), validación de velocidad de máquina.
Consejos Pro
Reemplaza ventajosamente a dos comparadores puestos en serie, haciendo el segmento más legible.
Si MIN > MAX, la instrucción siempre devuelve FALSE.
Muy útil para enclavamientos 'Ready to Run' que exigen varias condiciones analógicas.
OUT_Range — Fuera de rango
OUT_RangeQué hace
Devuelve TRUE si el valor (VAL) está fuera del intervalo definido por MIN y MAX. Ya sea VAL < MIN o VAL > MAX.
Cuándo usarlo
Detección de anomalía o superación de umbrales extremos (alarma de rango).
Consejos Pro
Es el inverso exacto de IN_Range.
Úselo para simplificar la lógica de alarma de proceso.
En SCL: res := (val < min) OR (val > max);
Pruebas de Validez
Verificación de la integridad de números de coma flotante
|OK| — Verificar validez
|OK|Qué hace
Verifica si un valor flotante (Real o LReal) es un número válido. Devuelve FALSE si el valor es NaN (Not a Number) o Inf (Infinito).
Cuándo usarlo
Después de cálculos complejos (divisiones, raíces cuadradas, log) para evitar propagar errores matemáticos que podrían detener el PLC.
Consejos Pro
Indispensable antes de enviar un valor Real a una salida analógica o un variador.
Permite detectar una división por cero indirecta.
Práctico para filtrar retornos de sensores defectuosos.
|NOT_OK| — Verificar invalidez
|NOT_OK|Qué hace
Devuelve TRUE si el valor flotante es inválido (NaN o Inf).
Cuándo usarlo
Activar un bit de fallo de cálculo o forzar un valor de seguridad.
Consejos Pro
Úselo para poner su máquina en seguridad si falla un cálculo de trayectoria.
Es el equivalente a IS_NAN en otros lenguajes.
En SCL: IF NOT OK(value) THEN ...
Comparaciones avanzadas (Variant)
Instrucciones para la programación dinámica y tipos complejos
EQ_Type / NE_Type
Qué hace
Compara el tipo de datos de una variable de tipo Variant con el de otra variable o un tipo definido.
Cuándo usarlo
En bloques genéricos que deben procesar diferentes tipos de datos (ej: un bloque de log que acepta Int o Real).
Consejos Pro
Esencial para la programación orientada a objetos y bibliotecas reutilizables.
Permite asegurar los accesos a memoria dinámicos.
Usado con la instrucción VariantGet.
IS_NULL / NOT_NULL
Qué hace
Verifica si un puntero (Variant o DB_ANY) es nulo (no apunta a nada).
Cuándo usarlo
Evitar errores de acceso al usar DB direccionados indirectamente.
Consejos Pro
Siempre pruebe NOT_NULL antes de llamar a un método o leer un dato mediante un puntero.
Equivalente al objeto 'Nothing' o 'null' en C#/Java.
Indispensable para la gestión de listas enlazadas o estructuras dinámicas en PLC.
IS_ARRAY
Qué hace
Verifica si una variable Variant apunta a una matriz (Array).
Cuándo usarlo
Programación de funciones de procesamiento por lotes o buffers de datos.
Consejos Pro
Combínelo con CountOfElements para conocer el tamaño de la matriz.
Permite crear funciones de ordenación universales.
También funciona para matrices de estructuras (UDT).
Comparativa de comparadores — ¿Cuál usar?
Elegir la instrucción adecuada para su lógica PLC
| Usted quiere... | Use esto | Ejemplo |
|---|---|---|
| Probar la igualdad exacta | CMP == | Código de producto correcto |
| Umbral de seguridad alto | CMP >= | Presión > 10 bar |
| Mantener en una zona | IN_Range | Temp entre 18 y 24°C |
| Monitorear errores Real | |OK| | Verificar resultado división |
| Verificar un puntero DB | NOT_NULL | DB de receta cargado |
| Verificar un tipo Variant | EQ_Type | La entrada es Int |
Preguntas Frecuentes
¿Por qué mi comparación == falla a veces con números Real?
Los números Real (coma flotante) tienen una precisión limitada. Un cálculo puede dar 10.000001 en lugar de 10.0. Use siempre IN_Range con una pequeña tolerancia (ej: entre 9.99 e 10.01) para comparar valores flotantes.
¿Cuál es la diferencia entre IN_Range y dos comparadores puestos en serie?
Funcionalmente es idéntico. Sin embargo, IN_Range es gráficamente más compacto, más fácil de leer y más eficiente ya que el PLC procesa la instrucción en un solo paso.
¿Para qué sirven las instrucciones |OK| y |NOT_OK|?
Sirven para detectar errores 'silenciosos' en los cálculos Real. Si hace una raíz cuadrada de un número negativo, el resultado es NaN. Sin la prueba |OK|, este NaN contaminará todos sus otros cálculos y puede provocar una parada de la CPU.
¿Se pueden comparar estructuras completas (UDT)?
La instrucción CMP == no permite comparar directamente dos estructuras. Debe comparar cada miembro individualmente o usar un bloque específico que compare las zonas de memoria.