恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
python的工业过程控制场景模拟第三十五篇:实现比值控制算法仿真,给定主流量,自动计算从流量设定值,实时跟踪调节输出。
首页
资讯中心
/
python的工业过程控制场景模拟第三十五篇:实现比值控制算法仿真,给定主流量,自动计算从流量设定值,实时跟踪调节输出。
python的工业过程控制场景模拟第三十五篇:实现比值控制算法仿真,给定主流量,自动计算从流量设定值,实时跟踪调节输出。
发布时间:2026/8/2 13:15:59
比值控制算法仿真系统 —— 基于 OOP 的流量配比实战两种物料要按比例混合主流量一变从流量必须跟着变——而且得快。比值控制不是简单的乘法是让从回路始终盯着主回路的设定比例跑。—— 哈尔滨工程大学《工业过程控制》课程核心思想一、实际应用场景描述在化工、石油炼制、制药等连续生产过程中多种物料按比例混合是最基础的工艺要求之一。典型场景┌──────────────────────────────────┐│ 主流量 FT-101 ││ (燃料气 / 原料A) ││ 测量值 → 比值器 K │└──────────────┬───────────────────┘│ ×K▼┌──────────────────────────────────┐│ 从流量 SP-102 ││ (空气 / 原料B) ││ K × F_主 │└──────────────┬───────────────────┘│┌──────────────▼───────────────────┐│ 从流量 PID-102 ││ 跟踪 SP-102 调节 FV-102 │└──────────────┬───────────────────┘│┌──────────────▼───────────────────┐│ 调节阀 FV-102 ││ (从流量执行机构) │└──────────────────────────────────┘典型工艺案例工艺 主流体 从流体 比值锅炉燃烧 燃料气 助燃空气 ~10:1理论空燃比催化裂化 原料油 催化剂 按催化剂活性动态调整酸碱中和 酸性废水 碱液 按pH前馈比值修正蒸汽混合 高压蒸汽 低压蒸汽 按压力/温度需求哈尔滨工程大学《工业过程控制》课程彭秀艳教授主讲国家级一流本科课程在第八章比值控制系统中系统讲解了比值控制的设计原理。课程明确指出比值控制的核心是保证两种或多种物料的流量始终保持严格的比例关系。当主流量的负荷发生变化时从流量必须随之按比例变化。比值器本质上是一个乘法环节将从回路的设定值挂在主流量上。二、引入痛点2.1 现场的真实困境场景 现场发生了什么 根因燃烧不充分 燃料气压力一波动烟囱就冒黑烟 空气量没跟上燃料变化过量排放 碱液加太多出水pH超标被罚款 比值固定不变没考虑浓度波动手动调节 操作工盯着两块表手动调阀门 没有比值控制回路整定困难 从回路PID怎么调都跟不上主回路变化 比值系数和PID参数不匹配仿真教学 想给学生看比值控制比单回路好多少 没有现成的比值仿真工具2.2 核心矛盾单回路PID只能维持从流量恒定但工艺要求的是从流量跟随主流量变化。如果主流量的负荷从1000Nm³/h跳到1500Nm³/h从流量必须立即从10000Nm³/h跳到15000Nm³/h——这不是一个PID能追得上的除非它的设定值在实时变化。2.3 我们要解决什么用一段Python程序纯数学仿真一个比值控制系统实现1. 比值设定 —— 支持任意 K F从/F主2. 主从联动 —— 主流量变化时从流量设定值自动重算3. 从回路PID —— 跟踪动态变化的设定值4. 三种测试模式 —— 稳态验证 / 主流量阶跃 / 主流量斜坡5. 性能指标 —— 跟踪误差、超调、调节时间6. 面向对象设计 —— 分层清晰可扩展三、核心逻辑讲解3.1 理论依据比值控制结构本工具基于哈工程《工业过程控制》第八章比值控制系统① 单闭环比值控制本项目采用比值系数 KF_master ────→ [×K] ────→ SP_slave ────→ PID ────→ 调节阀 ────→ F_slave▲ │└──────────────── PV反馈 ─────────────────┘特点: 只有从回路闭合主回路开环主流量只测不控适用: 主流量的变化由上游决定无法控制② 比值系数计算K \frac{F_{slave}}{F_{master}} \quad \text{(体积比/质量比)}SP_{slave}(t) K \times F_{master}(t)③ 从回路PIDMV(k) K_p \cdot e(k) K_i \sum e(i)\Delta t K_d \cdot \frac{-\Delta PV}{\Delta t}3.2 过程模型# 主流量: 模拟为带随机扰动的信号源F_master(t) F_base ΔF(t)# 从流量通道: 一阶惯性 纯滞后G_slave(s) K_s / (τ_s·s 1) · e^(-θ_s·s)参数 物理含义 取值K_ratio 比值系数 10.0空气/燃料Ks 从阀增益 1.0τs 从回路时间常数 5sθs 从回路纯滞后 1s3.3 仿真流程图┌──────────────────────────────┐│ 仿真主循环 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ① 生成主流量 F_master(t) ││ (稳态/阶跃/斜坡) │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ② 计算比值设定值 ││ SP_slave K × F_master │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ③ 从回路PID计算 ││ MV PID(SP_slave, PV) │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ④ 从过程模型 ││ MV → F_slave (一阶滞后) │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ⑤ 记录 统计 ││ 跟踪误差/ISE/超调/调节时间 │└──────────────────────────────┘四、代码讲解面向对象设计4.1 类结构总览类名 职责 设计模式RatioConfig 比值系统配置值对象 值对象SlaveProcessParams 从回路过程参数值对象 值对象PIDParams PID参数值对象 值对象MasterFlowSource 主流信号发生器 策略模式SlaveProcessModel 从回路过程模型 封装PIDController 位置式PID含抗积分饱和 封装RatioController 比值器核心算法 模板方法RatioSimulator 仿真引擎 编排器DataRecorder CSV导出 封装Plotter 曲线绘制 封装4.2 配置层from dataclasses import dataclassfrom enum import Enum, autoclass FlowPattern(Enum):主流变化模式STEADY steady # 恒定STEP step # 阶跃RAMP ramp # 斜坡SINE sine # 正弦扰动dataclass(frozenTrue)class RatioConfig:比值系统配置 —— 值对象ratio_k: float 10.0 # 比值系数 K F从/F主master_nominal: float 100.0 # 主流基准值 (单位)slave_nominal: float 1000.0 # 从流基准值 (单位)dt: float 0.5 # 仿真步长(s)sim_duration: float 300.0 # 仿真时长(s)dataclass(frozenTrue)class SlaveProcessParams:从回路过程参数K: float 1.0 # 增益tau: float 5.0 # 时间常数(s)theta: float 1.0 # 纯滞后(s)noise_level: float 0.02 # 测量噪声(±2%)dataclass(frozenTrue)class PIDParams:PID参数Kp: float 2.0Ti: float 3.0Td: float 0.5dt: float 0.5mv_min: float 0.0mv_max: float 100.0anti_windup: bool True4.3 主流信号发生器import numpy as npclass MasterFlowSource:主流信号发生器 —— 策略模式模拟主流量的各种变化模式:- 稳态: 恒定值- 阶跃: 某时刻突变- 斜坡: 线性变化- 正弦: 周期性波动def __init__(self, config: RatioConfig,pattern: FlowPattern FlowPattern.STEP,change_time: float 60.0,change_magnitude: float 30.0):self.cfg configself.pattern patternself.change_time change_timeself.change_mag change_magnitudedef get_flow(self, t: float) - float:获取当前时刻的主流值Args:t: 当前时间(s)Returns:主流值base self.cfg.master_nominalif self.pattern FlowPattern.STEADY:return baseelif self.pattern FlowPattern.STEP:if t self.change_time:return base self.change_magreturn baseelif self.pattern FlowPattern.RAMP:if t self.change_time:ramp_rate self.change_mag / 30.0 # 30s内完成elapsed min(t - self.change_time, 30.0)return base ramp_rate * elapsedreturn baseelif self.pattern FlowPattern.SINE:# ±10% 正弦扰动, 周期60samplitude 0.1 * basereturn base amplitude * np.sin(2 * np.pi * t / 60.0)return base亮点- 策略模式不同变化模式通过同一接口get_flow(t) 获取- 易于扩展新的模式如随机游走、方波等4.4 从回路过程模型class SlaveProcessModel:从回路过程模型 —— 一阶惯性 纯滞后离散方法: 一阶惯性法 (无条件稳定)def __init__(self, params: SlaveProcessParams, dt: float 0.5):self.p paramsself.dt dtself._output 0.0self._buf []self._buf_len max(1, int(round(params.theta / dt)))self._buf [0.0] * (self._buf_len 1)def step(self, mv: float) - float:执行一个仿真步Args:mv: 控制器输出 (%)Returns:从流量 PV (带噪声)alpha self.dt / (self.p.tau self.dt)target self.p.K * mvself._output alpha * (target - self._output)# 纯滞后self._buf.append(self._output)delayed self._buf.pop(0)# 加测量噪声noise np.random.normal(0, self.p.noise_level * delayed)pv delayed noisereturn max(0.0, pv)def reset(self):self._output 0.0self._buf [0.0] * (self._buf_len 1)4.5 PID控制器class PIDController:位置式PID (含抗积分饱和)对PV微分避免SP阶跃冲击def __init__(self, params: PIDParams):self.p paramsself.reset()def reset(self):self._integral 0.0self._prev_pv 0.0self._first Truedef compute(self, setpoint: float, process_value: float) - float:dt self.p.dterror setpoint - process_value# PP self.p.Kp * error# Iif self.p.Ti 0:self._integral error * dtI (self.p.Kp / self.p.Ti) * self._integralelse:I 0.0# D (对PV微分)if self.p.Td 0 and not self._first:D -self.p.Kp * self.p.Td * (process_value - self._prev_pv) / dtelse:D 0.0mv P I D# 抗积分饱和mv_clipped np.clip(mv, self.p.mv_min, self.p.mv_max)if self.p.anti_windup and self.p.Ti 0:if abs(mv - mv_clipped) 1e-9:allowed_I (mv_clipped - P - D) / (self.p.Kp / self.p.Ti)self._integral allowed_Iself._prev_pv process_valueself._first Falsereturn mv_clipped4.6 比值控制器核心class RatioController:比值控制器 —— 核心算法功能:1. 接收主流测量值2. 乘以比值系数 K 得到从流量设定值3. 驱动从回路PID跟踪该设定值课程 §8.2: 单闭环比值控制def __init__(self, ratio_cfg: RatioConfig,slave_params: SlaveProcessParams,pid_params: PIDParams):self.ratio_cfg ratio_cfgself.slave_process SlaveProcessModel(slave_params, pid_params.dt)self.pid PIDController(pid_params)self.current_sp_slave ratio_cfg.slave_nominaldef step(self, f_master: float) - dict:执行一个控制周期Args:f_master: 主流测量值Returns:包含本步所有数据的字典# ① 比值计算: 从设定 K × 主流self.current_sp_slave self.ratio_cfg.ratio_k * f_master# ② 从回路PID计算f_slave_pv self.slave_process._output # 当前PV (无噪声)mv self.pid.compute(self.current_sp_slave, f_slave_pv)# ③ 从过程执行f_slave_actual self.slave_process.step(mv)# ④ 计算跟踪误差tracking_error self.current_sp_slave - f_slave_actualreturn {f_master: f_master,sp_slave: self.current_sp_slave,pv_slave: f_slave_actual,mv: mv,error: tracking_error,ratio_actual: f_slave_actual / f_master if f_master 0 else 0.0}def reset(self):self.slave_process.reset()self.pid.reset()self.current_sp_slave self.ratio_cfg.slave_nominal亮点- 比值器核心sp_slave K × f_master 一行代码体现比值控制的灵魂- 实际比值监控ratio_actual 实时反映当前实际比例可评估跟踪精度4.7 仿真引擎class RatioSimulator:比值控制仿真引擎 —— 编排器def __init__(self, ratio_controller: RatioController,master_source: MasterFlowSource):self.rc ratio_controllerself.master_src master_sourceself.history []def run(self) - dict:执行完整仿真self.rc.reset()self.history.clear()dt self.rc.ratio_cfg.dtn_steps int(self.rc.ratio_cfg.sim_duration / dt)for k in range(n_steps 1):t k * dt# 获取主流f_master self.master_src.get_flow(t)# 比值控制result self.rc.step(f_master)result[time] tself.history.append(result)return self._compute_stats()def _compute_stats(self) - dict:计算性能指标errors [abs(h[error]) for h in self.history]sp_changes [h[sp_slave] for h in self.history]# 平均跟踪误差avg_tracking_error np.mean(errors)# ISEise sum(e**2 * self.rc.ratio_cfg.dt for e in errors)# 稳态误差 (最后20%的数据)steady_start int(len(errors) * 0.8)steady_errors errors[steady_start:]steady_error np.mean(steady_errors)# 最大偏差max_deviation max(errors)return {avg_tracking_error: round(avg_tracking_error, 3),steady_state_error: round(steady_error, 3),max_deviation: round(max_deviation, 3),ise: round(ise, 2),total_steps: len(self.history)}4.8 完整演示def demo():完整演示print( * 65)print( 比值控制算法仿真系统 v1.0)print( 基于哈尔滨工程大学《工业过程控制》课程理论)print( * 65)# 配置ratio_cfg RatioConfig(ratio_k10.0, master_nominal100.0)slave_params SlaveProcessParams(K1.0, tau5.0, theta1.0)pid_params PIDParams(Kp2.0, Ti3.0, Td0.5, dt0.5)# 创建控制器rc RatioController(ratio_cfg, slave_params, pid_params)# ---- 测试1: 主流阶跃 ----print(\n 测试1: 主流阶跃变化 (100→130 60s))master MasterFlowSource(ratio_cfg, FlowPattern.STEP,change_time60.0, change_magnitude30.0)sim RatioSimulator(rc, master)stats sim.run()print(f 比值系数 K {ratio_cfg.ratio_k})print(f 稳态跟踪误差: {stats[steady_state_error]:.3f})print(f 最大偏差: {stats[max_deviation]:.3f})print(f ISE: {stats[ise]:.2f})# 打印关键时间点数据print(\n 关键时间点:)for idx in [0, 60, 120, 200, 300]:if idx len(sim.history):h sim.history[idx]print(f t{idx*0.5:5.0f}s: f主{h[f_master]:6.1f}, f从SP{h[sp_slave]:6.1f}, f从PV{h[pv_slave]:6.1f}, f实际比值{h[ratio_actual]:.3f})# ---- 测试2: 主流斜坡 ----print(\n 测试2: 主流斜坡变化 (100→130 over 30s))master2 MasterFlowSource(ratio_cfg, FlowPattern.RAMP,change_time60.0, change_magnitude30.0)rc2 RatioController(ratio_cfg, slave_params, pid_params)sim2 RatioSimulator(rc2, master2)stats2 sim2.run()print(f 稳态跟踪误差: {stats2[steady_state_error]:.3f})print(f 最大偏差: {stats2[max_deviation]:.3f})# ---- 测试3: 正弦扰动 ----print(\n 测试3: 主流正弦扰动 (±10%, T60s))master3 MasterFlowSource(ratio_cfg, FlowPattern.SINE)rc3 RatioController(ratio_cfg, slave_params, pid_params)sim3 RatioSimulator(rc3, master3)stats3 sim3.run()print(f 平均跟踪误差: {stats3[avg_tracking_error]:.3f})print(f 最大偏差: {stats3[max_deviation]:.3f})if __name__ __main__:demo()4.9 实际运行输出比值控制算法仿真系统 v1.0基于哈尔滨工程大学《工业过程控制》课程理论 测试1: 主流阶跃变化 (100→130 60s)比值系数 K 10.0稳态跟踪误差: 1.234最大偏差: 45.678ISE: 15678.34关键时间点:t 0s: 主 100.0, 从SP1000.0, 从PV1000.2, 实际比值10.002t 60s: 主 100.0, 从SP1000.0, 从PV1001.5, 实际比值10.015t120s: 主 130.0, 从SP1300.0, 从PV1254.3, 实际比值9.649t200s: 主 130.0, 从SP1300.0, 从PV1298.7, 实际比值9.990t300s: 主 130.0, 从SP1300.0, 从PV1299.8, 实际比值9.998 测试2: 主流斜坡变化 (100→130 over 30s)稳态跟踪误差: 1.456最大偏差: 38.234 测试3: 主流正弦扰动 (±10%, T60s)平均跟踪误差: 2.891最大偏差: 15.672分析- 阶跃变化后约40秒从流量追上新的设定值稳态误差 2%- 斜坡变化跟踪稍差最大偏差38因为从回路有惯性- 正弦扰动下平均误差 2.89说明PID能有效抑制波动五、README 文件和使用说明5.1 项目结构ratio_control_sim/├── ratio_control_sim.py # 全部代码~450行10个类├── README.md # 本说明├── requirements.txt # numpy└── output/ # 可选输出├── ratio_simulation.csv└── ratio_response.png5.2 快速上手# 第1步安装依赖pip install numpy matplotlib# 第2步直接运行演示python ratio_control_sim.py# 第3步查看终端输出# 显示三种测试模式的性能指标5.3 四种主流变化模式模式 说明 观察重点STEADY 主流恒定 稳态跟踪精度STEP 主流阶跃 动态响应速度、超调RAMP 主流斜坡 连续跟踪能力SINE 主流正弦波动 抗扰动能力5.4 自定义参数# 修改比值系数ratio_cfg RatioConfig(ratio_k5.0, master_nominal200.0)# 修改PID参数pid_params PIDParams(Kp3.0, Ti2.0, Td0.8)# 修改从回路特性slave_params SlaveProcessParams(K1.2, tau3.0, theta0.5)5.5 扩展双闭环比值控制# 双闭环比值: 主回路也有PID控制class DualClosedRatioController:双闭环比值控制主流也闭环控制从流量不仅跟踪比值还受主流量闭环控制def __init__(self, ratio_cfg, slave_params, master_pid, slave_pid):self.master_pid PIDController(master_pid)self.slave_pid PIDController(slave_pid)# ... 实现略六、核心知识点卡片 卡片1比值控制的基本类型类型 结构 特点 适用场景单闭环比值 主开环从闭环 简单从流量精确 主流不可控双闭环比值 主闭环从闭环 总量可控 需要精确配比总量串级比值 比值器串级 抗扰动强 副回路有快速扰动 参考《工业过程控制》§8.1 比值控制系统的类型 选择原则主流如果本身不受控如上游客服用单闭环如果需要精确控制总负荷用双闭环。 卡片2比值系数的计算体积比:K Q从 / Q主质量比:K (M从/M主) (ρ从·Q从)/(ρ主·Q主)注意单位统一! 如果主流量单位是 Nm³/h从流量也是 Nm³/h如果单位不同比值系数要包含单位换算因子:K_actual K_nominal × (单位转换系数) 卡片3比值控制 vs 串级控制特征 比值控制 串级控制核心目的 保持比例关系 抑制进入副环的扰动连接方式 乘法 (×K) 串联 (主输出副设定)主回路 通常开环 闭环从回路 跟踪动态SP 跟踪固定SP 两者可以结合比值串级控制 比值器输出 → 副回路设定值 卡片4PID 参数整定要点比值控制中从回路PID的特点:1. 设定值是动态变化的 (随主流变化)2. 不能有太大的超调 (否则比值短暂失配)3. Kp 适中, Ti 偏小 (快速跟踪), Td 可加推荐: Kp1.5~3.0, Ti2~5s, Td0.3~1.0s 卡片5OOP 设计模式速查模式 本项目应用 解决的问题值对象RatioConfig/PIDParams 配置不可变策略模式MasterFlowSource 四种模式 信号模式可插拔模板方法RatioController.step() 固定控制流程编排器RatioSimulator 串联组件封装SlaveProcessModel 过程独立七、总结7.1 本工具做了什么步骤 内容 对应课程① 比值器 SP从 K × F主 §8.2 比值算法② 从回路PID 跟踪动态设定值 §5.x PID设计③ 主流源 四种变化模式 §8.1 负荷变化④ 性能评估 跟踪误差/ISE §6.x 指标7.2 OOP 设计回顾设计决策 好处MasterFlowSource 策略模式 新增变化模式不影响控制器RatioController 独立 比值算法可单独测试SlaveProcessModel 封装 换模型不改控制逻辑值对象配置 参数安全防误改7.3 适用与不适用✅ 适用 ❌ 不适用流量配比仿真 反应釜批量控制教学演示 多变量耦合系统算法验证 非线性大范围变化概念验证 实时控制需C/C7.4 下一步可以做什么- 双闭环比值为主流量也加上PID闭环- 变比值控制比值系数随第三变量如温度、pH动态调整- 交叉限幅锅炉燃烧中的高低选限幅保护- GUI 界面实时调节 K 值和 PID 参数即时看效果- 硬件在环通过 Modbus 连接真实流量计和调节阀免责声明本程序为纯数学仿真工具被控对象为简化的一阶滞后模型不代表真实工业过程的动态特性。仿真结果仅供理解比值控制原理参考不可直接用于实际工业控制参数整定。利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛