Zum Inhalt springen

Predictive Maintenance-Konnektor

Der Predictive-Konnektor reichert eine eingehende Meddle-Payload mit Predictive-Maintenance-Metriken für eines oder mehrere konfigurierte Signale an. Für jedes Signal berechnet er einen Trend (Änderungsrate), eine Schätzung der verbleibenden Nutzungsdauer (RUL) in Zyklen und einen Gesundheitsscore zwischen 0 und 100. Er löst außerdem ein optionales Warn-Flag aus, wenn die RUL unter einen benutzerdefinierten Schwellenwert fällt.

Konnektor-Typen:

  • Predictive - Zustandsbehafteter Prozessor, der einen rollenden Buffer pro Signal verwaltet und angereicherte Payloads ausgibt

Obwohl es sich um einen Prozessor handelt, ist der Konnektor unter industrial/ kategorisiert, da sein primärer Anwendungsfall die Zustandsüberwachung von Maschinen, Motoren, Pumpen und anderen industriellen Anlagen ist.

  • ✅ Drei Trend-Berechnungsmethoden: lineare Regression, gleitender Durchschnitt, EWMA
  • ✅ Obere und untere Grenzen pro Signal
  • ✅ RUL-Schätzung in Zyklen bis zu den konfigurierten Grenzen
  • ✅ Gesundheitsscore abgeleitet aus dem Abstand zu konfigurierten Grenzen (0-100)
  • ✅ Optionales RUL-Warn-Flag unterhalb eines Schwellenwerts
  • ✅ Tolerante numerische Konvertierung (verarbeitet Ints, Floats, Strings)
  • ✅ Ursprüngliche Payload bleibt erhalten — prädiktive Felder werden hinzugefügt
{
"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
}
}

Erforderliche, nicht-leere Liste der zu überwachenden Signale.

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

Der Payload-Schlüssel, der bei jedem Zyklus gelesen wird. Muss exakt mit der eingehenden Payload übereinstimmen.

{ "key": "vibration_rms" }

Die konfigurierten Betriebsgrenzen für dieses Signal.

{
"upperLimit": 0.8,
"lowerLimit": 0.0
}
  • upperLimit - Der “Alarm-Hoch”-Wert. Wenn der Trend positiv ist, wird die RUL als Abstand zu dieser Grenze geteilt durch den Trend berechnet
  • lowerLimit - Der “Alarm-Niedrig”-Wert. Wenn der Trend negativ ist, wird die RUL als Abstand unter dem aktuellen Wert geteilt durch |trend| berechnet

Mindestens eine der beiden sollte für eine sinnvolle RUL gesetzt werden; andernfalls wird RUL als +Inf gemeldet.

Reserviert für zukünftige Verwendung (erwartete Degradationssteigung pro Signal). Optional.

{ "degradationRate": 0.001 }

Erforderlich. Die Anzahl der aktuellen Samples, die im Ring-Buffer pro Signal aufbewahrt werden.

{ "windowSize": 30 }

Empfohlene Werte:

  • Schnelle/saubere Signale: 10-30
  • Verrauschte industrielle Sensoren: 50-200
  • Langsame Degradationssignale: 500+

Die Fenstergröße steuert auch den EWMA-Glättungsfaktor: alpha = 2 / (windowSize + 1).

Erforderlich. Einer der folgenden:

  • linear_regression - Kleinste-Quadrate-Steigung über das gesamte Fenster (benötigt ≥ 3 Samples)
  • moving_average - Differenz zwischen aufeinanderfolgenden gleitenden Durchschnitten (benötigt ≥ 1 Sample)
  • ewma - Exponentiell gewichteter gleitender Durchschnitt; Trend ist Delta zwischen aufeinanderfolgenden EWMA-Werten (benötigt ≥ 1 Sample)
{ "method": "linear_regression" }

Auswahl einer Methode:

  • Lineare Regression: am besten, wenn Sie der jüngsten Vergangenheit als Prädiktor für die Degradationssteigung vertrauen (Motorlager, allmählicher Verschleiß)
  • Gleitender Durchschnitt: am besten, wenn Sie Rauschunterdrückung mit minimaler Verzögerung wünschen
  • EWMA: am besten, wenn aktuelle Samples mehr Gewicht haben sollen als alte (sich schnell ändernde Systeme)

Optional. Wenn die RUL unter diesen Schwellenwert (in Zyklen) fällt, wird die Ausgabe-Payload mit <key>_rul_alert: true markiert.

{ "alertOnRul": 168 }

Die Einheit ist “Zyklen” — also die Anzahl der Samples bis zur projizierten Erreichung des Limits. Um in Echtzeit umzurechnen, multiplizieren Sie mit dem vorgelagerten Sampling-Intervall.

Jedes Signal produziert drei neue Schlüssel (und optional einen vierten):

{
"vibration_rms": 0.62,
"vibration_rms_trend": 0.005,
"vibration_rms_rul": 36,
"vibration_rms_health_score": 22.5,
"vibration_rms_rul_alert": true
}
SchlüsselBedeutung
<key>_trendÄnderungsrate pro Zyklus
<key>_rulVerbleibende Nutzungsdauer in Zyklen (oder +Inf, wenn nicht vorhersagbar)
<key>_health_score0-100-Score (100 = gesund, 0 = an/jenseits einer Grenze)
<key>_rul_alertAuf true gesetzt, nur wenn alertOnRul konfiguriert ist und RUL darunter liegt

Die ursprünglichen Schlüssel aus der eingehenden Payload werden unverändert durchgereicht.

  • linear_regression: Steigung m = (n·Σxy − Σx·Σy) / (n·Σx² − (Σx)²) über das Fenster
  • moving_average: mean(window_t) − mean(window_{t−1})
  • ewma: EWMA_t − EWMA_{t−1}, mit alpha = 2 / (windowSize + 1)
  • Wenn trend > 0 und upperLimit gesetzt: RUL = (upperLimit − currentVal) / trend
  • Wenn trend < 0 und lowerLimit gesetzt: RUL = (currentVal − lowerLimit) / |trend|
  • Andernfalls: RUL = +Inf (keine sinnvolle Schätzung)

Wenn der aktuelle Wert die relevante Grenze bereits überschritten hat, ist RUL = 0.

  • Wenn beide Grenzen gesetzt sind: 100 bedeutet am Mittelpunkt; 0 an einer der Grenzen (linear)
  • Wenn nur obere: 100 bei 0, 0 bei upperLimit (linear)
  • Wenn nur untere: 100 bei hohen Werten, 0 bei lowerLimit
  • Wenn weder: 100 (keine Einschränkungen, Signal nur informativ)

Alle Scores werden auf [0, 100] begrenzt.

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

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

Letzte 10 Samples von vibration_rms:

[0.42, 0.45, 0.47, 0.51, 0.55, 0.58, 0.60, 0.63, 0.65, 0.68]
  • Trend (Steigung): ≈ +0,029 pro Zyklus
  • Aktueller Wert: 0,68
  • RUL: (0,8 − 0,68) / 0,029 ≈ 4,1 Zyklen
  • Health-Score: ((0,8 − 0,68) / 0,8) × 100 = 15,0
  • Falls alertOnRul: 10 gesetzt → _rul_alert: true

Vibrations-RMS überwachen und Ausfall 7 Tage im Voraus vorhersagen (unter der Annahme von 1-Minuten-Sampling, 168 Zyklen/Woche × 60 ≈ 10080 Zyklen/Woche):

{
"type": "Predictive",
"config": {
"signals": [
{
"key": "vibration_rms",
"upperLimit": 0.8
}
],
"windowSize": 60,
"method": "linear_regression",
"alertOnRul": 10080
}
}
{
"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"
}
}

Die nachgelagerte Pipeline kann einen Gesamt-Pumpen-Gesundheitsscore berechnen, indem <signal>_health_score-Schlüssel aggregiert werden.

Problem: Fehler bei den ersten Samples gemeldet

Lösungen:

  1. Erwartetes Verhalten — linear_regression benötigt mindestens 3 Samples, bevor ein Trend ausgegeben werden kann
  2. EWMA und gleitender Durchschnitt benötigen mindestens 1 Sample
  3. Verwenden Sie einen nachgelagerten Filter-Konnektor, um die Warnung bei Bedarf zu unterdrücken

Problem: Ein Signalwert kann nicht in eine Zahl konvertiert werden

Lösungen:

  1. Bestätigen, dass der vorgelagerte Konnektor numerische Werte für den konfigurierten key liefert
  2. Booleans, Structs und Arrays können nicht verarbeitet werden — verwenden Sie einen vorgelagerten Transform, um einen Skalar zu extrahieren
  3. Strings werden von vorgelagerten Konnektoren akzeptiert, die OEE-artiges numerisches Parsing durchführen, aber Predictive erfordert mit connector.ToFloat64-kompatible Typen

Problem: Trend scheint 0 zu sein oder keine Grenze ist gesetzt

Lösungen:

  1. Das Signal muss einen Trend ungleich Null UND eine mit der Trendrichtung ausgerichtete Grenze haben
  2. Wenn sich das Signal nicht ändert, ist die RUL nicht sinnvoll definiert — dies ist korrektes Verhalten
  3. Für ein flaches, aber degradiertes Signal bevorzugen Sie den Gesundheitsscore gegenüber der RUL

Problem: Falsche _rul_alert: true über viele Zyklen

Lösungen:

  1. windowSize erhöhen, um die Trendschätzung zu glätten
  2. Von linear_regression zu ewma für weniger jittrige Trends wechseln
  3. Den alertOnRul-Schwellenwert anheben, um ihn an Ihre echte Vorlaufzeit anzupassen

Problem: Score bleibt bei 0

Lösungen:

  1. Überprüfen, dass der aktuelle Wert die konfigurierte Grenze nicht bereits überschritten hat — wenn ja, ist der Score korrekt 0
  2. Wenn nur lowerLimit gesetzt ist und der Wert gleich 0 ist, ist die Formel value / lowerLimit ebenfalls 0
  3. Sowohl upperLimit als auch lowerLimit für einen mittelpunktbasierten Score konfigurieren

1. Grenzen anhand echter Betriebsdaten kalibrieren

Abschnitt betitelt „1. Grenzen anhand echter Betriebsdaten kalibrieren“

Übernehmen Sie upperLimit nicht aus einem Hersteller-Datenblatt. Profilieren Sie die Anlage für einige Wochen und wählen Sie eine Grenze, die 10-20% innerhalb des katastrophalen Schwellenwerts liegt.

Für 1Hz-Daten und wöchentliche Degradation kann ein Fenster von ~1 Stunde (3600 Samples) überdimensioniert sein — die meisten Degradationssignale benötigen nicht so viel Historie. Beginnen Sie mit ~30 Samples und stimmen Sie ab.

Abschnitt betitelt „3. Lineare Regression für diagnostisches Trending verwenden“

Die Steigung der linearen Regression ist die am besten interpretierbare Trend-Ausgabe und der richtige Standard für langsame industrielle Degradation.

Die ersten ≤ 3 Samples produzieren Trends von Null oder RUL von +Inf. Verwenden Sie einen nachgelagerten Trigger oder Filter, damit Alarme beim Start nicht fälschlicherweise auslösen.

Den _rul_alert-Flag in einen Isa182-Block einspeisen, um einen standardisierten Bestätigungs-Workflow zusätzlich zur reinen Vorhersage anzuwenden.

ModbusReader → Predictive → Isa182 → Alert (E-Mail)
  1. ModbusReader: Holt vibration_rms und bearing_temp von einem Vibrationssensor
  2. Predictive: Berechnet Trend, RUL und Gesundheitsscore für beide Signale
  3. Isa182: Triggert einen Alarm, wenn vibration_rms_rul_alert == true oder bearing_temp_health_score < 30
  4. Alert: E-Mailt das Wartungsteam
OpcuaReader → Predictive → Reshape → Chart (Anzeige pro Signal)
└→ InfluxDb2Writer
  1. OpcuaReader: Liest alle relevanten Signale vom OPC UA-Server der Anlage
  2. Predictive: Reichert jedes Signal mit _trend, _rul, _health_score an
  3. Reshape: Strukturiert die Payload für den Chart-Verbrauch um
  4. Chart: Rendert eine Anzeige pro Signal-Gesundheitsscore
  5. InfluxDb2Writer: Persistiert für langfristige Trendanalysen
  • ISA-18.2 - RUL-Alarme in eine Zustandsmaschine einhüllen
  • Anomaly Detection - Statistische Ausreißer erkennen
  • Aggregation - Signale vor der Einspeisung in Predictive mitteln
  • Trigger - Bedingte Ausgabe bei RUL-Alarmen
  • InfluxDB - Prädiktive Metriken zur Analyse persistieren