1. 冷箱整体换热温差基线建立与偏差识别

为什么先建基线,而不是直接看温差

冷箱内部是多股流换热,整体温差(热端温差、冷端温差、各段端差)本身随负荷、环境温度、原料气组成和制冷剂配比连续变化。单看某一时刻的温差数值,无法判断"正常"还是"异常"。因此第一步必须用设计参数 + 历史稳定工况数据建立各换热段的温差基线,再把当前运行温差与基线比较,用偏差量而非绝对值来识别异常时段。

本例采用"设计值锚定 + 历史数据修正"的双层基线:设计值给出物理上限与期望值,历史数据给出实际运行中的正常波动带(均值 ± k·标准差)。偏差识别用标准化残差 z 值判定,避免不同换热段因量纲和波动幅度不同而误判。

基线建立与偏差识别的数据链路

设计参数 各段设计端差 / 设计温差 历史稳定工况 负荷 70%~100% 正常段 当前运行数据 各段进出口温度 / 流量 基线构建 μ = 历史均值 σ = 历史标准差 带 = μ ± 2σ(正常波动带) 设计值作物理校核 偏差计算 ΔT = T_当前 − μ z = ΔT / σ 按段分别计算 偏差判定 |z| ≤ 2 → 正常 2 < |z| ≤ 3 → 关注 |z| > 3 → 异常 连续 3 点超限才报警 异常时段 起止时间 偏离段号 z 值大小 供后续定位 关键约束:历史数据须剔除开停车、大幅调负荷、原料气切换等非稳态段,否则 σ 被放大,异常被掩盖 各段独立建基线:热端端差、冷端端差、各流道进出口温差分别统计,不可合并

用示例数据走一遍基线建立

下表为某冷箱三个换热段的历史稳定工况统计结果(示例数据,用于演示方法,非实测)。每段独立计算均值 μ 与标准差 σ,形成正常波动带。

换热段设计端差 (℃)历史均值 μ (℃)标准差 σ (℃)正常带 μ±2σ (℃)
热端段3.03.40.252.90 ~ 3.90
中段2.52.80.302.20 ~ 3.40
冷端段2.02.30.201.90 ~ 2.70

注意历史均值略高于设计端差,这是正常现象——设计值为理想工况,实际运行存在污垢、分配不均等固有偏差。基线应以历史均值为中心,设计值仅作物理合理性校核(若 μ 偏离设计值超过 30%,需先排查仪表或工况选取问题)。

偏差识别实现

下面代码读取当前运行各段温差,按段计算 z 值,并标记连续超限的异常时段。数据以列表形式内嵌,可直接运行验证。

import statistics

# 各段基线(来自历史统计)
baseline = {
    "热端段": {"mu": 3.4, "sigma": 0.25},
    "中段":   {"mu": 2.8, "sigma": 0.30},
    "冷端段": {"mu": 2.3, "sigma": 0.20},
}

# 当前运行各段温差序列(示例数据,按小时采样)
current = {
    "热端段": [3.5, 3.6, 3.4, 3.7, 4.2, 4.6, 4.8, 4.5, 4.1, 3.8],
    "中段":   [2.9, 2.8, 2.7, 2.9, 3.0, 3.1, 3.0, 2.9, 2.8, 2.9],
    "冷端段": [2.2, 2.3, 2.4, 2.3, 2.5, 2.6, 2.7, 2.6, 2.4, 2.3],
}

Z_WARN, Z_ALARM, CONSEC = 2.0, 3.0, 3

def detect(seg, series):
    mu, sigma = baseline[seg]["mu"], baseline[seg]["sigma"]
    flags = []
    for i, t in enumerate(series):
        z = (t - mu) / sigma
        if abs(z) > Z_ALARM:
            flags.append("异常")
        elif abs(z) > Z_WARN:
            flags.append("关注")
        else:
            flags.append("正常")
    # 连续超限判定
    abnormal_runs = []
    run_start = None
    for i, f in enumerate(flags):
        if f == "异常":
            if run_start is None:
                run_start = i
        else:
            if run_start is not None and i - run_start >= CONSEC:
                abnormal_runs.append((run_start, i - 1))
            run_start = None
    if run_start is not None and len(flags) - run_start >= CONSEC:
        abnormal_runs.append((run_start, len(flags) - 1))
    return flags, abnormal_runs

for seg in baseline:
    flags, runs = detect(seg, current[seg])
    print(f"{seg}: {flags}")
    if runs:
        for s, e in runs:
            print(f"  异常时段: 第{s}~{e}点")
    else:
        print("  无连续异常时段")

运行结果(示例数据直接推出):热端段在第 4~7 点 z 值超过 3,连续 4 点超限,判定为异常时段;中段与冷端段全部落在正常带内。这与表中数据一致——热端段当前温差升至 4.8℃,对应 z = (4.8−3.4)/0.25 = 5.6,远超阈值。

基线不是一次建好就永久使用。冷箱运行数月后,若换热器逐渐结垢,正常温差会缓慢漂移。建议每季度用最近一个月的稳定工况数据滚动更新 μ 与 σ,同时保留设计值作为漂移上限的校核依据。
若历史数据中混入了非稳态段(如开停车、大幅调负荷),σ 会被显著放大,导致正常带过宽、异常被掩盖。建基线前必须先按负荷、环境温度、原料气组成筛选稳定工况,并剔除温度变化率超过阈值的时段。

结果判读与后续衔接

本例输出的是"哪些时段整体温差偏离基线",属于时间维度的异常识别。若热端段被标记异常,下一步应采集该时段各股流进出口温度,计算各通道温差并与设计值对比,定位异常集中在哪个具体流道——这正是后续案例要处理的问题。本例只负责把异常时段圈出来,不展开流道级定位。