Salta ai contenuti

Connettore Allarmi ISA-18.2

Il connettore ISA-18.2 implementa il ciclo di vita di gestione degli allarmi definito dallo standard ANSI/ISA-18.2 (Management of Alarm Systems for the Process Industries). È un processore che consuma payload Meddle, valuta condizioni di allarme definite dall’utente ed emette un nuovo payload ogni volta che un allarme cambia stato — arricchito con metadati di allarme come priorità e stato corrente.

Tipi Connettore:

  • Isa182 - Processore di allarmi con stato (valuta condizioni, traccia lo stato per ogni allarme)

Il connettore è posizionato nella categoria industrial/ perché la gestione degli allarmi è un requisito fondamentale per il controllo di processo, la produzione batch e gli impianti gestiti da SCADA.

  • ✅ Macchina a stati di allarme ISA-18.2 (normal, unacknowledged, acknowledged, return-unacknowledged)
  • ✅ Linguaggio di espressione MXL per condizioni di allarme arbitrarie
  • ✅ Priorità per ogni allarme (low, medium, high, urgent)
  • ✅ Isteresi deadband per sopprimere flapping vicino a una soglia
  • ✅ Timer di on-delay e off-delay configurabili (in millisecondi)
  • ✅ Emette un payload solo sulle transizioni di stato (evita rumore)
  • ✅ Chiavi metadati standard _alarm_* per routing/alerting a valle
{
"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 obbligatorio di definizioni di allarmi. È richiesto almeno un allarme.

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

Un identificatore univoco per l’allarme. Utilizzato come valore di _alarm_name nei payload emessi.

{
"name": "compressor_1_high_temp"
}

Convenzione raccomandata: <asset>_<misura>_<condizione> (es. pump_3_low_pressure).

Un’espressione MXL valutata su ogni payload in ingresso. Quando il risultato è true, l’allarme è considerato attivo.

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

Esempi:

{ "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 condizione viene analizzata all’avvio; un’espressione non valida rifiuta la configurazione del connettore prima del runtime.

Severità utilizzata per il routing a valle. Deve essere uno tra:

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

Isteresi applicata intorno alla soglia di allarme per sopprimere flapping.

{
"setpoint": 80,
"deadband": 2.0
}
  • setpoint - Il valore di soglia nominale (informativo; usato insieme a deadband)
  • deadband - La banda di isteresi. Quando la condizione transita da inattiva ad attiva, rimane attiva finché il valore sottostante non scende sotto setpoint - deadband

Valori raccomandati: 1-5% del range operativo per evitare transizioni spurie su segnali rumorosi.

Ritardo di attivazione in millisecondi. La condizione deve rimanere attiva continuativamente per questo periodo prima che l’allarme transiti a unacknowledged.

{
"delayOn": 5000
}

Valori raccomandati:

  • Processi veloci: 500-2000ms
  • Allarmi di processo standard: 5000-15000ms
  • Allarmi di trend: 30000ms+ (30s)

Ritardo di disattivazione in millisecondi. La condizione deve rimanere inattiva continuativamente per questo periodo prima che l’allarme transiti a rtn_unacknowledged.

{
"delayOff": 10000
}

Un off-delay più lungo mantiene un allarme visibile abbastanza a lungo affinché gli operatori possano riconoscerlo.

{
"shelveTimeout": 3600000,
"maxShelves": 25
}
  • shelveTimeout - Durata predefinita (ms) per cui un allarme può essere messo in shelve
  • maxShelves - Numero massimo di allarmi simultaneamente in shelve

Questi parametri riflettono i vincoli di shelving ISA-18.2 e vengono inoltrati agli strumenti UI/management a valle.

Il connettore implementa la macchina a stati ISA-18.2. Ogni allarme detiene uno dei seguenti stati:

StatoSignificato
normalCondizione inattiva; nessuna attenzione operatore richiesta
unacknowledgedLa condizione è diventata attiva; l’operatore non ha riconosciuto
acknowledgedL’operatore ha riconosciuto mentre la condizione è ancora attiva
rtn_unacknowledgedLa condizione è tornata normale, ma l’allarme precedente non è mai stato riconosciuto

Un nuovo payload viene emesso ad ogni transizione di stato.

Quando un allarme cambia stato, il payload originale viene copiato e arricchito con le seguenti chiavi:

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

Riferimento campi:

  • _alarm_name - Corrisponde al name dalla definizione dell’allarme
  • _alarm_state - Stato corrente (normal, unacknowledged, acknowledged, rtn_unacknowledged)
  • _alarm_priority - Priorità dalla definizione dell’allarme
  • _alarm_timestamp - Timestamp UTC in nanosecondi RFC 3339 della transizione
DataPayload → Isa182 → (al cambio di stato) → DataPayload + metadati _alarm_*
→ (nessun cambio di stato) → assorbito silenziosamente

Esempio:

Stream di input (1Hz):

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

Con allarme high_temperature: temperature > 80, delayOn: 0, delayOff: 0:

  • Campione 1 (78.0): condizione falsa, stato resta normal, nessuna emissione
  • Campione 2 (81.0): condizione vera, stato → unacknowledged, payload emesso
  • Campione 3 (82.0): condizione ancora vera, nessun cambio di stato, nessuna emissione
  • Campione 4 (79.0): condizione falsa, stato → rtn_unacknowledged, payload emesso
  • Campione 5 (78.5): condizione ancora falsa, nessun cambio di stato, nessuna emissione
{
"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
}
]
}
}
{
"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 condizione sembra valutare false anche quando i dati sottostanti dovrebbero attivarla

Soluzioni:

  1. Conferma che il nome del campo nella condizione corrisponda esattamente al payload (case-sensitive)
  2. Controlla il tipo di dato — temperature > 80 fallirà se temperature arriva come stringa. Inserisci un Transform a monte per convertire i tipi
  3. Verifica che il connettore a monte stia effettivamente consegnando payload al processore (controlla il dataflow con un writer Log o Console)

Problema: Un segnale rumoroso oscilla ripetutamente attorno alla soglia, generando molte transizioni

Soluzioni:

  1. Aggiungi un deadband dell’1-5% del range operativo
  2. Aumenta delayOn in modo che brevi escursioni vengano ignorate
  3. Applica una MovingAverage o EWMA a monte per attenuare l’input

Problema: L’allarme non è più attivo, ma lo stato non torna mai a normal

Soluzioni:

  1. ISA-18.2 richiede l’esplicito riconoscimento prima del ritorno a normal. Lo stato rtn_unacknowledged è il percorso standard quando la condizione si risolve prima del riconoscimento
  2. Il riconoscimento è tipicamente guidato da un HMI o strumento di alerting — collegane uno che aggiorni lo stato dell’allarme nel tuo sistema a valle

Problema: Il connettore non si avvia con ErrIsa182ConditionEval

Soluzioni:

  1. Verifica che la condizione venga analizzata con la sintassi MXL — i confronti usano >, <, >=, <=, ==, !=
  2. I connettivi booleani sono AND, OR, NOT
  3. Avvolgi le sotto-espressioni complesse in parentesi

1. Usa i Deadband Aggressivamente sui Sensori Rumorosi

Sezione intitolata “1. Usa i Deadband Aggressivamente sui Sensori Rumorosi”

Anche un piccolo deadband (1-2% del range) riduce drasticamente il volume di allarmi negli impianti reali.

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

Gli allarmi urgent dovrebbero attivarsi velocemente; gli allarmi a priorità inferiore possono tollerare finestre di conferma più lunghe.

L’alerting a valle spesso ruota attorno a _alarm_name. Tratta i nomi degli allarmi come parte del tuo schema pubblico; non rinominarli con leggerezza.

4. Abbina a un Router per Escalation Basata su Priorità

Sezione intitolata “4. Abbina a un Router per Escalation Basata su Priorità”

Instrada per _alarm_priority verso canali di alerting diversi (urgent → SMS, high → email, medium → solo dashboard).

Lo standard raccomanda ≤ 6 allarmi all’ora per operatore in media. Usa deadband, ritardi e condizioni di allarme consolidate per restare entro tale soglia.

OpcuaReader → Isa182 → Router → ┬─ Alert (urgent → SMS)
├─ Alert (high → email)
└─ InfluxDb2Writer (log di audit)
  1. OpcuaReader: Estrae variabili di processo da un PLC alla cadenza di 500ms
  2. Isa182: Valuta tutti gli allarmi configurati; emette payload solo al cambio di stato
  3. Router: Branchamento su _alarm_priority
  4. Alert (urgent): Invia SMS tramite il canale di notifica
  5. Alert (high): Invia email
  6. InfluxDb2Writer: Audit di tutte le transizioni di allarme per conformità

Manutenzione Predittiva Combinata con Trigger di Allarme

Sezione intitolata “Manutenzione Predittiva Combinata con Trigger di Allarme”
ModbusReader → Predictive → Isa182 → Alert
  1. ModbusReader: Legge vibrazione e temperatura
  2. Predictive: Calcola trend e vita utile residua
  3. Isa182: Si attiva su vibration_rms_rul < 168 (meno di 7 giorni di vita utile rimasti)
  4. Alert: Notifica la manutenzione
  • Trigger - Emissione basata su condizione più semplice senza macchina a stati
  • Alert - Invia payload di allarme a canali di notifica
  • Router - Branchamento per _alarm_priority
  • Predictive - Abbina alla RUL predittiva per allarmi proattivi
  • Filter - Pre-filtra input prima della valutazione dell’allarme