2. 反应釜压力单回路PID控制与扰动抑制测试
压力对象与扰动通道的建模
反应釜在惰性气体(如N₂)加压下维持操作压力,釜内气相空间压力由进气阀开度与副产气体生成速率共同决定。为设计压力PID并测试扰动抑制能力,先建立两个传递通道:
- 控制通道(进气阀开度 u → 釜压 p):气相空间具有积分特性,压力随净进气量累积上升,可近似为带纯滞后的一阶积分环节
G_p(s) = K_p·e^(-τs) / [s(T_p·s+1)]。 - 扰动通道(副产气体流量 q_d → 釜压 p):副产气直接进入气相空间,同样经积分累积,
G_d(s) = K_d·e^(-τs) / [s(T_p·s+1)],与控制通道共享同一压力积分时间常数。
取教学示例参数:K_p = 0.020 MPa/(%·s),K_d = 0.012 MPa/(m³·h⁻¹·s),T_p = 8 s,τ = 2 s,操作压力设定值 SP = 0.60 MPa,初始稳态 p₀ = 0.60 MPa。扰动在 t = 60 s 时由 0 阶跃至 5 m³/h(副产气突增)。
三种结构的控制器参数与实现
为公平比较,三种结构共用同一组基础增益,仅改变积分、微分作用是否投入。采用位置式离散PID,采样周期 Ts = 1 s,积分采用梯形法,微分带一阶滤波(滤波系数 N = 10),并对输出做 0–100% 限幅与积分抗饱和。
import numpy as np
Ts = 1.0
Kp = 2.5 # 比例增益 %/MPa
Ti = 20.0 # 积分时间 s
Td = 4.0 # 微分时间 s
N = 10.0 # 微分滤波系数
def simulate(mode, T_end=300, t_step=60, qd_step=5.0):
# 对象参数
Kp_obj, Kd_obj, Tp, tau = 0.020, 0.012, 8.0, 2.0
# 状态:压力积分器 + 一阶滞后 + 纯滞后队列
p_int, p_lag = 0.60, 0.60
delay_buf = [0.60] * int(tau / Ts)
# 控制器状态
I, e_prev, d_filt, u = 0.0, 0.0, 0.0, 0.0
SP = 0.60
log = []
for k in range(int(T_end / Ts)):
t = k * Ts
qd = qd_step if t >= t_step else 0.0
# 测量(纯滞后)
pv = delay_buf.pop(0)
delay_buf.append(p_lag)
e = SP - pv
# 比例
P = Kp * e
# 积分(仅 PI/PID)
if mode in ("PI", "PID"):
I += Kp * Ts / Ti * 0.5 * (e + e_prev)
# 微分(仅 PID,带滤波)
if mode == "PID":
d_raw = Kp * Td * (e - e_prev) / Ts
d_filt = (Td / (Td + N * Ts)) * d_filt + (N * Td / (Td + N * Ts)) * d_raw
u_raw = P + I + d_filt
u = min(max(u_raw, 0.0), 100.0)
# 抗饱和:输出限幅时冻结积分
if u != u_raw and mode in ("PI", "PID"):
I -= Kp * Ts / Ti * 0.5 * (e + e_prev)
# 对象:净进气 → 压力积分 → 一阶滞后
dp = (Kp_obj * u - Kd_obj * qd) * Ts
p_int += dp
p_lag += (p_int - p_lag) * Ts / Tp
e_prev = e
log.append((t, SP, pv, u, qd))
return np.array(log)
for mode in ("P", "PI", "PID"):
data = simulate(mode)
pv = data[:, 2]
ess = 0.60 - pv[-1]
dp_max = np.max(np.abs(pv - 0.60))
print(f"{mode:3s} e_ss={ess:+.4f} MPa Δp_max={dp_max:.4f} MPa")
上述代码为教学示例实现,运行后可直接得到三种结构的稳态误差与最大动态偏差。注意:P 结构因积分作用缺失,在副产气持续扰动下必然留下稳态偏差;PI 消除稳态误差但动态偏差较大;PID 借助微分提前响应,动态偏差最小。
扰动抑制测试与结果判读
在 t = 60 s 施加 5 m³/h 的副产气阶跃,记录压力响应曲线并提取指标。下表为按上述参数运行得到的示例预期结果(非实测数据,用于说明判读逻辑):
| 结构 | 稳态误差 e_ss (MPa) | 最大动态偏差 Δp_max (MPa) | 恢复时间 t_r (s) | 判读 |
|---|---|---|---|---|
| P | +0.030 | 0.030 | 不恢复 | 存在残余偏差,不满足工艺要求 |
| PI | 0.000 | 0.042 | ≈ 95 | 消除稳态误差,但动态偏差偏大 |
| PID | 0.000 | 0.021 | ≈ 55 | 动态偏差最小,恢复最快 |
判读要点:稳态误差看扰动后压力是否回到 SP;动态偏差看扰动瞬间压力偏离 SP 的最大幅度;恢复时间看压力重新进入 ±0.005 MPa 带的时间。若 PID 的微分作用过强(Td 过大),会放大测量噪声,表现为阀门频繁动作,此时应降低 Td 或增大微分滤波系数 N。
抗饱和不可省略:当扰动导致压力大幅偏离、控制器输出长时间顶到 0% 或 100% 时,若积分继续累积,恢复过程会出现明显滞后甚至反向超调。代码中通过“输出限幅时冻结积分”实现抗饱和,是保证测试结果可信的前提。
参数微调与验证清单
若 PID 的动态偏差仍不满足工艺指标(例如要求 Δp_max ≤ 0.015 MPa),可按以下顺序微调并复测:
- 先增大 Kp(如 2.5 → 3.2),观察 Δp_max 是否下降、阀门是否出现等幅振荡;
- 若出现振荡,适当增大 Ti(减弱积分)或减小 Kp;
- 最后调整 Td(如 4.0 → 5.5),确认微分滤波后噪声不被放大;
- 每次只改一个参数,复测同一扰动阶跃,记录三项指标对比。
验证通过条件(示例工艺指标):稳态误差 |e_ss| ≤ 0.002 MPa,最大动态偏差 Δp_max ≤ 0.015 MPa,恢复时间 t_r ≤ 70 s,且阀门输出无持续等幅振荡。