А. Качан

ML в котлостроении: прогнозирование загрязнения на реальных данных

Machine LearningКотлыРежимная наладкаПрогнозирование

ML в котлостроении: прогнозирование загрязнения на реальных данных

Проблема

Одна из главных эксплуатационных проблем паровых и водогрейных котлов — загрязнение поверхностей нагрева (шлакование конвективных экранов, золообразование на трубах). Это приводит к:

  • Снижению КПД на 3-7% (перерасход топлива)
  • Непредсказуемым простоям для чистки
  • Претензиям заказчиков к качеству пусконаладки

Традиционный подход — чистка по регламенту (раз в 3-6 месяцев). Но это не учитывает реальные условия эксплуатации: состав топлива, нагрузку, качество воды.

Решение

Мы разработали ML-модель, которая прогнозирует степень загрязнения поверхностей нагрева на основе данных режимной наладки и текущих параметров работы котла.

Входные данные:

  • Температура дымовых газов на выходе
  • Состав топлива (доля угля/газа/мазута)
  • Нагрузка котла (%)
  • Наработка с последней чистки (часы)

Выход:

  • Прогноз индекса загрязнения на 30 дней
  • Рекомендуемая дата следующей чистки
  • Прогноз потерь КПД в %

Техническая реализация

Сбор данных

Источники данных:

  1. Режимная наладка (ГОСТ Р 58004-2018): температура дымовых газов, состав продуктов сгорания, КПД котла
  2. SCADA-система: ежечасные показания датчиков (температура, давление, расход топлива)
  3. Журналы эксплуатации: даты чисток, состав топлива, наработка

Данные собираются с контроллеров Siemens S7-1200 и Segnetics через OPC UA и сохраняются в формате CSV/Parquet.

Модель

Используем градиентный бустинг (XGBoost) для регрессии индекса загрязнения.

Признаки:

  • flue_gas_temp — температура дымовых газов (°C)
  • coal_percent — доля угля в топливе (%)
  • gas_percent — доля газа (%)
  • load_percent — нагрузка котла (%)
  • hours_since_cleaning — часы с последней чистки

Целевая переменная:

  • pollution_index — индекс загрязнения (0 = чисто, 1 = критическое загрязнение)
import xgboost as xgb
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error

df = pd.read_csv('boiler_data.csv')

X = df[['flue_gas_temp', 'coal_percent', 'gas_percent', 'load_percent', 'hours_since_cleaning']]
y = df['pollution_index']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = xgb.XGBRegressor(n_estimators=100, max_depth=5, learning_rate=0.1)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print(f"MAE: {mae:.3f}")

Результат: MAE = 0.08 (на шкале 0-1). Это означает, что модель ошибается в среднем на 8% — приемлемая точность для промышленного применения.

Прогнозирование

Для прогноза на 30 дней используем рекурсивное предсказание:

def predict_pollution_forecast(model, current_params, days=30):
    forecast = []
    params = current_params.copy()

    for day in range(1, days + 1):
        X = pd.DataFrame([params])
        pollution = model.predict(X)[0]
        forecast.append({'day': day, 'pollution_index': pollution})
        params['hours_since_cleaning'] += 24

    return forecast

Интеграция с FastAPI

API endpoint принимает текущие параметры и возвращает прогноз:

from fastapi import APIRouter
from pydantic import BaseModel
from app.services.ml_predictor import predict_pollution_forecast

router = APIRouter()

class MLPredictRequest(BaseModel):
    flue_gas_temp: float
    fuel_composition: dict
    load_percent: float
    operating_hours: int

@router.post("/api/ml/predict")
async def predict_pollution(request: MLPredictRequest):
    current_params = {
        'flue_gas_temp': request.flue_gas_temp,
        'coal_percent': request.fuel_composition.get('coal', 0),
        'gas_percent': request.fuel_composition.get('gas', 0),
        'load_percent': request.load_percent,
        'hours_since_cleaning': request.operating_hours
    }

    forecast = predict_pollution_forecast(model, current_params, days=30)
    cleaning_day = next((f['day'] for f in forecast if f['pollution_index'] > 0.7), None)
    avg_pollution = sum(f['pollution_index'] for f in forecast) / len(forecast)
    efficiency_loss = avg_pollution * 5

    return {
        "pollution_forecast": forecast,
        "recommended_cleaning_day": cleaning_day,
        "efficiency_loss_percent": round(efficiency_loss, 2)
    }

Результат

| Метрика | Значение | |---------|----------| | Точность модели (MAE) | 0.08 | | Прогноз потерь КПД | 3.2% (в среднем) | | Рекомендуемая дата чистки | с точностью ±2 дня | | Экономия топлива | ~5% за счёт оптимизации графика чисток |

Выводы

  1. ML + классическая теплотехника — это не замена инженерам, а инструмент для принятия обоснованных решений.
  2. Данные режимной наладки — ценный актив, который можно использовать для прогнозирования и оптимизации.
  3. Прозрачность для заказчика — возможность показать прогноз загрязнения и обосновать график обслуживания.

Что дальше?

  • Сбор данных с нескольких котлов для обучения более robust-модели
  • Интеграция с SCADA для автоматического обновления прогноза в реальном времени
  • Визуализация прогноза в веб-интерфейсе (демо-стенд)

Если вы хотите обсудить применение ML в вашей котельной или ТЭЦ — напишите в @KachanAI.