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

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Реализация предиктивного обслуживания оборудования (Predictive Maintenance)
Сложная
~2-4 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

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