Разработка AI-системы мониторинга оборудования по вибрации и температуре
Вибрация и температура — два основных диагностических параметра вращающегося оборудования. Вибрация несёт информацию о механических дефектах (подшипники, дисбаланс, расцентровка), температура — о тепловых аномалиях (перегрев подшипника, нарушение смазки, перегрузка).
Размещение датчиков
Вибродатчики:
sensor_placement_guidelines = {
'motor_drive_end_bearing': {
'position': 'горизонтально на крышке подшипника',
'sensitive_to': ['unbalance', 'misalignment', 'bearing_defects'],
'frequency_range': '10-10000 Hz'
},
'motor_non_drive_end_bearing': {
'position': 'горизонтально',
'sensitive_to': ['rotor_asymmetry', 'bearing'],
'frequency_range': '10-10000 Hz'
},
'pump_bearing': {
'position': 'на корпусе насоса у подшипника',
'sensitive_to': ['cavitation', 'impeller_unbalance'],
'note': 'добавить радиальный + осевой датчики'
},
'gearbox': {
'position': 'на корпусе редуктора',
'sensitive_to': ['gear_mesh_frequency', 'tooth_defects'],
'frequency_range': '10-20000 Hz'
}
}
Тепловые датчики:
- PT100 / PT1000: точность ±0.1°C, для подшипников < 2 секунды реакции
- Thermocouple: более быстрый отклик, подходит для горячих точек
- Инфракрасные термометры: бесконтактные, для периодических обходов
- Тепловизор: периодическая инспекция, видит "горячие пятна"
Обработка вибрационного сигнала
Диагностические зоны ISO 10816:
import numpy as np
def classify_vibration_severity(rms_velocity_mm_s, machine_class):
"""
ISO 10816: классификация виброскорости по зонам A/B/C/D
Класс I: малые машины < 15 кВт
Класс II: средние машины 15-75 кВт
Класс III: крупные машины > 75 кВт на жёстком основании
"""
thresholds = {
'I': {'A': 0.28, 'B': 0.71, 'C': 1.8, 'D': float('inf')},
'II': {'A': 0.45, 'B': 1.12, 'C': 2.8, 'D': float('inf')},
'III': {'A': 0.71, 'B': 1.8, 'C': 4.5, 'D': float('inf')},
'IV': {'A': 1.12, 'B': 2.8, 'C': 7.1, 'D': float('inf')}
}
t = thresholds[machine_class]
if rms_velocity_mm_s <= t['A']:
return 'A', 'Excellent — new machine condition'
elif rms_velocity_mm_s <= t['B']:
return 'B', 'Acceptable — long-term operation allowed'
elif rms_velocity_mm_s <= t['C']:
return 'C', 'Tolerable — short-term only, schedule maintenance'
else:
return 'D', 'Unacceptable — immediate shutdown risk'
Спектральный анализ — автоматическое выявление дефектных частот:
from scipy.fft import fft, fftfreq
import scipy.signal as signal
def diagnose_from_spectrum(vibration_signal, sampling_rate, shaft_rpm,
bearing_freqs, gear_mesh_freq=None):
"""
Автоматическая диагностика по спектру вибрации
"""
n = len(vibration_signal)
freqs = fftfreq(n, 1/sampling_rate)[:n//2]
magnitude = np.abs(fft(vibration_signal))[:n//2]
shaft_freq = shaft_rpm / 60
diagnoses = []
# Дисбаланс: доминирование 1x оборотной частоты
idx_1x = np.argmin(np.abs(freqs - shaft_freq))
if magnitude[idx_1x] > np.mean(magnitude) * 10:
diagnoses.append({'fault': 'unbalance', 'severity': 'medium',
'evidence': f'1x amplitude = {magnitude[idx_1x]:.2f}'})
# Расцентровка: высокие 2x + осевая составляющая
idx_2x = np.argmin(np.abs(freqs - 2 * shaft_freq))
if magnitude[idx_2x] > magnitude[idx_1x] * 0.5:
diagnoses.append({'fault': 'misalignment', 'severity': 'medium',
'evidence': f'2x/1x ratio = {magnitude[idx_2x]/magnitude[idx_1x]:.2f}'})
# Подшипниковые дефекты: BPFO, BPFI
for bearing_name, bf in bearing_freqs.items():
for fault_name, freq in [('bpfo', bf['bpfo']), ('bpfi', bf['bpfi'])]:
idx = np.argmin(np.abs(freqs - freq))
local_mean = magnitude[max(0, idx-10):idx+10].mean()
if magnitude[idx] > local_mean * 5:
diagnoses.append({
'fault': f'{fault_name}_{bearing_name}',
'severity': 'high',
'evidence': f'Amplitude at {freq:.1f}Hz = {magnitude[idx]:.2f}'
})
return diagnoses
Температурный мониторинг
Baseline и аномалии:
class TemperatureMonitor:
def __init__(self, baseline_window_hours=24):
self.baseline = {}
self.alert_thresholds = {}
def set_baseline(self, equipment_id, temperature_history):
"""
Baseline: медианная температура в нормальном режиме
Учитывает нагрузку: температура нормальна при высокой нагрузке
"""
self.baseline[equipment_id] = {
'overall_median': np.median(temperature_history),
'load_corrected': self._fit_load_temperature_curve(temperature_history)
}
def check_temperature(self, equipment_id, current_temp, current_load):
baseline = self.baseline[equipment_id]
expected_temp = baseline['load_corrected'].predict([[current_load]])[0]
deviation = current_temp - expected_temp
if deviation > 20:
return 'CRITICAL', f'Temperature {deviation:.1f}°C above expected'
elif deviation > 10:
return 'WARNING', f'Temperature {deviation:.1f}°C above expected'
elif deviation > 5:
return 'CAUTION', f'Slight temperature elevation: {deviation:.1f}°C'
else:
return 'NORMAL', None
Тренд-анализ температуры:
def analyze_temperature_trend(temperature_series, window_days=7):
"""
Постепенный рост температуры = деградация подшипника или нарушение смазки
"""
recent = temperature_series.last(f'{window_days}D')
trend = np.polyfit(range(len(recent)), recent.values, 1)[0]
rate_per_day = trend
if rate_per_day > 1.0: # > 1°C в день = красный флаг
return 'ACCELERATING', rate_per_day
elif rate_per_day > 0.3:
return 'GRADUAL_RISE', rate_per_day
else:
return 'STABLE', rate_per_day
Корреляция вибрации и температуры
Multi-sensor fusion:
def correlate_vibration_temperature(vibration_features, temperature_features, time_lag_hours=2):
"""
Тепловые признаки могут запаздывать за вибрационными на 1-4 часа
(тепло распространяется медленнее вибрации)
"""
# Lag correlation
combined_score = 0
# Оба показателя выше нормы = усиленный сигнал
if vibration_features['kurtosis'] > 3 and temperature_features['deviation'] > 5:
combined_score = max(
vibration_features['anomaly_score'],
temperature_features['anomaly_score']
) * 1.3 # усиление при подтверждении двумя сенсорами
# Температура без вибрации = возможно смазки/охлаждение
elif temperature_features['deviation'] > 10 and vibration_features['kurtosis'] < 2:
return 'lubrication_or_cooling_issue'
return combined_score
Dashboard и алертинг
Real-time Grafana дашборд:
- Live waveform: последние 10 секунд вибросигнала
- FFT спектр: обновляется каждые 5 минут
- Trending: RMS и kurtosis за 30 дней
- ISO зона: цветовая индикация A/B/C/D
- Temperature heatmap: все точки измерения на схеме оборудования
Alert Matrix:
alert_matrix = {
('D', 'CRITICAL'): 'immediate_shutdown', # ISO зона D + критическая температура
('D', 'WARNING'): 'urgent_inspection',
('C', 'CRITICAL'): 'urgent_inspection',
('C', 'WARNING'): 'schedule_next_shift',
('B', 'CAUTION'): 'monitor_closely',
('A', 'NORMAL'): 'routine'
}
Сроки: датчики + OPC-UA/Modbus + базовый vibration RMS + ISO классификация + temperature alerts + Grafana — 3-4 недели. Спектральная диагностика, envelope analysis, тренд-анализ температуры, multi-sensor fusion, mobile alerts — 2-3 месяца.







