Реализация предиктивного обслуживания оборудования (Predictive Maintenance)
Предиктивное обслуживание — переход от calendar-based (раз в N месяцев) к condition-based (когда оборудование действительно нуждается). ML-система анализирует данные датчиков в реальном времени и предсказывает отказ за дни или недели, давая время на плановую замену без экстренной остановки.
Контекст задачи
CMMS Maturity Model:
- Уровень 1: Reactive (ремонт после отказа)
- Уровень 2: Scheduled (по календарю)
- Уровень 3: Condition-Based (по состоянию из датчиков)
- Уровень 4: Predictive (прогнозирование отказа)
- Уровень 5: Prescriptive (рекомендация оптимального времени и типа вмешательства)
Большинство промышленных предприятий — на уровне 2-3. ML-система реализует уровни 4-5.
ROI:
- Стоимость незапланированной остановки: $5,000-$50,000/час (зависит от производства)
- Снижение аварийных остановок на 30-50%: существенная экономия
- Снижение избыточного планового ТО: 10-20% экономия на запчастях
Архитектура данных
Многоуровневая пирамида данных:
Уровень 4 (Бизнес): ROI, MTBF, OEE
↑
Уровень 3 (KPI): Health Index, RUL, риск-скор
↑
Уровень 2 (Признаки): FFT, статистики, трендовые фичи
↑
Уровень 1 (Сырые данные): вибрация (5-20 кГц), температура, ток, давление
Сенсорный стек:
sensor_config = {
# Вибрация — основной диагностический параметр
'vibration': {
'type': 'accelerometer_triaxial',
'sampling_rate': 25600, # Hz (для подшипниковых дефектов нужно 10+ кГц)
'vendors': ['PCB Piezotronics', 'Brüel & Kjær', 'IMC'],
'mounting': 'hard_mount_on_bearing_housing'
},
# Температура — косвенный, но надёжный
'temperature': {
'type': 'PT100 / thermocouple',
'sampling_rate': 1, # Hz достаточно
'typical_fault_signal': 'gradual_rise > 10°C above baseline'
},
# Ток электродвигателя (MCSA — Motor Current Signature Analysis)
'motor_current': {
'type': 'current_transformer',
'sampling_rate': 10000,
'fault_frequency': 'rotor_bar_frequency, eccentricity'
},
# Ультразвук — ранняя детекция подшипниковых дефектов
'ultrasound': {
'type': 'acoustic_emission',
'frequency_range': '20-100 kHz',
'advantage': 'detects lubrication issues earliest'
}
}
Feature Engineering для предиктивного обслуживания
Временные признаки из вибрации:
import numpy as np
from scipy.stats import kurtosis, skew
from scipy.fft import fft, fftfreq
def extract_vibration_features(vibration_signal, sampling_rate):
"""
Стандартный набор признаков из вибрационного сигнала
"""
n = len(vibration_signal)
# Временная область
time_features = {
'rms': np.sqrt(np.mean(vibration_signal**2)),
'peak': np.max(np.abs(vibration_signal)),
'peak_to_peak': np.ptp(vibration_signal),
'crest_factor': np.max(np.abs(vibration_signal)) / np.sqrt(np.mean(vibration_signal**2)),
'kurtosis': kurtosis(vibration_signal), # > 3 указывает на дефект подшипника
'skewness': skew(vibration_signal),
'shape_factor': np.sqrt(np.mean(vibration_signal**2)) / np.mean(np.abs(vibration_signal))
}
# Частотная область (FFT)
freq = fftfreq(n, 1/sampling_rate)[:n//2]
magnitude = np.abs(fft(vibration_signal))[:n//2]
spectral_features = {
'dominant_frequency': freq[np.argmax(magnitude)],
'spectral_centroid': np.sum(freq * magnitude) / np.sum(magnitude),
'band_power_0_500': np.sum(magnitude[(freq > 0) & (freq < 500)]),
'band_power_500_2000': np.sum(magnitude[(freq >= 500) & (freq < 2000)]),
'band_power_2000_10000': np.sum(magnitude[(freq >= 2000) & (freq < 10000)])
}
# Envelope analysis (для подшипниковых дефектов)
from scipy.signal import hilbert
analytic = hilbert(vibration_signal)
envelope = np.abs(analytic)
env_fft = np.abs(fft(envelope))[:n//2]
envelope_features = {
'envelope_rms': np.sqrt(np.mean(envelope**2)),
'envelope_peak': np.max(envelope),
'envelope_kurtosis': kurtosis(envelope)
}
return {**time_features, **spectral_features, **envelope_features}
BPFO/BPFI отслеживание:
def track_bearing_defect_frequencies(fft_magnitude, fft_freq, shaft_rpm,
bearing_geometry):
"""
Мониторинг характерных дефектных частот подшипника
Рост амплитуды на этих частотах = развивающийся дефект
"""
bpfo, bpfi, bsf, ftf = calculate_bearing_frequencies(shaft_rpm, bearing_geometry)
results = {}
for name, freq in [('bpfo', bpfo), ('bpfi', bpfi), ('bsf', bsf)]:
freq_idx = np.argmin(np.abs(fft_freq - freq))
# Амплитуда в окне ±5% от целевой частоты
band = fft_magnitude[max(0, freq_idx-5):freq_idx+5]
results[f'{name}_amplitude'] = np.max(band)
# Первые 3 гармоники (характерно для развитых дефектов)
for h in range(2, 4):
harmonic_idx = np.argmin(np.abs(fft_freq - freq * h))
harmonic_band = fft_magnitude[max(0, harmonic_idx-5):harmonic_idx+5]
results[f'{name}_harmonic_{h}'] = np.max(harmonic_band)
return results
ML-модели для PdM
Многоклассовая классификация состояния:
from lightgbm import LGBMClassifier
health_states = {
0: 'normal',
1: 'minor_degradation',
2: 'significant_degradation',
3: 'critical_near_failure'
}
health_classifier = LGBMClassifier(
n_estimators=300,
num_leaves=31,
class_weight='balanced' # имбаланс: class 3 редкий
)
health_classifier.fit(X_labeled, y_health_state)
RUL regression (Remaining Useful Life):
import torch
import torch.nn as nn
class MultiScaleCNNLSTM(nn.Module):
"""
Multi-scale CNN: разные масштабы паттернов деградации
LSTM: временные зависимости
"""
def __init__(self, input_size, hidden_size=128):
super().__init__()
# Мультимасштабный CNN
self.conv1 = nn.Conv1d(input_size, 64, kernel_size=3, padding=1)
self.conv2 = nn.Conv1d(input_size, 64, kernel_size=7, padding=3)
self.conv3 = nn.Conv1d(input_size, 64, kernel_size=15, padding=7)
# LSTM объединяет выходы CNN
self.lstm = nn.LSTM(192, hidden_size, num_layers=2, batch_first=True)
self.fc = nn.Linear(hidden_size, 1) # RUL (нормализованный)
def forward(self, x):
# x: (batch, time, features) → нужно (batch, features, time) для Conv1d
x_t = x.transpose(1, 2)
c1 = torch.relu(self.conv1(x_t))
c2 = torch.relu(self.conv2(x_t))
c3 = torch.relu(self.conv3(x_t))
multi_scale = torch.cat([c1, c2, c3], dim=1).transpose(1, 2)
lstm_out, _ = self.lstm(multi_scale)
return self.fc(lstm_out[:, -1, :])
Обучение на NASA CMAPSS/PRONOSTIA: Публичные датасеты для валидации методов PdM до применения на реальных данных завода.
Внедрение и интеграция
OPC-UA / OSIsoft PI → Feature Pipeline:
from opcua import Client
def collect_opc_data(server_url, node_ids, sampling_interval_ms=100):
client = Client(server_url)
client.connect()
values = {}
for node_id in node_ids:
node = client.get_node(node_id)
values[node_id] = node.get_value()
return values
# Feature pipeline: каждые 5 минут → агрегация → inference
SAP PM / Maximo работа-ордера: При health score < threshold → автоматическое создание Work Order с рекомендуемым типом вмешательства.
Reliability Engineer Workflow:
- Система публикует Health Index на Grafana дашборде
- При critical state → уведомление в Slack + CMMS Work Order
- Инженер верифицирует + назначает срок ТО
- После ТО: обратная связь в модель (confirmed / false positive)
Метрики качества
| Метрика | Цель |
|---|---|
| AUC-ROC (отказ в 7 дней) | > 0.80 |
| False Alarm Rate | < 10% |
| Detection Rate | > 70% отказов за 3+ дней |
| RMSE RUL | < 20% от реального RUL |
Сроки: OPC-UA коллектор, вибрационные фичи, Isolation Forest health score, дашборд — 5-6 недель. CNN-LSTM RUL модель, multi-sensor fusion, CMMS интеграция, automated Work Orders — 4-5 месяцев.







