1. 水箱液位控制到底难在哪:先搞清楚被控对象的脾气
水箱液位控制是过程控制里最经典的入门场景,也是最能暴露问题的场景。很多人第一次用S7-1200做PID,代码写完了、块也调用了,结果要么液位一直在设定值附近来回振荡,要么响应慢得像蜗牛爬,要么阀门频繁动作导致执行机构提前报废。问题往往不在PID指令本身,而在于没有先搞清楚被控对象的动态特性。
水箱液位系统本质上是一个一阶惯性加纯滞后的对象。进水阀开度变化后,液位不会立刻响应,中间存在管道传输延迟和容积滞后。这个滞后时间决定了PID参数能调多激进。如果滞后大而积分作用强,系统必然振荡;如果滞后小但比例增益太低,响应又会拖沓。所以调PID之前,先做一次阶跃响应测试,记录液位从稳定到新稳定的过渡曲线,比盲目试参数高效得多。
S7-1200在博图V18中提供了PID_Compact指令,这是目前S7-1200系列最推荐的PID功能块。它支持自整定、手动/自动无扰切换、抗积分饱和,还能通过工艺对象进行组态。相比老式的PID_Compact早期版本,V18版本在自整定算法和诊断功能上有明显改进。选它而不是自己写PID逻辑,核心原因是:自整定能省掉大量试参时间,诊断功能能在出问题时告诉你哪里不对。
这个内容适合三类人:一是刚接触S7-1200 PID的自动化工程师,二是需要快速交付水箱/水池类控制项目的现场调试人员,三是想从S7-200 SMART迁移到S7-1200平台的老手。不管你是哪一类,下面的步骤和参数逻辑都能直接拿去用。
注意:博图V18安装后如果找不到许可证,先检查Automation License Manager服务是否启动,再确认授权是否已传送到本地硬盘。仿真无法启动的情况,多数是PLCSIM V18没有和博图版本匹配安装。
2. 博图V18里的PID组态:从工艺对象到指令调用
2.1 为什么必须用工艺对象而不是直接调指令
PID_Compact在博图里有两种用法:一种是直接在主程序里调用指令并手动填写参数,另一种是先创建一个PID工艺对象,再在程序里调用该对象。强烈建议用工艺对象方式,原因有三个。
第一,工艺对象把参数存储在独立的DB块里,下载程序时不会因为OB块重新初始化而丢失调好的参数。第二,工艺对象支持在线自整定,自整定过程中博图会弹出曲线窗口,能直观看到整定进度和效果。第三,工艺对象自带诊断功能,当输入输出超出量程或参数不合理时,会在博图诊断缓冲区里给出明确提示,而不是让程序默默跑飞。
创建工艺对象的路径是:项目树中打开CPU文件夹,双击“工艺对象”,在弹出的对话框中点击“新增对象”,选择“PID控制”,命名为PID_TankLevel。命名建议带上被控变量名,后期维护时一眼就能看出这个PID是管什么的。
2.2 输入输出参数的量程匹配:最容易埋雷的地方
工艺对象创建后,第一件事是配置输入和输出参数。这里有一个非常容易出错的点:过程值量程和输出量程必须与实际传感器和执行器匹配。
假设液位变送器是4-20mA输出,对应量程0-2000mm。在博图中,Input_PER引脚需要连接经过NORM_X和SCALE_X转换后的实际工程量,或者直接使用Input引脚输入工程量数值。如果使用Input_PER,则需要在工艺对象组态中设置过程值上下限为0和2000,单位选mm。如果使用Input,则程序里直接给工程量,工艺对象里设置同样的上下限。
输出方面,如果控制的是比例阀,输出4-20mA对应0-100%开度,那么输出量程设为0-100,单位%。如果控制的是开关阀加占空比调节,输出量程设为0-100,但执行机构需要把百分比转换成PWM占空比。
实操心得:我见过太多人把过程值上下限设成0-27648,结果PID输出一直在极端值附近打转。原因是输入没有做量程转换,PID以为液位一直在满量程附近。记住,工艺对象里的过程值上下限是工程量,不是原始AD值。
2.3 采样时间与PID运算周期的关系
PID_Compact的采样时间SampleTime决定了PID算法多久执行一次。这个值不是随便填的,它和OB块的循环周期有直接关系。
如果PID_Compact放在OB1中调用,采样时间应设置为OB1的循环周期,通常设为100ms。如果放在循环中断OB30中调用,采样时间就是OB30的设定周期,比如200ms。采样时间必须大于等于实际调用周期,否则PID会报错。
为什么采样时间不能太小?因为液位系统的滞后时间通常在秒级甚至十秒级,采样时间设成10ms没有意义,反而增加CPU负担。一般经验是:采样时间取滞后时间的十分之一到二十分之一。如果阶跃响应测试得到滞后时间约5秒,采样时间设200-500ms都合理。
3. 三步搞定PID参数整定:从自整定到手动微调
3.1 第一步:预调节自整定,让系统先稳下来
博图V18的PID_Compact支持两种自整定模式:预调节和精确调节。预调节用于系统从未稳定状态开始,精确调节用于系统已经在设定值附近但需要优化动态性能。
启动预调节的步骤:在工艺对象的调试窗口中,点击“启动预调节”按钮。此时PID会输出一个阶跃信号,观察液位响应。预调节过程中,PID会自动计算出一组参数,包括比例增益、积分时间、微分时间。整个过程通常持续几分钟,取决于系统滞后大小。
预调节成功的标志是:调试窗口显示“预调节完成”,并且给出的参数能让液位稳定在设定值附近,超调量在可接受范围内。如果预调节失败,常见原因是:过程值没有变化(检查传感器和执行器)、输出达到限幅(检查阀门是否卡死)、噪声太大(检查信号屏蔽和滤波)。
注意:预调节期间不要手动干预输出,也不要切换手动模式,否则自整定会中断。如果系统不允许阶跃扰动,比如某些不允许液位大幅波动的场合,预调节可能不适用,需要改用手动整定。
3.2 第二步:精确调节优化动态响应
预调节完成后,如果发现响应还是偏慢或者超调偏大,可以启动精确调节。精确调节会在设定值附近施加小幅度扰动,进一步优化参数。
精确调节的前提是系统已经稳定在设定值附近,且过程值波动不超过设定值的5%。启动后,PID会尝试不同的参数组合,找到使误差平方积分最小的那组。这个过程比预调节快,通常几十秒到几分钟。
精确调节完成后,PID参数会自动更新。此时可以观察液位曲线,如果超调量小于5%、调节时间在可接受范围内,就可以进入下一步。如果仍然不理想,说明被控对象特性太特殊,需要手动微调。
3.3 第三步:手动微调,解决自整定搞不定的问题
自整定不是万能的。有些系统因为非线性、死区、阀门特性差等原因,自整定给出的参数只能算“能用”,离“好用”还有距离。这时候需要手动微调。
手动微调的核心逻辑是:先调比例,再调积分,最后调微分。比例增益决定响应速度,积分时间决定消除静差的速度,微分时间决定抑制超调的能力。
具体操作:把积分时间设得很大(比如9999秒),微分时间设0,然后逐步增大比例增益,直到液位开始出现小幅等幅振荡。此时的比例增益记为Kp_critical,振荡周期记为T_critical。然后按经验公式:比例增益取0.6 * Kp_critical,积分时间取0.5 * T_critical,微分时间取0.125 * T_critical。这组参数通常能给出较好的动态响应。
如果系统不允许振荡,那就用保守法:比例增益从自整定值的一半开始,逐步增加,每次增加后观察一个完整调节周期,直到响应速度满足要求但超调不超过10%。积分时间从自整定值的两倍开始,逐步减小,直到静差在可接受时间内消除。
实操心得:液位系统的微分作用通常不需要太强,因为液位信号本身可能有噪声,微分会放大噪声。如果传感器信号波动大,建议微分时间设0,只用PI控制。我调试过的大多数水箱液位系统,PI控制已经足够,加微分反而让阀门动作更频繁。
4. 程序调用与手动/自动切换的工程细节
4.1 PID_Compact的调用位置和周期
PID_Compact必须放在循环中断OB中调用,而不是OB1。原因是OB1的循环周期不固定,受程序扫描时间影响,会导致PID采样时间抖动。循环中断OB30的周期是固定的,比如100ms或200ms,这样PID运算周期稳定,参数才有意义。
在OB30中调用PID_Compact时,需要把工艺对象的背景DB作为参数传入。调用格式如下:
"CALL PID_Compact_DB"( Setpoint := "HMI_Setpoint", Input := "Level_Actual", Output => "Valve_Output", ManualEnable := "Manual_Mode", ManualValue := "Manual_Output_Value", Reset := "PID_Reset", ModeActivate := "Mode_Switch" );其中Setpoint是设定值,Input是过程值,Output是输出值。ManualEnable为TRUE时进入手动模式,ManualValue是手动输出值。ModeActivate用于切换自动/手动模式。
4.2 无扰切换的实现逻辑
手动切自动时,如果PID输出和手动输出不一致,切换瞬间会产生扰动。PID_Compact内部有输出跟踪功能,但需要正确配置。
在工艺对象的组态中,勾选“手动模式时输出跟踪”选项。这样在手动模式下,PID内部积分器会跟踪手动输出值,切换回自动时输出不会跳变。如果没有勾选这个选项,切换瞬间PID会从积分器当前值开始输出,可能和手动值差很远。
注意:无扰切换的前提是手动模式下PID仍在调用。如果手动模式下停止调用
PID_Compact,积分器状态不更新,切换时照样有扰动。所以即使手动模式,也要保持OB30中调用PID指令。
4.3 输出限幅和抗积分饱和
水箱液位控制中,阀门开度有物理限制,比如0-100%。如果PID输出超过100%,阀门已经全开但液位还没到设定值,积分器会继续累积,导致超调。这就是积分饱和。
PID_Compact自带抗积分饱和功能,但需要在工艺对象中设置输出上下限。设置输出上限为100,下限为0。当输出达到限幅时,PID会自动停止积分累积。如果没设限幅,抗饱和功能不生效。
另外,如果阀门有最小开度限制,比如低于10%时阀门实际关闭,那么输出下限应设为10,避免PID在0-10%区间无效调节。
5. 常见问题排查与现场调试避坑指南
5.1 PID输出不动或一直满输出
这是现场最常见的问题。排查顺序如下:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 输出一直0 | 过程值大于设定值,且PID方向反了 | 检查工艺对象中“输出方向”设置,液位控制通常选“反向” |
| 输出一直100 | 过程值小于设定值,且PID方向反了 | 同上,或检查设定值是否合理 |
| 输出不动 | PID未使能或处于手动模式 | 检查ManualEnable和ModeActivate引脚状态 |
| 输出不动 | 采样时间设置错误 | 检查SampleTime是否大于OB30周期 |
| 输出跳变 | 输入信号噪声大 | 增加输入滤波,或在PID前加一阶滤波 |
方向设置是新手最容易忽略的。液位控制中,液位低于设定值需要开大阀门,所以输出应随误差增大而增大,对应“反向”作用。如果设成“正向”,液位越低输出越小,系统直接跑飞。
5.2 液位振荡不止
振荡的原因通常有三个:比例增益太大、积分时间太小、滞后时间太大但PID参数太激进。
排查方法:先把积分时间设大、微分设0,只留比例作用。如果仍然振荡,说明比例增益太大,逐步减小直到振荡消失。然后逐步减小积分时间,直到静差消除但振荡不出现。如果系统滞后特别大,比如液位响应滞后超过30秒,那PID参数必须非常保守,或者考虑串级控制。
实操心得:我遇到过一个大水箱,滞后时间接近1分钟,自整定给出的参数仍然振荡。后来把比例增益降到自整定值的三分之一,积分时间加到三倍,系统才稳定。滞后大的系统,宁可慢一点,也不要追求快速响应。
5.3 博图V18仿真无法启动或PID不运行
仿真环境下PID不运行,常见原因有两个:一是PLCSIM没有正确安装或版本不匹配,二是工艺对象在仿真中不支持某些功能。
博图V18对应的PLCSIM版本是V18,如果装了V17的PLCSIM,仿真启动会报错。另外,PID_Compact在仿真中支持基本功能,但自整定功能在仿真中可能无法正常执行,因为仿真环境的扫描周期和真实CPU有差异。建议自整定在真实CPU上做,仿真只用来验证逻辑。
如果仿真中PID输出一直是0,检查OB30是否在仿真中正常运行。有些情况下,仿真启动后OB30没有自动启用,需要手动触发一次。
5.4 常见问题速查表
| 问题 | 快速排查 | 解决 |
|---|---|---|
| PID输出反向 | 检查输出方向 | 改为反向 |
| 输出跳变 | 检查输入滤波 | 增加滤波或屏蔽 |
| 静差消不掉 | 检查积分时间 | 减小积分时间 |
| 超调大 | 检查微分和比例 | 增大微分或减小比例 |
| 阀门频繁动作 | 检查微分和采样时间 | 减小微分,增大采样时间 |
| 自整定失败 | 检查过程值变化 | 确认传感器和执行器正常 |
| 仿真PID不动 | 检查OB30和PLCSIM版本 | 更新PLCSIM,手动触发OB30 |
6. 从水箱液位延伸到更复杂的PID应用
水箱液位控制跑通之后,这套方法可以迁移到很多类似场景。比如温度控制,被控对象也是大惯性加滞后,PID参数整定逻辑几乎一样,只是温度系统的滞后通常更大,积分时间要设得更长。流量控制则相反,响应快、滞后小,比例增益可以设大一些,积分时间可以短一些。
如果液位系统有多个水箱串联,或者进水流量本身波动大,单回路PID可能不够用。这时候可以考虑串级控制:主PID控制液位,输出作为副PID的设定值,副PID控制进水流量。串级控制能有效抑制流量波动对液位的影响。S7-1200支持多个PID_Compact实例,串级控制只需要调用两个工艺对象,把主PID的输出连接到副PID的设定值即可。
前馈控制也是液位系统常用的补充手段。如果知道进水流量会突变,比如上游泵启动,可以在PID输出上叠加一个前馈量,提前补偿扰动。前馈量可以通过实验确定:记录泵启动后液位的变化趋势,反推出需要的阀门开度补偿值。前馈加PID,能显著减小扰动引起的液位波动。
我个人在实际调试中的体会是:PID参数没有绝对的最优,只有针对特定系统的最合适。同一套参数,换一个水箱、换一个阀门,可能就要重新整定。所以与其死记参数,不如掌握整定方法和排查思路。自整定能帮你快速找到起点,但最终效果还是要靠现场微调。另外,信号质量比PID参数更重要,传感器噪声大、信号漂移,再好的PID也调不出稳定曲线。先把信号做干净,再调PID,事半功倍。