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 段,逐段算均值、标准差、超限时长占比。
诊断流程与判读逻辑
核心思路是“先分段统计、再定位超限段、最后关联工况”。下图给出从历史趋势到结论的判读链路,其中工况标签(负荷段、切泵、下游阀切换)来自同一时段的操作记录与相关测点趋势,用于解释偏差段的成因。
用历史趋势算出偏差统计量
下面给出一段可直接运行的 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.6 | 60%~90% | 系统性偏置,PV 滞后 SP | 负荷上调,SP 阶跃 +8 |
| 01:50–02:20 | ≈ 0 | 1.8~2.4 | 30%~50% | 波动放大,正负交替 | 切泵,脉动+阀门死区 |
| 02:20–04:00 | ≈ 0 | ≈ 0.5 | < 5% | 恢复正常 | 工况稳定 |
判读要点:均值超限优先怀疑“设定值变化未被及时跟随”或“测量零点漂移”;方差超限优先怀疑“工艺扰动、阀门死区、控制器增益过大”。两者同时超限时,先看工况记录再下结论,避免把工艺扰动误判为控制器整定问题。
历史库的归档周期与压缩方式会改变 σ 和超限占比的数值(压缩会削平尖峰、拉长表观持续时间)。做跨时段对比时,必须确认各段数据来自同一归档配置,否则统计量不可直接比较。
现场执行清单
- 确认回路量程与工程单位,偏差阈值按量程百分比设定(本例 1% 量程 = 2.0 t/h)。
- 导出 PV、SP、OP 三支趋势,时间跨度覆盖至少一个完整负荷周期。
- 按 10 min 分段计算 μ、σ、超限占比,标记偏置段与波动段。
- 提取持续 ≥ 60 s 的超限事件,记录起止时间与平均偏差。
- 用操作记录、相关测点趋势为每个异常段打工况标签,形成“时段—统计量—工况—结论”的对应关系。