3. PV与SP长期跟踪偏差的趋势诊断

为什么流量回路的跟踪偏差要按“分布”看

流量控制回路(FIC)的 PV 与 SP 在稳态下不会完全重合:测量噪声、阀门死区、控制器积分作用都会让偏差 e = PV − SP 在零附近小幅抖动。真正需要诊断的是偏差的统计结构——均值是否系统性偏离零、方差是否异常放大、偏差落在某个区间内的持续时间是否过长。单看某一时刻的曲线形态容易误判,而把历史趋势切成时段、逐段计算均值/方差/超限持续时长,就能把“偶发波动”和“持续跟踪不良”区分开。

本例选取一个典型流量回路 FIC-1203(量程 0–200 t/h,采样周期 1 s,历史库按 5 s 归档),用 4 小时历史趋势做诊断。判定口径先约定清楚:

  • 偏差 e = PV − SP,单位 t/h,正号表示 PV 高于 SP。
  • 跟踪偏差超限阈值:|e| > 2.0 t/h(约为量程的 1%,可按工艺容忍度调整)。
  • 持续超限:连续 ≥ 60 s 满足 |e| > 2.0 t/h,记为一次“超限事件”。
  • 统计窗口:10 min 一段,共 24 段,逐段算均值、标准差、超限时长占比。

诊断流程与判读逻辑

核心思路是“先分段统计、再定位超限段、最后关联工况”。下图给出从历史趋势到结论的判读链路,其中工况标签(负荷段、切泵、下游阀切换)来自同一时段的操作记录与相关测点趋势,用于解释偏差段的成因。

DCS 历史库 FIC-1203 PV / SP / OP 4 h,归档 5 s 预处理 对齐时间戳 计算 e = PV − SP 10 min 分段统计 均值 μ / 标准差 σ 超限时长占比 判据 |μ| > 1.0 t/h 或 σ > 1.5 t/h 24 个 10 min 窗口的偏差统计(示例数据) 00:00 01:00 02:00 03:00 04:00 |μ| 阈值 正常窗口 均值超限(系统性偏置) 方差超限(波动放大) 工况关联(同一时段操作记录与相关测点) 01:10–01:40 下游用汽负荷上调,SP 阶跃 +8 t/h,PV 跟随滞后 → 均值超限段 01:50–02:20 切泵操作,流量脉动叠加阀门死区 → 方差超限段 02:20 后 工况稳定,偏差回落至 ±1 t/h 内 → 恢复正常窗口 诊断结论 偏置段:负荷变化跟随滞后 波动段:切泵扰动+死区 非控制器整定问题

用历史趋势算出偏差统计量

下面给出一段可直接运行的 Python 示例,用教学示例数据模拟 4 小时、5 s 归档的 PV/SP 序列(含负荷阶跃段与切泵扰动段),完成分段统计、超限事件提取与工况标签关联。示例数据由固定随机种子生成,结果可复现,属于教学示例而非现场实测。

import numpy as np
import pandas as pd

rng = np.random.default_rng(20240603)

# 1) 构造 4 h、5 s 归档的教学示例数据
fs = 1 / 5.0                      # 5 s 归档
n = int(4 * 3600 * fs)            # 2880 点
t = pd.date_range("2024-06-03 00:00:00", periods=n, freq="5s")

sp = np.full(n, 120.0)            # 基准 SP 120 t/h
pv = np.full(n, 120.0)

# 01:10-01:40 负荷上调:SP 阶跃 +8,PV 一阶滞后跟随(时间常数 90 s)
i1, i2 = int(70*60*fs), int(100*60*fs)
sp[i1:i2] += 8.0
pv[i1:i2] = 120.0 + 8.0 * (1 - np.exp(-np.arange(i2-i1) * 5 / 90.0))

# 01:50-02:20 切泵扰动:叠加 0.02 Hz 脉动 + 阀门死区造成的方波偏置
i3, i4 = int(110*60*fs), int(140*60*fs)
tt = np.arange(i4 - i3) * 5
pv[i3:i4] += 1.2 * np.sin(2*np.pi*0.02*tt) + 0.8 * np.sign(np.sin(2*np.pi*0.008*tt))

# 全程测量噪声
pv += rng.normal(0, 0.35, n)
sp += rng.normal(0, 0.05, n)

df = pd.DataFrame({"PV": pv, "SP": sp}, index=t)
df["e"] = df["PV"] - df["SP"]

# 2) 10 min 分段统计
TH = 2.0                          # 超限阈值 t/h
win = df.resample("10min")
stat = pd.DataFrame({
    "mu":    win["e"].mean(),
    "sigma": win["e"].std(),
    "over_ratio": win["e"].apply(lambda s: (s.abs() > TH).mean()),
})
stat["flag"] = np.where(stat["mu"].abs() > 1.0, "偏置",
                np.where(stat["sigma"] > 1.5, "波动", "正常"))

# 3) 提取持续超限事件(连续 >= 60 s)
mask = df["e"].abs() > TH
grp = (mask != mask.shift()).cumsum()
events = []
for _, seg in df[mask].groupby(grp[mask]):
    dur = (seg.index[-1] - seg.index[0]).total_seconds() + 5
    if dur >= 60:
        events.append({"start": seg.index[0], "end": seg.index[-1],
                       "dur_s": dur, "mean_e": seg["e"].mean()})

print(stat.round(2).to_string())
print(pd.DataFrame(events).to_string(index=False))

运行后重点看三列:mu 明显偏离 0 的窗口对应系统性偏置,sigma 抬升的窗口对应波动放大,over_ratio 高但 mu 接近 0 的窗口说明偏差在正负之间来回跳(多为振荡或死区)。示例数据下,01:10–01:40 段 mu 约为 +3~+5 t/h(PV 滞后于 SP 阶跃),01:50–02:20 段 sigma 明显高于基线,与图中橙色、红色窗口一致。

结果判读与关联工况

时段μ (t/h)σ (t/h)超限占比判读关联工况
00:00–01:00≈ 0≈ 0.4< 5%正常基线稳定负荷
01:10–01:40+3~+5≈ 0.660%~90%系统性偏置,PV 滞后 SP负荷上调,SP 阶跃 +8
01:50–02:20≈ 01.8~2.430%~50%波动放大,正负交替切泵,脉动+阀门死区
02:20–04:00≈ 0≈ 0.5< 5%恢复正常工况稳定
判读要点:均值超限优先怀疑“设定值变化未被及时跟随”或“测量零点漂移”;方差超限优先怀疑“工艺扰动、阀门死区、控制器增益过大”。两者同时超限时,先看工况记录再下结论,避免把工艺扰动误判为控制器整定问题。
历史库的归档周期与压缩方式会改变 σ 和超限占比的数值(压缩会削平尖峰、拉长表观持续时间)。做跨时段对比时,必须确认各段数据来自同一归档配置,否则统计量不可直接比较。

现场执行清单

  • 确认回路量程与工程单位,偏差阈值按量程百分比设定(本例 1% 量程 = 2.0 t/h)。
  • 导出 PV、SP、OP 三支趋势,时间跨度覆盖至少一个完整负荷周期。
  • 按 10 min 分段计算 μ、σ、超限占比,标记偏置段与波动段。
  • 提取持续 ≥ 60 s 的超限事件,记录起止时间与平均偏差。
  • 用操作记录、相关测点趋势为每个异常段打工况标签,形成“时段—统计量—工况—结论”的对应关系。