Salta ai contenuti

Connettore Manutenzione Predittiva

Il connettore Predictive arricchisce un payload Meddle in ingresso con metriche di manutenzione predittiva per uno o più segnali configurati. Per ogni segnale calcola un trend (tasso di variazione), una stima della Vita Utile Residua (RUL) in cicli e uno score di salute tra 0 e 100. Solleva anche un flag di allerta opzionale quando la RUL scende sotto una soglia definita dall’utente.

Tipi Connettore:

  • Predictive - Processore con stato che mantiene un buffer mobile per segnale ed emette payload arricchiti

Sebbene sia un processore, il connettore è categorizzato sotto industrial/ perché il suo caso d’uso principale è il monitoraggio delle condizioni di macchine, motori, pompe e altri asset industriali.

  • ✅ Tre metodi di calcolo del trend: regressione lineare, moving average, EWMA
  • ✅ Limiti superiori e inferiori per ogni segnale
  • ✅ Stima RUL in cicli verso i limiti configurati
  • ✅ Score di salute derivato dalla distanza dai limiti configurati (0-100)
  • ✅ Flag di allerta RUL opzionale sotto soglia
  • ✅ Coercizione numerica tollerante (gestisce int, float, stringhe)
  • ✅ Payload originale preservato — i campi predittivi vengono fusi
{
"type": "Predictive",
"config": {
"signals": [
{
"key": "vibration_rms",
"upperLimit": 0.8,
"degradationRate": 0.001
}
],
"windowSize": 30,
"method": "linear_regression",
"alertOnRul": 168
}
}
{
"type": "Predictive",
"config": {
"signals": [
{
"key": "bearing_temperature",
"upperLimit": 95.0,
"lowerLimit": 20.0
}
],
"windowSize": 50,
"method": "ewma"
}
}
{
"type": "Predictive",
"config": {
"signals": [
{
"key": "motor_current",
"upperLimit": 25.0
},
{
"key": "vibration_rms",
"upperLimit": 0.8
},
{
"key": "oil_pressure",
"lowerLimit": 2.0
}
],
"windowSize": 30,
"method": "linear_regression",
"alertOnRul": 48
}
}

Lista non vuota richiesta di segnali da monitorare.

{
"signals": [
{
"key": "vibration_rms",
"upperLimit": 0.8,
"lowerLimit": 0.0,
"degradationRate": 0.001
}
]
}

La chiave del payload da leggere ad ogni ciclo. Deve corrispondere esattamente al payload in ingresso.

{ "key": "vibration_rms" }

I limiti operativi configurati per questo segnale.

{
"upperLimit": 0.8,
"lowerLimit": 0.0
}
  • upperLimit - Il valore di “allarme alto”. Quando il trend è positivo, la RUL è calcolata come la distanza da questo limite divisa per il trend
  • lowerLimit - Il valore di “allarme basso”. Quando il trend è negativo, la RUL è calcolata come la distanza sotto il valore corrente divisa per |trend|

Almeno uno dei due dovrebbe essere impostato per una RUL significativa; altrimenti la RUL viene riportata come +Inf.

Riservato per uso futuro (pendenza di degradazione attesa per segnale). Opzionale.

{ "degradationRate": 0.001 }

Richiesto. Il numero di campioni recenti da mantenere nel buffer circolare per segnale.

{ "windowSize": 30 }

Valori raccomandati:

  • Segnali veloci/puliti: 10-30
  • Sensori industriali rumorosi: 50-200
  • Segnali di degradazione lenta: 500+

La dimensione della finestra guida anche il fattore di smoothing EWMA: alpha = 2 / (windowSize + 1).

Richiesto. Uno tra:

  • linear_regression - Pendenza dei minimi quadrati sull’intera finestra (richiede ≥ 3 campioni)
  • moving_average - Differenza tra moving average successive (richiede ≥ 1 campione)
  • ewma - Moving average pesata esponenzialmente; il trend è il delta tra valori EWMA successivi (richiede ≥ 1 campione)
{ "method": "linear_regression" }

Scegliere un metodo:

  • Regressione lineare: ottima quando ti fidi del recente passato come predittore della pendenza di degradazione (cuscinetti motore, usura graduale)
  • Moving average: ottima quando vuoi reiezione del rumore ma latenza minima
  • EWMA: ottima quando i campioni recenti dovrebbero pesare più di quelli vecchi (sistemi a rapida variazione)

Opzionale. Quando la RUL scende sotto questa soglia (in cicli), il payload di output viene marcato con <key>_rul_alert: true.

{ "alertOnRul": 168 }

L’unità è “cicli” — cioè il numero di campioni finché il segnale è previsto raggiungere il suo limite. Per tradurre in tempo reale, moltiplica per l’intervallo di campionamento a monte.

Ogni segnale produce tre nuove chiavi (e opzionalmente una quarta):

{
"vibration_rms": 0.62,
"vibration_rms_trend": 0.005,
"vibration_rms_rul": 36,
"vibration_rms_health_score": 22.5,
"vibration_rms_rul_alert": true
}
ChiaveSignificato
<key>_trendTasso di variazione per ciclo
<key>_rulVita Utile Residua in cicli (o +Inf quando non prevedibile)
<key>_health_scoreScore 0-100 (100 = sano, 0 = al/oltre il limite)
<key>_rul_alertImpostato a true solo quando alertOnRul è configurato e la RUL è sotto di esso

Le chiavi originali del payload in ingresso vengono passate invariate.

  • linear_regression: pendenza m = (n·Σxy − Σx·Σy) / (n·Σx² − (Σx)²) sulla finestra
  • moving_average: mean(window_t) − mean(window_{t−1})
  • ewma: EWMA_t − EWMA_{t−1}, con alpha = 2 / (windowSize + 1)
  • Se trend > 0 e upperLimit impostato: RUL = (upperLimit − currentVal) / trend
  • Se trend < 0 e lowerLimit impostato: RUL = (currentVal − lowerLimit) / |trend|
  • Altrimenti: RUL = +Inf (nessuna stima significativa)

Se il valore corrente è già oltre il limite rilevante, RUL = 0.

  • Se entrambi i limiti impostati: 100 significa al punto medio; 0 a qualsiasi limite (lineare)
  • Se solo upper: 100 a 0, 0 al upperLimit (lineare)
  • Se solo lower: 100 a valori alti, 0 al lowerLimit
  • Se nessuno: 100 (nessun vincolo, segnale informativo)

Tutti gli score sono limitati a [0, 100].

DataPayload → Predictive → DataPayload + (<key>_trend, _rul, _health_score, _rul_alert?)

Esempio (linear_regression, windowSize=10, upperLimit=0.8):

Ultimi 10 campioni di vibration_rms:

[0.42, 0.45, 0.47, 0.51, 0.55, 0.58, 0.60, 0.63, 0.65, 0.68]
  • Trend (pendenza): ≈ +0.029 per ciclo
  • Valore corrente: 0.68
  • RUL: (0.8 − 0.68) / 0.029 ≈ 4.1 cicli
  • Health score: ((0.8 − 0.68) / 0.8) × 100 = 15.0
  • Se è impostato alertOnRul: 10_rul_alert: true

Monitora il valore RMS di vibrazione e prevedi il guasto a 7 giorni di distanza (assumendo campionamento di 1 minuto, 168 cicli/settimana × 60 ≈ 10080 cicli/settimana):

{
"type": "Predictive",
"config": {
"signals": [
{
"key": "vibration_rms",
"upperLimit": 0.8
}
],
"windowSize": 60,
"method": "linear_regression",
"alertOnRul": 10080
}
}

2. Monitoraggio Pressione Sistema di Lubrificazione

Sezione intitolata “2. Monitoraggio Pressione Sistema di Lubrificazione”
{
"type": "Predictive",
"config": {
"signals": [
{
"key": "oil_pressure_bar",
"lowerLimit": 2.0
}
],
"windowSize": 30,
"method": "ewma",
"alertOnRul": 240
}
}
{
"type": "Predictive",
"config": {
"signals": [
{ "key": "motor_current", "upperLimit": 25 },
{ "key": "discharge_pressure", "lowerLimit": 5, "upperLimit": 12 },
{ "key": "vibration_rms", "upperLimit": 0.7 },
{ "key": "bearing_temp", "upperLimit": 90 }
],
"windowSize": 50,
"method": "moving_average"
}
}

La pipeline a valle può calcolare uno score di salute pompa complessivo aggregando le chiavi <segnale>_health_score.

Problema: Errore riportato per i primi campioni

Soluzioni:

  1. Comportamento atteso — linear_regression richiede almeno 3 campioni prima di poter emettere un trend
  2. EWMA e moving average richiedono almeno 1 campione
  3. Usa un connettore Filter a valle per ignorare il warning se desiderato

Problema: Il valore di un segnale non può essere convertito in numero

Soluzioni:

  1. Conferma che il connettore a monte stia consegnando valori numerici per la key configurata
  2. Booleani, struct e array non possono essere elaborati — usa un Transform a monte per estrarre uno scalare
  3. Le stringhe sono accettate dai connettori a monte che fanno parsing numerico in stile OEE, ma Predictive richiede tipi compatibili con connector.ToFloat64

Problema: Il trend sembra essere 0 o nessun limite è impostato

Soluzioni:

  1. Il segnale deve avere un trend non zero E un limite allineato alla direzione del trend
  2. Se il segnale non sta cambiando, la RUL non è definita in modo significativo — è il comportamento corretto
  3. Per un segnale piatto ma degradato, preferisci lo score di salute alla RUL

Problema: _rul_alert: true spurio su molti cicli

Soluzioni:

  1. Aumenta windowSize per attenuare la stima del trend
  2. Passa da linear_regression a ewma per trend meno volatili
  3. Aumenta la soglia alertOnRul per allinearla al tempo di lead reale

Problema: Lo score rimane bloccato a 0

Soluzioni:

  1. Verifica che il valore corrente non sia già oltre il limite configurato — se sì, lo score è correttamente 0
  2. Se solo lowerLimit è impostato e il valore è uguale a 0, la formula valore / lowerLimit è anch’essa 0
  3. Configura sia upperLimit che lowerLimit per uno score basato sul punto medio

Non prendere upperLimit da un datasheet del fornitore. Profila l’asset per alcune settimane e scegli un limite che sia 10-20% all’interno della soglia catastrofica.

2. Abbina la Dimensione della Finestra alla Cadenza di Campionamento

Sezione intitolata “2. Abbina la Dimensione della Finestra alla Cadenza di Campionamento”

Per dati a 1Hz e degradazione settimanale, una finestra di ~1 ora (3600 campioni) può essere eccessiva — la maggior parte dei segnali di degradazione non ha bisogno di così tanta storia. Inizia con ~30 campioni e calibra.

Sezione intitolata “3. Usa la Regressione Lineare per il Trending Diagnostico”

La pendenza della regressione lineare è l’output di trend più interpretabile ed è il default corretto per la lenta degradazione industriale.

I primi ≤ 3 campioni producono trend di zero o RUL di +Inf. Usa un Trigger o Filter a valle in modo che le allerte non si attivino spuriamente all’avvio.

Alimenta il flag _rul_alert in un blocco Isa182 per applicare un workflow di riconoscimento standardizzato sopra la previsione grezza.

ModbusReader → Predictive → Isa182 → Alert (email)
  1. ModbusReader: Estrae vibration_rms e bearing_temp da un sensore di vibrazione
  2. Predictive: Calcola trend, RUL e score di salute per entrambi i segnali
  3. Isa182: Attiva un allarme quando vibration_rms_rul_alert == true o bearing_temp_health_score < 30
  4. Alert: Invia email al team di manutenzione
OpcuaReader → Predictive → Reshape → Chart (gauge per segnale)
└→ InfluxDb2Writer
  1. OpcuaReader: Legge tutti i segnali rilevanti dal server OPC UA dell’asset
  2. Predictive: Arricchisce ogni segnale con _trend, _rul, _health_score
  3. Reshape: Ristruttura il payload per il consumo da parte del chart
  4. Chart: Renderizza un gauge per lo score di salute di ogni segnale
  5. InfluxDb2Writer: Persiste per analisi di trend a lungo termine
  • ISA-18.2 - Avvolgi le allerte RUL in una macchina a stati
  • Anomaly Detect - Rileva outlier statistici
  • Aggregation - Media i segnali prima di alimentare Predictive
  • Trigger - Emissione condizionale su allerte RUL
  • InfluxDB v2 - Persiste metriche predittive per analisi