Ir al contenido

Conector de Alarmas ISA-18.2

El conector ISA-18.2 implementa el ciclo de vida de gestión de alarmas definido por el estándar ANSI/ISA-18.2 (Management of Alarm Systems for the Process Industries). Es un procesador que consume cargas de Meddle, evalúa condiciones de alarma definidas por el usuario y emite una nueva carga cada vez que una alarma cambia de estado — enriquecida con metadatos de alarma como prioridad y estado actual.

Tipos de Conector:

  • Isa182 - Procesador de alarmas con estado (evalúa condiciones, rastrea el estado por alarma)

El conector se coloca en la categoría industrial/ porque la gestión de alarmas es un requisito fundamental para el control de procesos, la manufactura por lotes y las plantas dirigidas por SCADA.

  • ✅ Máquina de estados de alarmas ISA-18.2 (normal, sin confirmar, confirmada, retorno sin confirmar)
  • ✅ Lenguaje de expresiones MXL para condiciones de alarma arbitrarias
  • ✅ Prioridad por alarma (low, medium, high, urgent)
  • ✅ Histéresis con deadband para suprimir el aleteo cerca de un umbral
  • ✅ Temporizadores configurables de retardo de activación (on-delay) y de desactivación (off-delay) en milisegundos
  • ✅ Emite una carga sólo en transiciones de estado (evita ruido)
  • ✅ Claves de metadatos estándar _alarm_* para enrutamiento/alertado descendente
{
"type": "Isa182",
"config": {
"alarms": [
{
"name": "high_temperature",
"condition": "temperature > 80",
"priority": "high"
}
]
}
}
{
"type": "Isa182",
"config": {
"alarms": [
{
"name": "high_temperature",
"condition": "temperature > 80",
"priority": "high",
"setpoint": 80,
"deadband": 2.0,
"delayOn": 5000,
"delayOff": 10000
}
],
"shelveTimeout": 3600000,
"maxShelves": 25
}
}
{
"type": "Isa182",
"config": {
"alarms": [
{
"name": "high_pressure",
"condition": "pressure > 10.0",
"priority": "urgent",
"delayOn": 2000
},
{
"name": "low_flow",
"condition": "flow_rate < 5.0",
"priority": "medium",
"delayOn": 10000
},
{
"name": "tank_overflow",
"condition": "tank_level > 95",
"priority": "high",
"setpoint": 95,
"deadband": 1.0
}
]
}
}

Un array obligatorio de definiciones de alarma. Se requiere al menos una alarma.

{
"alarms": [
{
"name": "high_temp",
"condition": "temperature > 80",
"priority": "high"
}
]
}

Un identificador único para la alarma. Usado como valor de _alarm_name en las cargas emitidas.

{
"name": "compressor_1_high_temp"
}

Convención recomendada: <activo>_<medida>_<condición> (ej. pump_3_low_pressure).

Una expresión MXL evaluada contra cada carga entrante. Cuando el resultado es true, la alarma se considera activa.

{
"condition": "temperature > 80 AND pressure < 5"
}

Ejemplos:

{ "condition": "temperature > 80" }
{ "condition": "vibration_rms >= 0.7" }
{ "condition": "tank_level < 10 OR tank_level > 95" }
{ "condition": "(motor_running == true) AND (current > 12.5)" }

La condición se parsea al inicio; una expresión inválida rechaza la configuración del conector antes del tiempo de ejecución.

Severidad usada para el enrutamiento descendente. Debe ser una de:

  • low
  • medium
  • high
  • urgent
{
"priority": "urgent"
}

Histéresis aplicada alrededor del umbral de la alarma para suprimir el aleteo.

{
"setpoint": 80,
"deadband": 2.0
}
  • setpoint - El valor nominal del umbral (informativo; usado junto con deadband)
  • deadband - La banda de histéresis. Cuando la condición transita de inactiva a activa, permanece activa hasta que el valor subyacente cruza por debajo de setpoint - deadband

Valores recomendados: 1-5% del rango operativo para evitar transiciones espurias en señales ruidosas.

Retardo de activación en milisegundos. La condición debe permanecer activa de forma continua durante este tiempo antes de que la alarma transite a unacknowledged.

{
"delayOn": 5000
}

Valores recomendados:

  • Procesos rápidos: 500-2000ms
  • Alarmas de proceso estándar: 5000-15000ms
  • Alarmas de tendencia: 30000ms+ (30s)

Retardo de desactivación en milisegundos. La condición debe permanecer inactiva de forma continua durante este tiempo antes de que la alarma transite a rtn_unacknowledged.

{
"delayOff": 10000
}

Un retardo de desactivación más largo mantiene una alarma visible el tiempo suficiente para que los operadores la confirmen.

{
"shelveTimeout": 3600000,
"maxShelves": 25
}
  • shelveTimeout - Duración por defecto (ms) durante la cual una alarma puede estar archivada (shelved)
  • maxShelves - Número máximo de alarmas archivadas simultáneamente

Estos parámetros reflejan las restricciones de archivado de ISA-18.2 y se reenvían a las herramientas descendentes de UI/gestión.

El conector implementa la máquina de estados ISA-18.2. Cada alarma mantiene uno de los siguientes estados:

EstadoSignificado
normalLa condición está inactiva; no se requiere atención del operador
unacknowledgedLa condición se activó; el operador no la ha confirmado
acknowledgedEl operador confirmó mientras la condición seguía activa
rtn_unacknowledgedLa condición volvió a la normalidad, pero la alarma previa nunca fue confirmada

Se emite una nueva carga en cada transición de estado.

Cuando una alarma cambia de estado, la carga original se copia y se enriquece con las siguientes claves:

{
"...campos originales...": "...",
"_alarm_name": "high_temperature",
"_alarm_state": "unacknowledged",
"_alarm_priority": "high",
"_alarm_timestamp": "2026-05-20T10:14:33.123456789Z"
}

Referencia de campos:

  • _alarm_name - Coincide con el name de la definición de la alarma
  • _alarm_state - Estado actual (normal, unacknowledged, acknowledged, rtn_unacknowledged)
  • _alarm_priority - Prioridad de la definición de la alarma
  • _alarm_timestamp - Timestamp UTC RFC 3339 con precisión de nanosegundos de la transición
DataPayload → Isa182 → (al cambiar de estado) → DataPayload + metadatos _alarm_*
→ (sin cambio de estado) → absorbido silenciosamente

Ejemplo:

Flujo de entrada (1Hz):

{ "temperature": 78.0 }
{ "temperature": 81.0 }
{ "temperature": 82.0 }
{ "temperature": 79.0 }
{ "temperature": 78.5 }

Con la alarma high_temperature: temperature > 80, delayOn: 0, delayOff: 0:

  • Muestra 1 (78.0): condición falsa, el estado permanece en normal, sin emisión
  • Muestra 2 (81.0): condición verdadera, estado → unacknowledged, carga emitida
  • Muestra 3 (82.0): condición sigue verdadera, sin cambio de estado, sin emisión
  • Muestra 4 (79.0): condición falsa, estado → rtn_unacknowledged, carga emitida
  • Muestra 5 (78.5): condición sigue falsa, sin cambio de estado, sin emisión
{
"type": "Isa182",
"config": {
"alarms": [
{
"name": "reactor_high_temp",
"condition": "reactor_temperature > 150",
"priority": "urgent",
"setpoint": 150,
"deadband": 5,
"delayOn": 3000,
"delayOff": 10000
}
]
}
}
{
"type": "Isa182",
"config": {
"alarms": [
{
"name": "compressor_overload",
"condition": "motor_current > 25 AND oil_pressure < 2.0",
"priority": "urgent",
"delayOn": 5000
},
{
"name": "compressor_vibration",
"condition": "vibration_rms > 0.7",
"priority": "high",
"setpoint": 0.7,
"deadband": 0.05,
"delayOn": 10000
},
{
"name": "compressor_temp_drift",
"condition": "discharge_temp > 95",
"priority": "medium",
"delayOn": 30000
}
]
}
}

3. Monitoreo de Nivel de Tanque con Histéresis

Sección titulada «3. Monitoreo de Nivel de Tanque con Histéresis»
{
"type": "Isa182",
"config": {
"alarms": [
{
"name": "tank_low_level",
"condition": "tank_level < 10",
"priority": "high",
"setpoint": 10,
"deadband": 2,
"delayOn": 5000,
"delayOff": 30000
},
{
"name": "tank_high_level",
"condition": "tank_level > 90",
"priority": "high",
"setpoint": 90,
"deadband": 2,
"delayOn": 5000,
"delayOff": 30000
}
],
"shelveTimeout": 3600000,
"maxShelves": 10
}
}

Problema: La condición parece evaluarse como falsa incluso cuando los datos subyacentes deberían activarla

Soluciones:

  1. Confirma que el nombre del campo en la condición coincide exactamente con la carga (sensible a mayúsculas)
  2. Verifica el tipo de dato — temperature > 80 fallará si temperature llega como cadena. Inserta un Transform aguas arriba para forzar los tipos
  3. Verifica que el conector ascendente está realmente entregando cargas al procesador (revisa el dataflow con un escritor Log o Console)

Problema: Una señal ruidosa oscila repetidamente alrededor del umbral, generando muchas transiciones

Soluciones:

  1. Añade un deadband del 1-5% del rango operativo
  2. Aumenta delayOn para que las excursiones breves se ignoren
  3. Aplica un MovingAverage o EWMA aguas arriba para suavizar la entrada

Problema: La alarma ya no está activa, pero el estado nunca vuelve a normal

Soluciones:

  1. ISA-18.2 requiere confirmación explícita antes de volver a normal. El estado rtn_unacknowledged es la ruta estándar cuando la condición se borra antes de la confirmación
  2. La confirmación se suele activar desde una HMI o herramienta de alerta — conecta una que actualice el estado de la alarma en tu sistema descendente

Problema: El conector no arranca con ErrIsa182ConditionEval

Soluciones:

  1. Verifica que la condición se parsea con la sintaxis MXL — las comparaciones usan >, <, >=, <=, ==, !=
  2. Los conectores booleanos son AND, OR, NOT
  3. Envuelve sub-expresiones complejas entre paréntesis

1. Usa Deadbands Agresivamente en Sensores Ruidosos

Sección titulada «1. Usa Deadbands Agresivamente en Sensores Ruidosos»

Incluso un pequeño deadband (1-2% del rango) reduce drásticamente el volumen de alarmas en plantas reales.

[
{ "priority": "urgent", "delayOn": 1000 },
{ "priority": "high", "delayOn": 5000 },
{ "priority": "medium", "delayOn": 15000 },
{ "priority": "low", "delayOn": 30000 }
]

Las alarmas urgentes deberían dispararse rápido; las de menor prioridad pueden tolerar ventanas de confirmación más largas.

El alertado descendente a menudo pivota sobre _alarm_name. Trata los nombres de alarmas como parte de tu esquema público; no los renombres a la ligera.

4. Combínalo con un Router para Escalado por Prioridad

Sección titulada «4. Combínalo con un Router para Escalado por Prioridad»

Enruta por _alarm_priority a diferentes canales de alerta (urgent → SMS, high → email, medium → sólo dashboard).

El estándar recomienda ≤ 6 alarmas por hora por operador de media. Usa deadbands, retardos y condiciones de alarma consolidadas para mantenerte dentro de ese margen.

OpcuaReader → Isa182 → Router → ┬─ Alert (urgent → SMS)
├─ Alert (high → email)
└─ InfluxDb2Writer (registro de auditoría)
  1. OpcuaReader: Extrae variables de proceso de un PLC a 500ms de cadencia
  2. Isa182: Evalúa todas las alarmas configuradas; emite cargas sólo en el cambio de estado
  3. Router: Ramifica según _alarm_priority
  4. Alert (urgent): Envía SMS por el canal de notificaciones
  5. Alert (high): Envía email
  6. InfluxDb2Writer: Audita todas las transiciones de alarma para cumplimiento

Mantenimiento Predictivo Combinado con Activación de Alarmas

Sección titulada «Mantenimiento Predictivo Combinado con Activación de Alarmas»
ModbusReader → Predictive → Isa182 → Alert
  1. ModbusReader: Lee vibración y temperatura
  2. Predictive: Calcula la tendencia y la vida útil restante
  3. Isa182: Se dispara en vibration_rms_rul < 168 (menos de 7 días de vida útil restante)
  4. Alert: Notifica a mantenimiento
  • Trigger - Emisión más simple basada en condiciones sin máquina de estados
  • Alert - Envía cargas de alarma a canales de notificación
  • Router - Ramifica por _alarm_priority
  • Predictive - Combina con RUL predictivo para alertado proactivo
  • Filter - Pre-filtra las entradas antes de la evaluación de alarmas