ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

S7-1200+SCL实现冷却水恒温恒压PID控制与触摸屏设计

S7-1200+SCL实现冷却水恒温恒压PID控制与触摸屏设计 车间里的冷却水要是忽冷忽热、压力忽高忽低设备停机报警是小事搞不好把换热器、压缩机、注塑机这些“贵家伙”给折腾坏了。干过设备维护或者产线改造的朋友应该都有体会冷却水系统看着不起眼实际上比很多主工艺还要娇贵。我之前接手过一个项目现场要求把冷却水供水的温度稳定在设定值附近同时保证管网压力恒定不能因为几台设备启停就抖得厉害。当时用的就是西门子S7-1200 PLC程序采用SCL编程语言来写PID控制部分占了核心地位再配上一台威纶通触摸屏型号是TP1系列做成人机交互画面。整套系统做下来从控制效果到操作体验都还算满意这里分享一下我的完整实现过程和踩坑记录给正在做恒温恒压供水、或者准备用S7-1200做PID闭环控制的朋友一个参考。适合看这篇文章的人电气工程师、自动化调试人员、设备维修改造的朋友以及想了解S7-1200的SCL编程和威纶通触摸屏配合实现PID控制的入门者。内容会涉及控制方案怎么选、程序结构怎么搭、PID参数怎么整定、触摸屏画面怎么做还有现场调试时那些教科书上不会写的问题。1. 项目需求拆解与方案选型1.1 冷却水系统的工艺痛点与控制目标先说说这个项目的现场情况。现场是一个小型集中冷却水站几台用水设备并联在管网上水泵把冷水打到各设备设备回水经过换热器降温后再循环使用。原来的控制方式相当原始水泵工频运行靠人工开关换热器的冷却风机来大概维持水温压力波动完全不管。结果就是夏天水温压不住冬天水温偏低设备频繁高温报警而且某台设备突然启动的时候管网压力瞬间掉下来其他设备的流量跟着受影响整个产线都不稳定。甲方提的要求其实就两条一是供回水温度要稳在设定值正负1摄氏度以内二是供水母管压力要恒定为设定值波动范围控制在正负0.05兆帕以内。这个精度要求在当前这类系统里算是常规水平不是特别苛刻但对控制方案还是有讲究的。温度对象是典型的大滞后、慢时变压力对象则是快响应、强扰动这俩放在同一个系统里必须分开设计控制回路。控制目标理清楚之后硬件怎么搭就顺理成章了。S7-1200选的是1214C DC/DC/DCCPU本身自带模拟量输入输出温度变送器送来的4-20毫安信号和压力变送器的4-20毫安信号直接进AI通道控制输出一路4-20毫安去调节供水管上的电动调节阀开度另一路输出控制变频器的频率给定驱动一台补水泵。触摸屏用威纶通TP1系列通过以太网口和PLC直连用网线就能通讯简单可靠。1.2 为什么用SCL而不是梯形图很多做S7-1200项目的人习惯用LAD梯形图这没问题梯形图在逻辑控制领域确实直观。但到了PID这类模拟量控制、数据处理比较多的场景我建议你认真考虑一下SCL。STL语句表和SCL类似都是文本编程但SCL更接近高级语言写起来像C语言和Pascal的混合体循环、判断、数学运算、数组操作都写起来很舒服。这个项目里为什么要选SCL三个原因。第一PID控制器的调用和参数管理在SCL里可以写得很结构化手动自动切换、设定值斜坡、前馈计算这些逻辑用梯形图搭起来会拉出一大片触点线路而SCL用IF...THEN...ELSIF几下就理清了。第二程序要处理好几组工程量换算比如模拟量原始值转成实际温度压力值、PID输出百分比转成调节阀开度SCL里做四则运算和类型转换非常顺手。第三可读性和可维护性好过半年回头看程序还能看明白梯形图一旦复杂了层级嵌套多了看线都费劲。SCL还有一个隐形优势写代码比拖触点块快得多尤其是修改逻辑的时候改一行文字比重新拉一坨梯形图要省事儿。要是你有标准功能块想在不同项目里复用SCL的FB块复制过去就能用不像梯形图FB还要小心处理各种寄存器冲突。1.3 控制方案选型单回路、串级还是前馈冷却水系统的恒温恒压控制最常见的方案有三种思路。第一种是双回路完全独立温度PID去控制换热器的冷却风机转速或冷冻水调节阀压力PID去控制补水泵变频器两套回路互不干预。这种方案实现简单但有一个隐患温度回路和压力回路都作用于同一个管网系统当一个回路动作改变流量或温度的时候另一个回路会检测到扰动而跟着动作容易引发“泵阀打架”出现压力温度来回振荡。第二种是串级PID把温度作为主调压力作为副调主调的输出作为副调的设定值。串级的好处是能快速消除副环内的扰动但前提是两个被控变量之间有明确的串联关系。冷却水系统里温度和压力的耦合关系并不完全是串联式的所以串级用得不好反而会让系统变得“僵”。第三种也是我最终采用的温度回路和压力回路独立控制但给温度回路加上前馈补偿把回水温度变化率作为前馈信号叠加到输出上。为什么要加前馈因为冷却水系统的温度滞后太大了现场用水设备的负荷突然升高回水温度会缓慢爬升纯靠PID反馈的话等到PID检测到偏差再输出温度已经冲出去一大截了。前馈的作用是“提前动作”在温度刚开始变化还没形成大偏差的时候就根据变化趋势预先调整冷却量相当于给PID踩了一脚提前的油门。这里顺便回应一下很多朋友问的“pid前馈怎么使用”这个问题。前馈不是替代反馈而是和反馈叠加。我这里的做法是检测回水温度的变化率乘以一个前馈系数计算出前馈输出百分比再和温度PID的输出百分比相加作为换热器冷却阀门的最终开度指令。变化率用SCL在PLC里对温度采样值做差分就能得到再用死区消除噪声扰动。前馈系数刚开始可以设成0观察温度波动情况后慢慢加上去一般取0.1到0.3之间比较稳。2. 控制核心恒温恒压PID架构与参数思路2.1 温度环和压力环的独立设计与耦合处理先说压力环。压力对象响应快、滞后小控制目标就是把供水母管压力稳稳压住。我用了一个标准的增量式PID输出直接控制补水泵变频器的频率。这个回路没什么花哨的关键点是采样周期要快我设的是100毫秒因为压力波动来得快慢了跟不上。PID参数方面比例不能太大否则泵频繁调节会抖动积分时间可以稍短一些帮助消除余差微分基本不用压力信号本身噪声不大加了反而不稳。温度环就麻烦多了。冷却塔或换热器把回水温度降下来整个热交换过程滞后时间可能达到几十秒甚至几分钟。这个环路的采样周期我设的是1秒比压力环慢一个数量级目的是让PID有足够时间去等待被控量变化不然采样太快反而会把噪声和暂时性波动当成偏差来响应导致输出乱跳。两个环独立控制的耦合问题我在运行时做了个简单的解耦措施当压力环检测到管网压力低于下限并触发补水泵加速时同时给温度环一个软扰动信号让温度PID暂时把输出抑制一点点避免两个回路同时增强导致系统过冲。这个逻辑听起来复杂其实在SCL里就是几行IF判断的事但效果非常明显管网压力和温度再也不同步“打架”了。整个方案没有采用模糊PID或者先进控制原因很实在常规PID配合前馈只要参数整定到位已经能满足正负1摄氏度和正负0.05兆帕的工艺要求。模糊PID在S7-1200上也能做但模糊规则表的调试成本高现场工人也不好理解将来维护起来更是头疼。我觉得工程项目的原则是“够用就好稳定第一”能用经典控制解决的问题不值得给自己挖坑。2.2 温度PID的具体实现与参数整定温度环在S7-1200里我用的是指令自带的PID_Compact功能块V2.x版本而不是自写PID算法。为什么用官方块因为PID_Compact内部集成了抗积分饱和、微分滤波、手动模式处理等功能都是经过验证的成熟代码比自己写的PID算法稳定得多。自己做算法当然也是一种练手方式但放到工业现场里可靠性和异常边界处理才是第一位的。PID_Compact使用时几个关键配置要注意。第一控制器类型要选“温度”实际上这类带大滞后的过程对象我们要设置成采用PI控制为主D分量尽量小甚至不用。第二输入输出的上下限要和模拟量工程量范围对应输入设定为0到100摄氏度输出设定为0到100的百分比。第三启用手动/自动切换功能这个对调试太重要了在没整定好参数之前用手动模式直接给阀门一个固定开度先观察系统能不能稳定下来。参数整定方面我用了一个很偷懒但有效的方法先用PID模拟器类的小工具网上很多免费的温度PID仿真软件把参数粗调一遍再拿到现场微调。现场整定的步骤是这样的先把积分时间设得很大相当于几乎关掉积分只留比例从小到大慢慢增大比例系数让温度出现4比1的衰减振荡曲线记录此时的比例增益和振荡周期。然后根据Ziegler-Nichols公式算出初始的积分时间稍微打一个折扣再手动微调几轮。最后我整定出来的温度环参数大概是比例增益2.8积分时间120秒微分时间0。这个参数下温度稳态波动在正负0.6摄氏度左右已经优于甲方的要求。压力环参数比例增益1.5积分时间5秒微分时间0。压力稳态波动正负0.03兆帕响应也比较利索没有明显超调。2.3 手自动无扰切换与安全联锁逻辑这是很多初做PID项目的人容易忽略的地方。触摸屏上肯定要有手动模式和自动模式的切换按钮但切换的时候如果不做处理输出值会发生跳变。比如自动模式下PID输出是60%你切到手动手动设定值还是上一次手动留下的30%阀门瞬间从60%关到30%整个系统就“哆嗦”一下。所以必须做无扰切换从自动切手动时把手动设定值自动同步为当前PID输出值从手动切自动时把PID内部的状态变量初始化让PID从当前输出值开始续算。在PID_Compact里这个功能通过背景DB里的Mode管脚来控制。我在SCL里做了一个专门的切换处理块切换前读当前输出值并写入手动设定值然后让PID_Compact的Mode置为手动这样切换瞬间输出值完全不变操作员在现场根本感觉不到切换动作系统稳如老狗。联锁逻辑也必须在SCL里写清楚。我设了三个主要连锁条件供水母管压力低于下限0.3兆帕且持续5秒判定为失压自动关断补水泵并触发报警防止泵空转损坏回水温度高于设定值8摄氏度判定为严重超温强制把冷却阀门开到最大同时声光报警提醒操作员检查换热器温度传感器信号断线模拟量通道小于2毫安或大于20.5毫安自动切到安全输出状态并禁止自动模式投入。这些联锁看着繁琐但关键时刻是保设备命的。3. SCL编程落地程序结构、FB块与关键代码3.1 PLC程序框架与块结构设计程序的块结构我建议按功能划分成四个部分主循环块OB1、PID控制块FB100、报警联锁块FB200、模拟量处理块FC50。每个块各司其职调试的时候单独监控定位问题非常快。OB1负责调用各FB块并负责一些系统级初始化逻辑。FB100是我的核心控制块背景DB是DB100里面定义了所有PID相关的参数、运行状态、切换标志位。FB200背景DB是DB200专门存放报警状态、联锁动作标志。FC50是无参数子程序负责模拟量输入通道的工程量转换。为什么要用FB加背景DB的形式而不是直接写在OB1里因为FB可以封装、可以多次调用、可以批量修改。比如将来有朋友想复制这套程序做第二套冷却系统直接把FB100复制一份改一下背景DB的地址映射就行主程序一行都不用动。这就是结构化编程的威力也是我坚持用SCL的原因之一。程序执行顺序也很重要。OB1里我把FC50模拟量处理放在最前面因为后续所有计算都要用新鲜的工程值。然后调用FB100做PID运算和输出最后调FB200做报警联锁判断。注意联锁必须在PID输出之后、写模拟量输出通道之前执行这样联锁可以覆盖PID的输出指令实现强制保护。3.2 SCL代码实现PID调用与工程量换算模拟量工程量转换的SCL代码我用一个简单明了的写法。S7-1200模拟量输入通道0到27648对应0到20毫安如果是4到20毫安变送器断线检测点设在小于5530对应4毫安左右时报警。4到20毫安映射到温度范围0到100摄氏度线性换算公式就是“工程值浮点原始值/27648.0*量程零点偏移”。下面是FC50里温度通道的转换代码我用SCL来写逻辑一目了然// 温度通道 AI0: 4-20mA 对应 0-100℃ #rawTemp : AI0_Raw; // 模拟量原始值 INT IF #rawTemp 5530 THEN #tempReal : INT_TO_REAL(#rawTemp) / 27648.0 * 100.0; DB_Temp.Temp_Value : #tempReal; DB_Temp.Temp_OK : TRUE; ELSE DB_Temp.Temp_Value : 0.0; DB_Temp.Temp_OK : FALSE; // 断线或低于量程 END_IF;注意模拟量转换有个细节S7-1200的模拟量输入是带符号的整数如果你把通道模式配成0到20毫安那么超过量程时原始值可能到32767。转换代码里最好做限幅处理不要让异常值进入PID运算。另外变送器如果是两线制还是四线制接线方式影响通道配置里的“测量类型”选择别选错否则读数会不对。PID_Compact的调用我在FB100里这样写PID_Temp_Instance( // 温度PID背景DB SetPoint : DB_Temp.Temp_SP, Input : DB_Temp.Temp_Value, Input_PER : 0, // 不用外设IO直接用工程值 Manual_Value : DB_Temp.Temp_Manual_Out, Manual_Enable : DB_HMI.Temp_Manual_Mode, Disturbance : DB_Temp.Temp_FeedForward, // 前馈输入 OutputNorm DB_Temp.Temp_PID_Out );这里把前馈值通过Disturbance管脚输入PID_Compact这是官方块支持的抗扰动输入它会被加到PID输出上正好符合我们前面讲的前馈思路。手动模式下Manual_Enable为TRUE时输出直接等于Manual_Value我们的无扰切换逻辑就是先写Manual_Value为当前输出再翻转这个开关。3.3 梯形图思维转SCL的常见问题很多从梯形图转SCL的朋友刚开始会很不适应。我总结下来主要有三个坑。第一个坑是赋值和比较的方向问题SCL里“:”是赋值“”是比较C语言程序员还好梯形图程序员容易写反。第二个坑是类型匹配SCL对数据类型要求严格INT和REAL做运算必须显式转换直接拿INT去和REAL比较会报错。第三个坑是跳变沿处理梯形图里有上升沿下降沿指令SCL里要自己写“上一次状态”变量逻辑上等价但要多声明几个静态变量。还有一个技巧是SCL的分号问题。每条语句结束要写分号遗漏了编译直接报错。虽然TIA Portal会提示语法错误位置但大程序里一堆红线看着就心烦。我的习惯是每写一小段逻辑就编译一次定位错误更精准同时做好注释每个网络块的功能用注释说明注释用中文哪怕代码写得再丑注释靠谱就都好办。在线调试方面SCL比梯形图有一点吃亏梯形图在线时可以直观看到触点的通电状态SCL只能监视变量数值需要在程序里频繁插入中间变量并保持它们的值不被下一周期覆盖这样才能在监控表里看到关键过程量。比如温度的设定值、实测值、PID输出、前馈值这四兄弟我全部单独开了监控标签页调试的时候四列并排看数据流动一目了然。4. 威纶通触摸屏画面设计与通讯配置4.1 威纶通与S7-1200的通讯配置和标签导入威纶通触摸屏和S7-1200通讯走以太网是最省事的方式。触摸屏软件用的是EasyBuilder Pro新建工程时在“设备列表”里添加新设备选择厂商“Siemens”驱动选“S7-1200/1500 (Ethernet)”IP地址设为PLC的实际地址端口默认就行。注意S7-1200的CPU上要勾选“允许来自远程对象的PUT/GET通讯访问”这个选项在PLC属性里的“防护与安全”选项卡下面不勾选的话触摸屏读不到数据。标签导入有两种方式。一种是直接在触摸屏软件里新建地址比如DB100.DBD0这种绝对地址格式另一种是导入TIA Portal里定义好的PLC变量表。我更推荐后者因为TIA Portal里给变量起的名字是“温度设定值”这种中文名导入之后触摸屏工程里也是中文名画面绑定、脚本引用都方便而且不用担心地址对错。具体操作在EasyBuilder Pro里找到“标签数据库”或者“批量导入”选择从TIA Portal导出的S7-1200标签文件PLC编程软件里能把PLC变量导出为xlsx或xml格式然后按照提示映射导入完成后检查几个关键变量的地址确认对应关系正确。一个容易踩的坑是DB块访问方式。S7-1200的DB块默认是“优化”访问优化访问下的变量没有固定物理偏移地址第三方设备访问起来比较麻烦。触摸屏通讯要求DB块属性改成“非优化”标准访问或者干脆在PLC程序里做几个全局数据镜像区把需要通讯的数据复制到独立的全局DB里。我当时的做法是后者专门建了一个DB_HMI全局块把所有需要在触摸屏上显示和操作的变量全部打包定义在里面然后OB1里用MOVE指令或者SCL赋值语句把数据同步过来。这样做的好处是触摸屏访问非常固定清晰而且可以在HMI DB里干干净净地做变量规划。4.2 TP1触摸屏的画面布局与按钮加密威纶通TP1系列触摸屏尺寸不算大画面设计要节制。我总共做了六个画面主监控画面、PID参数设置画面、趋势图画面、报警画面、手动操作画面、系统信息画面。主监控画面放核心运行数据温度实测值、温度设定值、压力实测值、压力设定值、PID输出百分比用大号数字显示确保站在两米外也能看清楚。现场工人对数字大小是非常敏感的字小了他们根本不看。PID参数设置画面要放比例增益、积分时间、微分时间、前馈系数、温度设定值、压力设定值这六个数值输入框加上手动/自动切换按钮。这组按钮还做了操作权限加密。威纶通的按钮加密很简单在按钮属性里启用“安全”功能设置用户等级只有输入正确密码的高等级用户才能操作。我给现场操作员一个普通密码只能看数据和切手动自动给工程师一个高级密码才能修改PID参数。防止不懂的人乱调参数是个非常现实的需求大家去现场就知道工人对触摸屏的好奇心远超你的想象。画面之间的跳转按钮统一放在右上角每个画面都有“主页”“参数”“趋势”“报警”“手动”几个固定导航键操作员随手就能切画面。所有数值显示控件都配上工程单位温度显示“℃”压力显示“MPa”PID输出显示“%”避免读数歧义。报警画面里除了报警文本还加了一个“确认报警”按钮按下去之后蜂鸣器停止但报警状态保持在画面上直到故障排除后自动复位这个逻辑很符合现场操作习惯。4.3 趋势图、数据记录与报表PID调参离不开趋势图威纶通的趋势图控件可以实时显示采样曲线。我给温度、压力、PID输出各分配了一条曲线颜色区分明显温度红色、压力蓝色、PID输出绿色。趋势图的关键参数是采样周期和显示时长采样周期我设为1秒显示时长为30分钟这样既能看细节又能看整体趋势。如果工艺要求数据可追溯可以加一个数据记录功能。威纶通支持把数据定时写入U盘或通过以太网传给上位机格式是CSV文件Excel直接能打开。我把温度、压力、PID输出每30秒记录一条存到触摸屏自带的存储里操作员可以定期导出产量报表的同时把运行曲线导出来。虽然这个项目甲方没强制要求但后期分析问题的时候这组数据帮了大忙。还有一个小细节威纶通的“历史报警”存储容量有限默认可能只有几百条超过之后会自动覆盖旧记录。如果需要在报警查询里找到一个月之前的报警记得在工程属性里把报警存储方式改成“分批存储”或者连接到外部存储设备不然旧记录被覆盖了再想翻历史就抓瞎了。5. 现场调试实录与常见问题排查5.1 PID参数整定的实操心得PID整定这块我真的建议先在仿真软件上练习网上常见PID模拟器、温度PID仿真演示都行别直接在设备上硬调。温度系统滞后大调一次参数可能要等十几分钟看一个波形现场试错效率太低。我常用的是自己写的Excel仿真表或者网页版的PID模拟器把系统的纯滞后时间、时间常数、增益大概估一下输进去然后观察阶跃响应曲线先在“线上”把参数调到差不多到现场再微调。现场整定压力环很顺利因为响应快几轮就能看到清晰的响应。温度环就折磨人了我印象最深的一轮比例增益调到3.5温度开始等幅振荡每4分钟一个周期振幅大概正负1.2摄氏度。我赶紧把增益降回2.8把积分时间设在120秒又观察了二十分钟温度才慢慢稳定下来。这个过程不能急每改一次参数必须至少等待一个完整的滞后时间加振荡周期才能判断效果。让我特别有感触的一次是温度环在白天负荷高的时候表现不错到了晚上负荷低下来温度居然开始低频振荡了。这是因为负荷低的时候系统增益特性变了相同的PID参数在低负荷下过于激进。后来我在SCL里加了一个负荷自适应修正根据温度PID输出值的平均值在小负荷时自动把比例增益乘以0.8的修正系数。这个改动原理很简单但效果立竿见影晚上也稳了。5.2 通讯与触摸屏画面常见故障排查威纶通和S7-1200通讯出问题大多数就两类一类是PLC侧没放通PUT/GET通讯另一类是地址类型不匹配。前者只要在CPU属性里勾选允许PUT/GET访问即可改完需要重新下载硬件配置才生效注意下载后CPU会停机重启。后者常见于把REAL当DINT读、把BOOL当成WORD读之类的乌龙导入标签后先在触摸屏软件的“资料库”里核对变量的数据类型和PLC端是否一致。还有一个真实教训我的DB_HMI块里定义了一个字符串变量用于显示操作员名字威纶通从某个地址偏移开始读这个字符串结果发现在触摸屏上显示乱码。排查半天发现S7-1200的STRING格式前两个字节是最大长度和当前长度威纶通驱动并不会自动跳过这两个字节必须手动把地址偏移加2才能正确读取字符串内容。从那以后我在HMI DB设计时就尽量避免用STRING类型直接用固定数组或单个字符数据更省心。下载PLC程序后触摸屏偶发通讯断开也是常见情况。这是因为CPU停机再启动的瞬间触摸屏的通讯请求被拒有些版本的驱动不会自动重连。解决方法是把威纶通的通讯配置里“通讯延时”和“重试次数”适当调大一般重试3次、间隔100毫秒就够用了。5.3 PID现场几个经典鬼问题最后分享几个PID在现场跑起来之后才会遇到的问题。第一个是积分饱和。温度环的PID输出上限100%下限0%如果换热器已经全开但温度还压不住积分项会持续累积到100%的“饱和区”。等温度降下来PID需要花很长时间把积分吐出来这期间就会被“卡”在高输出形成过冲。PID_Compact自带抗积分饱和但前提是你在配置里正确输入输出上下限。我强烈建议在调试时将“积分重置”功能打开让PID在输出限幅时自动暂停积分。第二个是微分噪声放大。如果现场温度信号有点毛刺微分项会把毛刺放大让输出抖动调节阀跟着不停微动阀门寿命直线下降。我的做法是直接用PI控制D设为零。压力环同理压力信号噪声不大D也是零。很多教材必讲PID三要素但实际工业过程里能用PI就绝不用PID这句话我送给所有正在调试的朋友。第三个是恒温恒压互相干扰。最初双回路独立跑温度正常后压力也稳定但有一次补水泵变频器跳闸管网压力瞬间下降温度环居然也出现了明显波动。后来我把报警联锁和软解耦逻辑补上之后这类相互干扰几乎消失。再后来用了前馈温度环的响应速度明显加快负荷跳变时温度偏差从最开始的3摄氏度缩小到1.2摄氏度以内虽然还是有一点超调但现场完全能接受。我个人在实际操作中的体会是恒温恒压控制项目拼的往往不是控制算法的先进性而是对工艺对象的理解深度和现场调试的耐心。S7-1200的SCL编程和威纶通的画面设计都只是工具真正能把温度压力都稳稳压住的是你愿不愿意花时间在现场看波形、调参数、观察负荷变化规律。这套系统跑起来之后甲方操作员用得很顺手说最大的感受就是“不用天天盯着水泵和阀门了”。我想这也是我们做自动化改造最大的成就感来源。最后再提醒一句每一套系统的滞后时间和负荷特性都不一样本文的参数不能直接照搬但整定方法、程序框架和前馈加PI的思路在任何类似的冷却水项目里都可以复用。
返回列表