ARTICLE DETAIL

资讯详情

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

S7-1200 PID控制实战:从PID_Compact组态到参数整定与避坑指南

S7-1200 PID控制实战:从PID_Compact组态到参数整定与避坑指南 1. 从一台挤出机说起为什么PID在S7-1200上值得单独拎出来讲前阵子帮朋友处理一条挤出生产线的温控问题六区加热用的是西门子S7-1200 CPU 1214C。他原来的做法很朴素温度低于设定值就全功率加热到了就断。结果料筒温度像坐过山车上下波动十几度产品壁厚一会儿厚一会儿薄废品率居高不下。我到了现场只做了一件事——把加热输出从开关量改成PID闭环波动直接压到正负一度以内。这件事让我觉得PID这个东西虽然老但在S7-1200这类小型PLC上真正用对、调好的人并不多。很多人要么直接用系统自带的PID_Compact指令块参数全默认跑起来效果一般要么自己写一套位置式PID结果积分饱和、微分跳变问题一堆。所以这篇内容我打算把S7-1200上PID的用法从头到尾捋一遍包括指令块怎么选、参数怎么整定、常见坑怎么绕以及一些我在现场摸出来的经验。这篇适合谁看如果你手上有S7-1200需要做温度、压力、流量、液位或者速度的闭环控制不管是刚接触PID的新手还是用过但总觉得调不好的老手应该都能从里面找到点有用的东西。我会尽量少讲纯理论多讲在博途里到底怎么点、参数到底填多少、出了问题往哪查。先明确一个前提S7-1200做PID主流就两条路。一条是用博途自带的PID_Compact或者PID_3Step、PID_Temp指令块另一条是自己用SCL或者梯形图写PID算法。两条路各有适用场景后面会详细对比。先把结论放这儿绝大多数常规应用直接用PID_Compact就够了没必要自己造轮子。但前提是你得搞懂它那几个参数到底在干什么。2. PID_Compact指令块到底怎么用从组态到首次运行2.1 在博途里把PID_Compact拖出来之后先别急着下载很多人拿到PID_Compact第一反应是把块拖到程序里连上输入输出下载然后发现没反应或者输出乱跳。问题往往出在组态阶段没做对。正确的顺序是这样的先在工艺对象里添加一个PID控制对象。具体路径是项目树里找到CPU展开工艺对象双击新增对象选PID_Compact。这时候博途会弹出一个组态向导里面有几个关键设置控制器类型选温度、压力、流量还是通用这个选择会影响默认参数和单位。温度控制默认单位是摄氏度通用控制默认是百分比。输入输出范围比如温度输入是0到200度输出是0到100%。这个范围必须和你的实际传感器、执行器匹配填错了后面全乱。采样时间默认是100ms但温度控制通常用不到这么快1秒甚至2秒都行。采样太快反而容易把噪声放大。组态完成后博途会自动生成一个背景数据块里面包含了这个PID对象的所有参数。你在程序里调用PID_Compact时把这个背景数据块填进去就行。提示工艺对象和程序里的指令块是绑定的。如果你删了工艺对象程序里的块会报错。反过来如果你复制粘贴程序块但没复制工艺对象也会出问题。这一点在项目移植时特别容易踩坑。2.2 输入输出引脚的正确接法以及一个容易忽略的细节PID_Compact的引脚不多但每个都有讲究。我挑几个最容易出错的讲。Setpoint是设定值Input是反馈值。这两个值的量纲必须一致。比如你设定值是80度反馈值也必须是度不能一个用度一个用0到1的归一化值。博途里可以在工艺对象组态时统一设置。Output是输出值通常接到模拟量输出通道或者PWM输出。这里有个细节如果你的执行器是加热器输出0到100%对应0到全功率没问题。但如果是阀门可能输出4到20mA对应0到100%这时候你需要在Output后面加一个标定环节把0到100%映射到4到20mA对应的数值范围S7-1200模拟量输出通常是0到27648对应0到10V或4到20mA具体看模块。ManualEnable和ManualValue是手动模式用的。调试阶段我强烈建议先用手动模式给一个固定输出看看执行器能不能正常工作再切自动。很多人跳过这一步直接上自动结果执行器根本没接对PID输出再合理也没用。还有一个Reset引脚用来复位内部状态。当你的设定值发生大幅变化或者从手动切自动时最好给一个复位脉冲让PID从干净的状态开始。2.3 首次运行用预调节功能省掉一半的整定时间PID_Compact有一个很实用的功能叫预调节Pretuning。你不需要自己算Kp、Ki、Kd只要让系统跑一次预调节它会自动给出一组参数。操作方法是在工艺对象的调试界面里点击预调节按钮然后给设定值一个阶跃变化。PID_Compact会观察系统的响应自动计算参数。整个过程通常几分钟到十几分钟取决于系统的时间常数。但预调节不是万能的。它要求系统在调节期间相对稳定不能有大的外部扰动。比如温度控制预调节期间不能开门、不能加料。另外预调节给出的参数往往偏保守响应速度不是最快但稳定性好。如果你追求更快的响应可以在预调节基础上手动微调。我自己的习惯是先用预调节跑一组参数作为基准然后根据实际效果微调。微调的方向后面会讲。3. 参数整定Kp、Ki、Kd到底在调什么以及现场怎么下手3.1 用开车来理解三个参数比看公式管用PID的三个参数书上讲的是比例、积分、微分但很多人看完还是不知道调哪个。我用开车打个比方。Kp比例增益就像你踩油门的力度。误差越大你踩得越狠。Kp太小车加速慢到不了目标速度Kp太大一脚油门踩到底车冲过头再往回拉来回震荡。Ki积分时间就像你发现速度一直差一点于是慢慢补油门。它的作用是消除稳态误差。但Ki太强补过头了速度会超调然后来回晃。Ki太弱永远差那么一点。Kd微分时间就像你看到速度快接近目标了提前松油门防止冲过头。它能抑制超调但对噪声敏感。如果反馈信号有毛刺Kd会把毛刺放大输出乱跳。在PID_Compact里参数叫Gain、Ti、Td。注意Ti和Td是时间不是积分系数和微分系数。Ti越大积分作用越弱Td越大微分作用越强。这一点和有些PLC的命名习惯相反别搞混。3.2 一套我在现场常用的手动整定顺序预调节虽然方便但有些系统不适合跑预调节比如不允许大幅波动的场合。这时候就得手动整定。我的顺序是这样的先把Ti设得很大比如9999Td设为0相当于只有比例作用。从小到大慢慢加Gain直到系统开始出现轻微震荡然后往回退一点退到震荡刚好消失。这时候的比例增益大约是临界增益的60%到70%。逐渐减小Ti观察稳态误差是否消除。每次减小后等系统稳定再看。如果出现震荡就往回加一点。最后加Td一般从Ti的1/8到1/4开始试。如果反馈噪声大Td就设小一点甚至不设。这个顺序的核心逻辑是先保证稳定再追求精度最后优化动态响应。很多人一上来三个参数一起调根本分不清是哪个在起作用。3.3 不同被控对象参数风格完全不一样温度、压力、流量、液位这四类常见对象的PID参数风格差异很大。我整理了一个经验对照表注意这只是起点具体还要看设备特性。被控对象典型Gain范围典型Ti范围典型Td范围特点温度1.0 - 5.0100 - 500s10 - 50s大惯性大滞后积分要慢压力0.5 - 3.010 - 60s0 - 5s响应较快微分可小流量0.3 - 2.05 - 30s0快响应一般不用微分液位1.0 - 10.030 - 200s0积分为主比例可大温度控制是最典型的大惯性系统。加热丝通电到温度真正升上来可能几十秒甚至几分钟。这种系统如果积分太强会严重超调。我的经验是温度控制的Ti至少给100秒以上有些大料筒甚至给到500秒。流量控制则相反阀门一动流量立刻变响应很快。这种系统积分时间可以短一些微分基本不用因为流量信号本身噪声就大。3.4 输出限幅和积分抗饱和不设这两个参数迟早出事这是我最想强调的一点。PID输出必须限幅否则一旦反馈值长时间达不到设定值积分项会一直累积输出冲到远超实际需要的值。等反馈值终于上来了积分项已经积了一大坨输出降不下来系统严重超调。PID_Compact里有OutputUpperLimit和OutputLowerLimit两个参数一定要设。比如加热输出上限设100下限设0。如果是阀门上限设100下限设0对应4到20mA。积分抗饱和方面PID_Compact内部有抗饱和机制但前提是你把限幅设对了。如果你不设限幅内部机制也救不了。还有一个相关参数是OutputOffset用于输出偏置。比如阀门有死区0到5%不动作你可以把下限设成5让PID输出从5开始。4. 自己写PID算法什么时候值得什么时候纯属折腾4.1 位置式PID的SCL实现以及为什么我不推荐在1200上这么干有些人喜欢自己写PID觉得可控性更强。位置式PID的离散化公式大概是这样的Output Kp * Error Ki * Sum(Error) Kd * (Error - LastError)用SCL写出来大概是这样// 位置式PID简化实现 Error : Setpoint - Actual; Integral : Integral Error * SampleTime; Derivative : (Error - LastError) / SampleTime; Output : Kp * Error Ki * Integral Kd * Derivative; LastError : Error;看起来简单但实际用起来问题很多。首先是积分饱和你得自己加限幅逻辑。其次是微分跳变设定值一变Error突变微分项会瞬间冲很大。还有采样时间不固定、数据类型溢出等等。在S7-1200上CPU资源有限自己写的PID如果逻辑不严谨很容易出问题。而且PID_Compact已经帮你处理了抗饱和、无扰切换、手动自动切换这些细节自己写要花大量时间调试。除非你有非常特殊的需求比如变参数PID、模糊PID否则没必要自己写。4.2 增量式PID在什么场景下反而更合适增量式PID输出的是增量而不是绝对输出值。公式是DeltaOutput Kp * (Error - LastError) Ki * Error Kd * (Error - 2*LastError LastError2)它的好处是不需要累积积分项天然抗饱和。而且手动自动切换时因为输出是增量不会产生突变。增量式PID适合什么场景执行器本身带积分特性的比如步进电机、伺服电机的位置控制。你给一个增量电机走一步不需要知道绝对位置。另外如果系统需要频繁手动自动切换增量式也更平滑。但在S7-1200上如果你用增量式输出需要自己累加到一个绝对输出变量上再送给模拟量通道。这个累加过程也要限幅。所以省事程度并没有比位置式高多少。4.3 串级PID什么时候需要怎么在1200上搭串级PID是两个PID串起来外环的输出作为内环的设定值。典型应用是夹套温度控制外环控制反应釜内温输出作为内环夹套温度的设定值内环再控制加热阀门。串级的好处是内环能快速抑制扰动外环保证最终目标。比如夹套温度受冷却水影响波动内环能立刻响应不让扰动传到反应釜。在S7-1200上搭串级就是调用两个PID_Compact实例外环的Output接到内环的Setpoint。注意两个环的采样时间要匹配内环通常比外环快5到10倍。另外外环的输出限幅要设成内环设定值的合理范围。串级调试的顺序是先投内环调好再投外环外环的Ti要比内环大很多否则两个环会互相打架。5. 那些让我熬夜排查的坑从输出不动到疯狂震荡5.1 输出一直是0或者一直是100先查这三个地方PID输出不动最常见的原因有三个。第一反馈值没进来。检查Input引脚是不是一直是0或者一个固定值。如果是说明模拟量输入通道没组态对或者传感器接线有问题。S7-1200的模拟量输入模块需要组态测量类型和范围比如0到10V还是4到20mA组态错了读上来的值就是错的。第二工艺对象没使能。PID_Compact有一个Setpoint和Input但还需要一个Enable信号。如果你没给Enable块根本不工作。有些人以为下载了程序就自动运行其实不是。第三输出限幅设反了。比如上限设0下限设100输出永远卡在0。这个错误很低级但真的有人犯。5.2 系统震荡得厉害先分清是比例震荡还是积分震荡震荡是PID调试中最常见的问题。但震荡也分类型处理方式不一样。比例震荡的特征是输出和反馈值以固定频率来回摆摆幅基本不变。原因是Gain太大。处理方法是减小Gain或者增大Ti来缓和。积分震荡的特征是反馈值缓慢上升超过设定值后缓慢下降周期很长。原因是Ti太小积分作用太强。处理方法是增大Ti。微分震荡的特征是输出高频抖动反馈值看起来有很多毛刺。原因是Td太大或者反馈信号噪声大。处理方法是减小Td或者在Input前面加一个滤波。PID_Compact里有一个InputFilter参数可以给反馈值加一阶滤波。温度信号通常需要滤波流量信号也需要。但滤波太强会引入滞后影响响应速度要权衡。5.3 手动切自动时输出跳变问题出在无扰切换没做好手动模式下你给一个固定输出系统稳定在某个状态。切到自动时如果PID计算的输出和手动输出差很多执行器会突然跳变。这就是有扰切换。PID_Compact支持无扰切换但需要正确使用。关键是在切换前让PID的内部积分项跟踪当前手动输出。PID_Compact有一个ManualValue引脚手动模式下把输出值写进去切自动时它会从这个值开始不会跳变。具体操作是手动模式下ManualEnable给1ManualValue给当前想要的输出值。切自动时先把ManualEnable给0同时保持ManualValue不变PID会平滑接管。注意如果你在手动模式下没有给ManualValue或者给的值和实际输出不一致切换时还是会跳。这个细节在文档里写得不明显但现场很关键。5.4 采样时间和程序循环周期不匹配导致参数怎么调都不对PID_Compact的采样时间是在工艺对象里设的但实际执行周期取决于你的程序调用周期。如果你把PID_Compact放在一个OB1里而OB1的循环周期是变化的比如几十毫秒到几百毫秒不等PID的实际采样时间就不固定。解决办法是把PID_Compact放在一个循环中断OB里比如OB30设置固定的循环时间比如100ms。这样PID的采样时间就固定了参数整定才有意义。这一点很多人忽略。他们发现PID怎么调都不稳最后查出来是采样时间在飘。特别是当程序里还有其他耗时操作时OB1的周期波动很大。6. 让PID跑得更稳的几个工程习惯6.1 反馈信号的质量决定PID的上限再好的PID算法如果反馈信号本身噪声大、滞后大也调不出好效果。我在现场遇到PID调不好的情况有一半以上是反馈信号的问题。温度传感器要选响应时间匹配的。热电偶响应快但精度低热电阻精度高但响应慢。如果控制精度要求高用热电阻但PID参数要相应调整因为滞后大了。模拟量信号要屏蔽接地远离动力线。S7-1200的模拟量模块对干扰比较敏感信号线一定要用屏蔽双绞线屏蔽层单端接地。如果信号实在噪声大除了PID_Compact自带的InputFilter还可以在程序里自己做滑动平均滤波。但滤波会引入滞后要权衡。6.2 输出限幅不只是保护执行器也是保护PID自己前面提过输出限幅这里再强调一下它的另一个作用限制积分饱和的幅度。限幅设得越紧积分项能累积的范围越小超调就越小。但限幅太紧会影响调节能力比如加热功率本来需要80%你限到50%永远达不到设定值。我的经验是上限设成实际需要的最大值的110%到120%下限设成0或者执行器的最小动作值。比如加热正常需要70%上限设80%到85%就够了。6.3 用趋势图观察PID行为比看数值直观十倍博途的工艺对象调试界面自带趋势图能看到设定值、反馈值、输出值三条曲线。调试时一定要打开这个图比盯着数值看有效得多。从趋势图上你能一眼看出是超调了还是没到位是震荡还是响应慢是输出饱和了还是反馈滞后。我调PID的时候基本上就是看着趋势图微调一个参数等几个周期再看效果。如果博途的趋势图不够用可以在HMI上做一个简单的趋势控件把关键变量传上去。现场调试时HMI比电脑方便。6.4 保存好每一组调好的参数下次直接复用同一型号的设备PID参数往往可以直接复用。我习惯在项目里建一个参数记录表把每台设备的Gain、Ti、Td、采样时间、限幅值都记下来。下次遇到同类设备直接填进去再微调一下就行省大量时间。如果设备差异大至少可以把参数作为起点。比如同样是挤出机温控六区和四区的参数可能不同但同一区的参数在不同机器上通常接近。7. 从PID到更复杂的控制什么时候该考虑升级方案7.1 模糊PID和自适应PID在1200上能不能跑有些工况下固定参数的PID效果有限。比如系统在不同负载下特性变化很大一组参数顾此失彼。这时候可以考虑模糊PID或者自适应PID。模糊PID的思路是根据误差和误差变化率动态调整Kp、Ki、Kd。在S7-1200上可以用SCL实现一个简单的模糊查表根据误差大小切换几组参数。比如误差大时用大Kp快速响应误差小时用小Kp防止超调。自适应PID更复杂需要在线辨识系统特性。在1200这种小型PLC上跑完整的自适应算法比较吃力但简单的增益调度Gain Scheduling是可行的。就是根据工况切换参数组本质上还是几组固定参数。我的建议是先用好固定参数PID确实遇到瓶颈再考虑这些。很多所谓PID调不好的问题其实是反馈信号或者执行器的问题换算法也解决不了。7.2 PID_Temp和PID_3Step特殊场景的专用块除了PID_Compact博途还提供PID_Temp和PID_3Step。PID_Temp专门针对温度控制支持加热和冷却双输出还支持死区控制。如果你的应用是加热冷却一体比如注塑机料筒用PID_Temp比PID_Compact方便。PID_3Step用于三步控制比如电动阀门的正转、反转、停。它输出的是三个开关量而不是模拟量。这种块适合阀门控制内部有位置反馈处理。选哪个块取决于你的执行器类型。模拟量输出用PID_Compact加热冷却用PID_Temp电动阀门用PID_3Step。选对了块能省很多自己搭逻辑的时间。7.3 多回路控制时1200的资源怎么分配S7-1200的CPU资源有限做多回路PID时要注意。CPU 1214C同时跑4到6个PID_Compact实例问题不大但再多就要考虑CPU 1215或1217了。每个PID_Compact实例都会占用一定的内存和运算时间。如果采样时间设得很短比如10msCPU负担会明显增加。温度控制用1秒采样完全够没必要设太快。另外多个PID回路如果放在同一个循环中断OB里要注意总执行时间不能超过OB的循环时间。比如OB30设100ms里面放了6个PID每个执行10ms总共60ms还行。如果超过100msOB就会溢出导致CPU报错。8. 写在最后PID调试没有捷径但有方法PID这个东西理论公式就那么几行但真正调好需要经验。我自己的体会是先把反馈信号和执行器搞扎实再用预调节跑一组基准参数然后根据趋势图微调最后把参数记录下来。这个流程走下来大部分应用都能搞定。另外别迷信最优参数。PID参数没有绝对的最优只有适合当前工况的。同一台设备夏天和冬天可能需要不同的参数。所以调好的参数要留有余地不要卡得太死。如果你在S7-1200上做PID遇到了奇怪的问题先查三件事反馈值对不对、采样时间稳不稳、输出限幅设没设。这三件事查完大部分问题都能定位。剩下的就是耐心调参数了。
返回列表