Ir al contenido

Conector de Mantenimiento Predictivo

El conector Predictive enriquece una carga entrante de Meddle con métricas de mantenimiento predictivo para una o más señales configuradas. Para cada señal calcula una tendencia (tasa de cambio), una estimación de Vida Útil Restante (RUL) en ciclos y un health score entre 0 y 100. También levanta una bandera de alerta opcional cuando la RUL cae por debajo de un umbral definido por el usuario.

Tipos de Conector:

  • Predictive - Procesador con estado que mantiene un búfer rodante por señal y emite cargas enriquecidas

Aunque es un procesador, el conector se cataloga en industrial/ porque su caso de uso principal es el monitoreo de condición de máquinas, motores, bombas y otros activos industriales.

  • ✅ Tres métodos de cálculo de tendencia: regresión lineal, media móvil, EWMA
  • ✅ Límites superior e inferior por señal
  • ✅ Estimación de RUL en ciclos hacia los límites configurados
  • ✅ Health score derivado de la distancia a los límites configurados (0-100)
  • ✅ Bandera opcional de alerta de RUL por debajo de un umbral
  • ✅ Coerción numérica flexible (maneja ints, floats, cadenas)
  • ✅ Carga original preservada — los campos predictivos se fusionan

Tendencia por Regresión Lineal con Alerta de RUL

Sección titulada «Tendencia por Regresión Lineal con Alerta de RUL»
{
"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 obligatoria no vacía de señales a monitorizar.

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

La clave de la carga a leer en cada ciclo. Debe coincidir exactamente con la carga entrante.

{ "key": "vibration_rms" }

Los límites operativos configurados para esta señal.

{
"upperLimit": 0.8,
"lowerLimit": 0.0
}
  • upperLimit - El valor de “alarma alta”. Cuando la tendencia es positiva, la RUL se calcula como la distancia hasta este límite dividida por la tendencia
  • lowerLimit - El valor de “alarma baja”. Cuando la tendencia es negativa, la RUL se calcula como la distancia por debajo del valor actual dividida por |tendencia|

Al menos uno de los dos debería estar definido para una RUL significativa; de lo contrario, la RUL se reporta como +Inf.

Reservado para uso futuro (pendiente de degradación esperada por señal). Opcional.

{ "degradationRate": 0.001 }

Obligatorio. El número de muestras recientes a retener en el búfer circular por señal.

{ "windowSize": 30 }

Valores recomendados:

  • Señales rápidas/limpias: 10-30
  • Sensores industriales ruidosos: 50-200
  • Señales de degradación lenta: 500+

El tamaño de la ventana también determina el factor de suavizado EWMA: alpha = 2 / (windowSize + 1).

Obligatorio. Uno de:

  • linear_regression - Pendiente de mínimos cuadrados sobre toda la ventana (necesita ≥ 3 muestras)
  • moving_average - Diferencia entre medias móviles sucesivas (necesita ≥ 1 muestra)
  • ewma - Media móvil ponderada exponencialmente; la tendencia es el delta entre valores EWMA sucesivos (necesita ≥ 1 muestra)
{ "method": "linear_regression" }

Elegir un método:

  • Regresión lineal: la mejor cuando confías en el pasado reciente como predictor de la pendiente de degradación (cojinetes de motor, desgaste gradual)
  • Media móvil: la mejor cuando quieres rechazar el ruido con latencia mínima
  • EWMA: la mejor cuando las muestras recientes deben pesar más que las antiguas (sistemas que cambian rápido)

Opcional. Cuando la RUL cae por debajo de este umbral (en ciclos), la carga de salida se etiqueta con <key>_rul_alert: true.

{ "alertOnRul": 168 }

La unidad es “ciclos” — es decir, el número de muestras hasta que la señal alcance su límite proyectado. Para traducirla a tiempo de reloj, multiplica por el intervalo de muestreo ascendente.

Cada señal produce tres nuevas claves (y opcionalmente una cuarta):

{
"vibration_rms": 0.62,
"vibration_rms_trend": 0.005,
"vibration_rms_rul": 36,
"vibration_rms_health_score": 22.5,
"vibration_rms_rul_alert": true
}
ClaveSignificado
<key>_trendTasa de cambio por ciclo
<key>_rulVida Útil Restante en ciclos (o +Inf cuando no es predecible)
<key>_health_scorePuntuación 0-100 (100 = sano, 0 = en/más allá de un límite)
<key>_rul_alertSe establece a true sólo cuando alertOnRul está configurado y la RUL está por debajo

Las claves originales de la carga entrante se pasan sin cambios.

  • linear_regression: pendiente m = (n·Σxy − Σx·Σy) / (n·Σx² − (Σx)²) sobre la ventana
  • moving_average: mean(window_t) − mean(window_{t−1})
  • ewma: EWMA_t − EWMA_{t−1}, con alpha = 2 / (windowSize + 1)
  • Si trend > 0 y upperLimit está definido: RUL = (upperLimit − currentVal) / trend
  • Si trend < 0 y lowerLimit está definido: RUL = (currentVal − lowerLimit) / |trend|
  • En otro caso: RUL = +Inf (no hay estimación significativa)

Si el valor actual ya está más allá del límite relevante, RUL = 0.

  • Si ambos límites están definidos: 100 significa en el punto medio; 0 en cualquier límite (lineal)
  • Si sólo upper: 100 en 0, 0 en upperLimit (lineal)
  • Si sólo lower: 100 en valores altos, 0 en lowerLimit
  • Si ninguno: 100 (sin restricciones, señal informativa)

Todas las puntuaciones se acotan a [0, 100].

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

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

Últimas 10 muestras de vibration_rms:

[0.42, 0.45, 0.47, 0.51, 0.55, 0.58, 0.60, 0.63, 0.65, 0.68]
  • Tendencia (pendiente): ≈ +0.029 por ciclo
  • Valor actual: 0.68
  • RUL: (0.8 − 0.68) / 0.029 ≈ 4.1 ciclos
  • Health score: ((0.8 − 0.68) / 0.8) × 100 = 15.0
  • Si alertOnRul: 10 está definido → _rul_alert: true

Monitoriza el RMS de vibración y predice el fallo a 7 días (asumiendo muestreo de 1 minuto, 168 ciclos/semana × 60 ≈ 10080 ciclos/semana):

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

2. Vigilancia de Presión del Sistema de Lubricación

Sección titulada «2. Vigilancia de Presión del Sistema de Lubricación»
{
"type": "Predictive",
"config": {
"signals": [
{
"key": "oil_pressure_bar",
"lowerLimit": 2.0
}
],
"windowSize": 30,
"method": "ewma",
"alertOnRul": 240
}
}

3. Puntuación Multi-Señal de Salud de Bomba

Sección titulada «3. Puntuación Multi-Señal de Salud de Bomba»
{
"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"
}
}

El pipeline descendente puede calcular una puntuación global de salud de la bomba agregando las claves <signal>_health_score.

Problema: Error reportado para las primeras muestras

Soluciones:

  1. Comportamiento esperado — linear_regression necesita al menos 3 muestras antes de poder emitir una tendencia
  2. EWMA y media móvil necesitan al menos 1 muestra
  3. Usa un conector Filter descendente para absorber la advertencia si lo deseas

Problema: Un valor de señal no puede coercerse a número

Soluciones:

  1. Confirma que el conector ascendente está entregando valores numéricos para la key configurada
  2. Booleanos, structs y arrays no pueden procesarse — usa un Transform ascendente para extraer un escalar
  3. Las cadenas son aceptadas por conectores ascendentes que pasan por el parseo numérico estilo OEE, pero Predictive requiere tipos compatibles con connector.ToFloat64

Problema: La tendencia parece ser 0 o no se ha definido límite

Soluciones:

  1. La señal debe tener una tendencia distinta de cero Y un límite alineado con la dirección de la tendencia
  2. Si la señal no está cambiando, la RUL no está bien definida — este es el comportamiento correcto
  3. Para una señal plana pero degradada, prefiere el health score sobre la RUL

Las Alertas de RUL Se Disparan Constantemente

Sección titulada «Las Alertas de RUL Se Disparan Constantemente»

Problema: _rul_alert: true espurio en muchos ciclos

Soluciones:

  1. Aumenta windowSize para suavizar la estimación de tendencia
  2. Cambia de linear_regression a ewma para tendencias menos nerviosas
  3. Eleva el umbral alertOnRul para alinearlo con tu lead time real

El Health Score Está en 0 Sin Razón Aparente

Sección titulada «El Health Score Está en 0 Sin Razón Aparente»

Problema: La puntuación se queda en 0

Soluciones:

  1. Verifica que el valor actual no esté ya más allá del límite configurado — si lo está, la puntuación es correctamente 0
  2. Si sólo se define lowerLimit y el valor es igual a 0, la fórmula value / lowerLimit también es 0
  3. Configura ambos upperLimit y lowerLimit para una puntuación basada en el punto medio

1. Calibra los Límites con Datos Operativos Reales

Sección titulada «1. Calibra los Límites con Datos Operativos Reales»

No saques upperLimit de la hoja de datos del proveedor. Perfila el activo durante unas semanas y elige un límite que esté un 10-20% dentro del umbral catastrófico.

2. Ajusta el Tamaño de Ventana a la Cadencia de Muestreo

Sección titulada «2. Ajusta el Tamaño de Ventana a la Cadencia de Muestreo»

Para datos a 1Hz y degradación semanal, una ventana de ~1 hora (3600 muestras) puede ser excesiva — la mayoría de señales de degradación no necesitan tanta historia. Empieza con ~30 muestras y ajusta.

3. Usa Regresión Lineal para Tendencia Diagnóstica

Sección titulada «3. Usa Regresión Lineal para Tendencia Diagnóstica»

La pendiente de la regresión lineal es la salida de tendencia más interpretable y es el valor por defecto correcto para degradación industrial lenta.

Las primeras ≤ 3 muestras producen tendencias de cero o RUL de +Inf. Usa un Trigger o Filter descendente para que las alertas no se disparen espuriamente al arranque.

5. Encadena con una Máquina de Estados de Alarma

Sección titulada «5. Encadena con una Máquina de Estados de Alarma»

Pasa la bandera _rul_alert a un bloque Isa182 para aplicar un flujo de confirmación estandarizado sobre la predicción cruda.

ModbusReader → Predictive → Isa182 → Alert (email)
  1. ModbusReader: Extrae vibration_rms y bearing_temp de un sensor de vibración
  2. Predictive: Calcula tendencia, RUL y health score para ambas señales
  3. Isa182: Dispara una alarma cuando vibration_rms_rul_alert == true o bearing_temp_health_score < 30
  4. Alert: Envía email al equipo de mantenimiento
OpcuaReader → Predictive → Reshape → Chart (medidor por señal)
└→ InfluxDb2Writer
  1. OpcuaReader: Lee todas las señales relevantes del servidor OPC UA del activo
  2. Predictive: Enriquece cada señal con _trend, _rul, _health_score
  3. Reshape: Reestructura la carga para el consumo del gráfico
  4. Chart: Renderiza un medidor por cada health score de señal
  5. InfluxDb2Writer: Persiste para análisis de tendencia a largo plazo
  • ISA-18.2 - Envuelve las alertas RUL en una máquina de estados
  • Anomaly Detect - Detecta valores atípicos estadísticos
  • Aggregation - Promedia señales antes de alimentar a Predictive
  • Trigger - Emisión condicional en alertas RUL
  • InfluxDB v2 - Persiste métricas predictivas para análisis