尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

精馏塔顶温度控制仿真:从对象建模到PID参数整定实践

精馏塔顶温度控制仿真:从对象建模到PID参数整定实践 简介精馏塔顶温度控制系统设计与仿真.doc 是一份面向化工自动化、过程控制类课程设计的完整参考文档围绕精馏塔灵敏板温度控制问题系统讲解单回路、串级、前馈、Smith预估补偿、比值与选择等控制方案的设计与比较。资源为1个doc文件压缩包约935KB便于直接查阅与复用。文档以具体工况为例给出被控对象静态工作点、传递函数推导、调节阀与控制器正反作用选择、PID参数整定步骤并在SIMULINK环境下完成温度设定值跟踪和进料量、泵出口压力等扰动响应的仿真测试帮助读者理解从对象分析到控制系统性能评估的完整流程。资源内容既有理论原理又有计算过程和仿真结果讨论适合作为课程设计报告撰写、控制系统仿真入门练习或相关课题的参考资料。目前已有356人学习下载。1. 精馏塔顶温度控制系统先看被控变量再看仿真工具塔顶温度在所有精馏塔被控变量里通常排在第一位。它不直接等于产品纯度却直接影响组分分离效果温度偏差零点几度塔顶关键组分含量就可能跑出质量指标。更麻烦的是这个回路往往带几分钟到十几分钟的纯滞后扰动来自进料流量、进料温度、回流量和冷却水温度等多个方向单回路PID经常压不住。所以业界常见做法不是先上仿真而是先根据工艺数据把塔顶温度对象的特性辨识出来再决定用单回路、串级还是前馈-反馈结构。仿真在这里的作用是用低成本把控制方案、PID参数和抗扰逻辑验一遍避免在DCS组态后反复试凑。这篇文章按建模、方案、仿真、整定和排错的顺序把一个可复现的塔顶温度控制系统仿真过程完整讲一遍。2. 塔顶温度被控对象的建模从阶跃响应到传递函数2.1 为什么塔顶温度对象在仿真里被简化成一阶惯性加纯滞后精馏塔从塔板气相经冷凝器到回流罐再回到塔顶采出温度测量点和控制阀之间隔着十几块塔板和一个传热过程。热量与质量的传递使得温度变化不会立即跟上操作量变化宏观表现为“滞后惯性”。在工程整定里最常用的近似模型是G(s) K * exp(-taus) / (Ts 1)其中 K 是稳态增益T 是时间常数tau 是纯滞后。这个模型虽简单但足以用于PID参数初算和仿真验证。需要强调如果塔顶温度同时受回流罐液位、回流比、采出量影响还要把对象结构补充为多输入单输出不过单回路整定时仍以主通道为主。2.2 用现场阶跃数据辨识 K、T、tau 的 Python 脚本常见做法是做完阶跃实验后导出 DCS 历史数据再用两点法辨识。下面给出用两点法辨识的 Python 脚本它读取 CSV 中的时间、操作量和温度列自动计算稳态增益再用 28.3% 和 63.2% 两个时间点求解时间常数和纯滞后。import pandas as pd import numpy as np def fit_fopdt(csv_path, dt1.0): df pd.read_csv(csv_path) t df[time].values u df[reflux].values y df[overhead_temp].values # 取阶跃前后的稳态平均值 y0 np.mean(y[:int(0.1 * len(y))]) y_end np.mean(y[-int(0.2 * len(y)):]) u0 np.mean(u[:int(0.1 * len(u))]) u_end np.mean(u[-int(0.2 * len(u)):]) K (y_end - y0) / (u_end - u0) # 归一化响应找 28.3% 和 63.2% 对应时间 y_norm (y - y0) / (y_end - y0) t63 t[np.argmin(np.abs(y_norm - 0.632))] t28 t[np.argmin(np.abs(y_norm - 0.283))] T 1.5 * (t63 - t28) tau t63 - T return K, T, tau, t, y K, T, tau, t, y fit_fopdt(step_test.csv) print(fK{K:.3f}, T{T:.2f}s, tau{tau:.2f}s)这段代码的核心逻辑是先求稳态增益 K再把阶跃响应归一化找到 28.3% 和 63.2% 两个响应点。由于一阶惯性加纯滞后模型在 63.2% 处的时间等于 tau T在 28.3% 处的时间约等于 tau T/3两者做差便能解出 T再回代得到 tau。现场数据如果有噪声建议先做一次移动平均否则 argmin 会被噪声点带偏。参数说明dt 是采样间隔代码默认按等间隔处理实际 DCS 导出数据如果不是均匀采样要先用 interpolate 重采样。2.3 在 Python 和 Simulink 里把模型落到仿真环境辨识得到 K、T、tau 后在 Python 环境里用 control 库构造传递函数代码只有几行import control as ct import matplotlib.pyplot as plt K -1.2 # 回流增加时塔顶温度下降 T 180.0 # 秒 tau 60.0 # 秒 s ct.tf(s) G K / (T * s 1) * np.exp(-tau * s) t np.linspace(0, 3000, 3000) t, y ct.step_response(G, t) plt.plot(t, y) plt.xlabel(time (s)) plt.ylabel(overhead temp (°C)) plt.show()在 Simulink 中可以直接用 Transfer Fcn 模块填K / (T*s1)再用 Transport Delay 模块填 tau 秒也可以用 LTI System 块一步完成。注意单位时间常数和滞后时间都用秒避免后面整定公式出现量纲错误。表 2-1 给出化工塔顶温度对象参数的典型范围方便你判断辨识结果是否合理。表 2-1 塔顶温度主通道参数典型范围参数物理意义典型范围说明K稳态增益-0.3 ~ -3 °C/(t/h)回流增加通常使塔顶温度下降T时间常数60 ~ 600 s塔板数越多越大tau纯滞后15 ~ 180 s传感器安装位置和冷凝器影响3. 塔顶温度控制方案选型单回路、串级与前馈3.1 单回路 PID 在塔顶温度上为什么容易失稳直接以塔顶温度为被控量、回流量为操纵量构成单回路时对象滞后大PID 增益稍高就震荡增益低了又调节太慢。再加上回流量本身受回流罐液位波动影响副环扰动会直接叠加到主环上。因此工程上更常见的是把流量回路嵌在温度回路里构成串级控制主回路输出回流量的给定值副回路是回流量或回流比控制回路。3.2 串级回路的仿真结构内环快、外环慢在 Python control 库里搭串级回路一般先把副对象近似为快过程再按主回路整定外环。代码示例如下Gp2 1.0 / (10 * s 1) # 回流到温度阀后对象的快动态 Gp1 -1.2 / (180 * s 1) # 主对象已含部分滞后 Gd 0.8 / (240 * s 1) # 进料温度扰动通道 C2 ct.tf([2.5, 0.05], [1, 0]) # 内环 PI C1 ct.tf([0.8, 0.01], [1, 0]) # 外环 PI # 先闭合内环得到等效对象再闭合外环 S2 ct.feedback(ct.series(C2, Gp2), 1) G_equiv ct.series(Gp1, S2) L1 ct.series(C1, G_equiv) S1 ct.feedback(L1, 1)这段代码把内环 PI 先闭合得到从主控制器输出到塔顶温度的等效对象再整定外环。关键点是外环控制器输出单位是内环给定值所以内外环的量纲必须匹配比如外环输出是回流量给定值t/h内环给定值单位也必须是 t/h。仿真时先只闭环内环验证跟随性再闭外环调温度不要一上来全闭合。3.3 PID 参数整定的四组公式与使用边界有了 FOPDT 模型可以用表 3-1 里的公式整定。注意这些公式都基于理想 PID实际 DCS 常用“增益-积分时间-微分时间”格式需要区分。表 3-1 常见整定公式对比方法KpTiTd适用场景Ziegler-Nichols0.9T/(K·tau)3.33·tau0滞后时间常数比中等Cohen-Coon(T/(K·tau))·(0.9tau/(12T))tau·(303tau/T)/(920tau/T)4tau/(112tau/T)滞后较大、强调鲁棒性Lambda 整定T/(K·(lambdatau))T0按期望闭环时间 lambda 调快慢SIMCT/(K·(tautheta_c))min(T, 4(tautheta_c))0兼顾抗扰与鲁棒theta_c 一般取 tau实际使用中我对塔顶温度这种大滞后回路习惯先用 SIMC 把 theta_c 等于 tau 代入得到一组偏保守参数再在仿真里逐步减小 theta_c 观察超调。Lambda 整定的优点是直接把期望闭环时间 lambda 放到公式里lambda 取 T 的 1/3 到 1/2 时响应不振荡且抗扰可用。Ziegler-Nichols 在 tau/T 大于 0.5 时容易产生很大超调不适合直接用于塔顶温度。4. 在 Simulink 中搭建塔顶温度控制仿真模型4.1 模型分块与信号连接Simulink 模型里我通常分成四个部分控制器、执行器/阀门、过程对象、测量变送。塔顶温度串级控制的方块连接顺序为主回路温度测量值进入外环 PID外环输出作为内环给定量内环 PID 与回流流量对象闭环内环输出进入阀门模型再加到主对象上。测量环节要加入一阶低通滤波和量程换算。表 4-1 给出 Simulink 常用模块的用途方便对照查漏模块用途参数设置PID Controller串级内外环外环输出限幅设为内环给定量范围Transfer Fcn主对象与副对象[K] / [T 1]Transport Delay纯滞后tau 秒Saturation阀门开度限幅0~100%Filter测量噪声滤波时间常数 5~20 s4.2 用 MATLAB 脚本批量扫描 PID 参数手动在示波器上点参数太慢。我一般用脚本把几组 PID 参数写入模型并批量仿真用 ITAE 指标对比。下面是一个可运行的 MATLAB 脚本片段mdl distillation_temp_ctrl; open_system(mdl); Kp_list [0.5, 1.0, 1.5]; Ti_list [120, 180, 240]; results []; for i 1:length(Kp_list) for j 1:length(Ti_list) set_param([mdl /Outer PID], P, num2str(Kp_list(i))); set_param([mdl /Outer PID], I, num2str(Kp_list(i)/Ti_list(j))); sim(mdl); e temp_sp.signals.values - temp_pv.signals.values; t temp_pv.time; itae trapz(t, t .* abs(e)); results(end1, :) [Kp_list(i), Ti_list(j), itae]; end end results sortrows(results, 3); disp(results(1:5, :));脚本里set_param直接改外环 PID 的增益和积分时间sim运行后用trapz计算时间乘绝对误差积分ITAE。ITAE 越小越好它比 ISE 更看重后期稳态误差。注意积分时间必须随增益缩放否则相当于只改了比例。批量仿真完成后把最优参数写回模型再跑一次扰动测试确认抗扰能力。4.3 防积分饱和在仿真里的实现方式塔顶温度串级回路里主控制器输出是回流量的给定量如果回流阀在最低开度或最高开度主 PID 的积分项会持续累积等温度回到设定值时阀门却半天回不来这就是积分饱和。仿真里最容易复现给温度设定值加一个大幅度阶跃观察回流量是否长时间顶在限幅上。常见做法是用 Simulink PID Controller 自带的 Anti-windup 选项选择back-calculation或clamping。我更推荐 back-calculation因为它在限幅时把控制器输出与限幅值的偏差反馈回积分路径能快速退出饱和。还需要把外环输出限幅设置得比阀门物理范围稍窄例如阀门 0-100 t/h外环输出限幅设 5-95 t/h给副回路留一点余量。5. 扰动注入、信号发生器和测量噪声的处理5.1 用信号发生器模拟进料流量和进料温度扰动塔顶温度仿真不能只测设定值阶跃还要测抗扰动能力。行业常见做法是给进料流量通道加一个方波信号幅值取正常流量的 5%~10%周期按工艺波动设定给进料温度通道加斜波或随机扰动。Simulink 里的 Signal Generator 模块可以产生 sine、square、sawtooth但更贴近现场扰动的是用 Random Number 加一阶惯性滤波。import numpy as np from scipy import signal np.random.seed(42) t np.linspace(0, 7200, 7200) # 2小时数据 raw_noise np.random.randn(t.size) * 0.2 # 白噪声幅值0.2度 b, a signal.butter(1, 0.01) # 一阶低通滤波 feed_temp_dist signal.filtfilt(b, a, raw_noise)这段代码生成一列缓慢变化的温度扰动信号模拟进料温度波动。butter(1, 0.01)表示截止频率为 0.01 倍采样频率对应的时间常数为 100 秒左右和现场的换热器滞后比较接近。filtfilt是零相位滤波不会引入额外滞后适合做仿真输入信号但如果要模拟真实传感器响应应该改用lfilter。5.2 测量噪声对微分项的影响与一阶滤波参数选取塔顶温度测量值带有热电阻或热电偶噪声PID 控制器里的微分项会把噪声放大导致执行器频繁动作。仿真时可以在测量输出后加一个Transfer Fcn: 1/(tf*s1)再连到 PID 反馈端。滤波时间常数 tf 不宜大于纯滞后的 1/10否则温度真变化也被滤掉控制会变钝。例如 tau60stf 取 5~8s 比较合适。表 5-1 扰动信号推荐设置扰动源信号类型幅值周期/滤波观察指标进料流量方波±5%~10% 正常流量20~60 min塔顶温度波动幅值进料温度方波斜波±2~5 °C30 min恢复时间回流罐液位随机白噪声小幅度滤波 2 s阀位波动率代码层面用 Python 的numpy.random.randn生成白噪声再经scipy.signal.lfilter滤波也能得到相同效果。这里不再展开重点是确认扰动后的温度偏差是否在工艺允许的 ±0.5 °C 以内以及恢复时间是否小于工艺窗口。6. 仿真发散与不收敛的排查三个最常用的手段精馏塔温度控制仿真里最常见的“仿真发散”不是算法发散而是模型配置问题。我遇到最多的三个原因依次是代数环、过大的固定步长、和瞬时跳变信号。第一代数环出现在 Simulink 中当 PID 输出直接又返回到自身输入而中间没有状态模块时。排查方法是在模型菜单里选择 Display - Sample Time - Colors看看是否有红色模块连成环或在代码生成时看警告。解决代数环可以加一个 Memory 模块或把 PID Controller 里的 Filter coefficient 改成非零值。第二固定步长仿真时步长大于系统最小时间常数的 1/10 容易振荡发散。塔顶温度模型 T180 s但内环副对象可能是 10 s甚至更小的阀动作。仿真时用可变步长求解器ode45把 Max step size 设为内环时间常数的 1/5即 2 s通常就能稳定。如果模型里有 Transport Delay还需要考虑 delay 与步长的关系用ode23t或ode15s这类刚性求解器更稳。第三信号发生器输出阶跃瞬间变化太快会让非线性模块在零点附近计算发散。给方波信号加一个 Rate Limiter限制温度设定值和扰动信号的变化率例如每秒不超过 0.1 °C既能模拟真实阀门响应速度也可以避免仿真发散。具体技巧是先用simlog定位发散发生的时间点再检查该时刻是哪个状态量先变成 NaN 或 Inf。把 Solver 的 Solver Reset Method 设为 Robust也能减少很多莫名其妙的发散。如果实在找不到原因把 PID 增益先降到原来的一半再把 Max step size 改成 0.001 s 跑一次。如果不再发散就能确认问题出在步长与增益的组合而不是模型结构错误。这样做一遍比你重新搭一个模型快得多。本文还有配套的精品资源点击获取
返回列表