Conector de Mantenimiento Predictivo
Descripción General
Sección titulada «Descripción General»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.
Características
Sección titulada «Características»- ✅ 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
Configuración Básica
Sección titulada «Configuración Básica»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 }}Suavizado EWMA para Señales Ruidosas
Sección titulada «Suavizado EWMA para Señales Ruidosas»{ "type": "Predictive", "config": { "signals": [ { "key": "bearing_temperature", "upperLimit": 95.0, "lowerLimit": 20.0 } ], "windowSize": 50, "method": "ewma" }}Múltiples Señales
Sección titulada «Múltiples Señales»{ "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 }}Parámetros de Configuración
Sección titulada «Parámetros de Configuración»Signals
Sección titulada «Signals»Lista obligatoria no vacía de señales a monitorizar.
{ "signals": [ { "key": "vibration_rms", "upperLimit": 0.8, "lowerLimit": 0.0, "degradationRate": 0.001 } ]}Signal: Key
Sección titulada «Signal: Key»La clave de la carga a leer en cada ciclo. Debe coincidir exactamente con la carga entrante.
{ "key": "vibration_rms" }Signal: UpperLimit / LowerLimit
Sección titulada «Signal: UpperLimit / LowerLimit»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 tendencialowerLimit- 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.
Signal: DegradationRate
Sección titulada «Signal: DegradationRate»Reservado para uso futuro (pendiente de degradación esperada por señal). Opcional.
{ "degradationRate": 0.001 }Window Size
Sección titulada «Window Size»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)
Alert On RUL
Sección titulada «Alert On RUL»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.
Carga de Salida
Sección titulada «Carga de Salida»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}| Clave | Significado |
|---|---|
<key>_trend | Tasa de cambio por ciclo |
<key>_rul | Vida Útil Restante en ciclos (o +Inf cuando no es predecible) |
<key>_health_score | Puntuación 0-100 (100 = sano, 0 = en/más allá de un límite) |
<key>_rul_alert | Se 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.
Referencia de Cálculo
Sección titulada «Referencia de Cálculo»Tendencia
Sección titulada «Tendencia»linear_regression: pendientem = (n·Σxy − Σx·Σy) / (n·Σx² − (Σx)²)sobre la ventanamoving_average:mean(window_t) − mean(window_{t−1})ewma:EWMA_t − EWMA_{t−1}, conalpha = 2 / (windowSize + 1)
- Si
trend > 0yupperLimitestá definido:RUL = (upperLimit − currentVal) / trend - Si
trend < 0ylowerLimitestá 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.
Health Score
Sección titulada «Health Score»- 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].
Flujo de Datos
Sección titulada «Flujo de Datos»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: 10está definido →_rul_alert: true
Casos de Uso Comunes
Sección titulada «Casos de Uso Comunes»1. Seguimiento de Degradación de Cojinetes
Sección titulada «1. Seguimiento de Degradación de Cojinetes»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.
Solución de Problemas
Sección titulada «Solución de Problemas»insufficient data points
Sección titulada «insufficient data points»Problema: Error reportado para las primeras muestras
Soluciones:
- Comportamiento esperado —
linear_regressionnecesita al menos 3 muestras antes de poder emitir una tendencia - EWMA y media móvil necesitan al menos 1 muestra
- Usa un conector
Filterdescendente para absorber la advertencia si lo deseas
cannot convert <type> to float64
Sección titulada «cannot convert <type> to float64»Problema: Un valor de señal no puede coercerse a número
Soluciones:
- Confirma que el conector ascendente está entregando valores numéricos para la
keyconfigurada - Booleanos, structs y arrays no pueden procesarse — usa un
Transformascendente para extraer un escalar - Las cadenas son aceptadas por conectores ascendentes que pasan por el parseo numérico estilo OEE, pero
Predictiverequiere tipos compatibles conconnector.ToFloat64
La RUL es Siempre +Inf
Sección titulada «La RUL es Siempre +Inf»Problema: La tendencia parece ser 0 o no se ha definido límite
Soluciones:
- La señal debe tener una tendencia distinta de cero Y un límite alineado con la dirección de la tendencia
- Si la señal no está cambiando, la RUL no está bien definida — este es el comportamiento correcto
- 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:
- Aumenta
windowSizepara suavizar la estimación de tendencia - Cambia de
linear_regressionaewmapara tendencias menos nerviosas - Eleva el umbral
alertOnRulpara 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:
- Verifica que el valor actual no esté ya más allá del límite configurado — si lo está, la puntuación es correctamente 0
- Si sólo se define
lowerLimity el valor es igual a 0, la fórmulavalue / lowerLimittambién es 0 - Configura ambos
upperLimitylowerLimitpara una puntuación basada en el punto medio
Mejores Prácticas
Sección titulada «Mejores Prácticas»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.
4. Evita Alertar en la Primera Muestra
Sección titulada «4. Evita Alertar en la Primera Muestra»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.
Flujos de Trabajo de Ejemplo
Sección titulada «Flujos de Trabajo de Ejemplo»Predictive → Alarma → Notificación
Sección titulada «Predictive → Alarma → Notificación»ModbusReader → Predictive → Isa182 → Alert (email)- ModbusReader: Extrae
vibration_rmsybearing_tempde un sensor de vibración - Predictive: Calcula tendencia, RUL y health score para ambas señales
- Isa182: Dispara una alarma cuando
vibration_rms_rul_alert == trueobearing_temp_health_score < 30 - Alert: Envía email al equipo de mantenimiento
Dashboard Multi-Señal de Salud de Activo
Sección titulada «Dashboard Multi-Señal de Salud de Activo»OpcuaReader → Predictive → Reshape → Chart (medidor por señal) └→ InfluxDb2Writer- OpcuaReader: Lee todas las señales relevantes del servidor OPC UA del activo
- Predictive: Enriquece cada señal con
_trend,_rul,_health_score - Reshape: Reestructura la carga para el consumo del gráfico
- Chart: Renderiza un medidor por cada health score de señal
- InfluxDb2Writer: Persiste para análisis de tendencia a largo plazo
Conectores Relacionados
Sección titulada «Conectores Relacionados»- 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
Recursos Adicionales
Sección titulada «Recursos Adicionales»- ISO 17359 - Condition monitoring and diagnostics of machines (general guidelines)
- ISO 13374 - Condition monitoring and diagnostics of machine systems (data processing, communication and presentation)
- NASA Prognostics Center of Excellence - Investigación de metodología RUL
- Referencia de Media Móvil Ponderada Exponencialmente (EWMA)