Реалізація предиктивного обслуговування обладнання (Predictive Maintenance)

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Реалізація предиктивного обслуговування обладнання (Predictive Maintenance)
Складний
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Реалізація передиктивного обслуговування обладнання (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:

  1. Система публікує Health Index на Grafana дашборді
  2. При critical state → повідомлення у Slack + CMMS Work Order
  3. Інженер верифікує + призначає термін ТО
  4. Після ТО: зворотний зв'язок у модель (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 місяців.