1. 做恒温控制,为什么我盯上了PID_Temp这条工艺指令
做工业自动化这些年,温控项目几乎每个工程师都会碰到。从塑料挤出机的料筒加热,到烘箱、干燥罐、反应釜,再到实验室的小型恒温槽,场景千千万万,但控制逻辑就一句话:让实际温度稳稳咬住设定温度。以前我用S7-200 SMART或S7-300做温控,PID得自己拼PID_FB、自己写抗积分饱和,稍微没处理干净,温度就给你荡秋千——超调、振荡、稳态误差轮着来。后来换到S7-1200 + 博途(TIA Portal),发现系统自带的PID_Temp工艺指令,简直是把温控这条路给铺平了。
PID_Temp是S7-1200(也包括S7-1500)里专门针对温度控制场景封装的PID工艺指令。它和通用的PID_Compact是两兄弟,但PID_Temp内部预设了温度控制的特殊逻辑,比如对加热和冷却双向控制的支持、针对大惯性对象的参数预置、输出PWM波形直接驱动固态继电器等。换句话说,你用一条指令,就省掉了过去用PID_Compact还要自己折腾输出限幅、反作用、PWM转换那一堆外围程序。
这篇博文就围绕我最近做的一套小型恒温循环系统来写,核心是S7-1200 PLC + PID_Temp指令搞定一个带加热和搅拌的恒温水浴控制。我会把从选型、组态、参数整定到现场调试踩坑的记录全部摊开讲,适合正在用S7-1200做温控但还不太熟悉PID_Temp的电气工程师、调试人员,也适合想了解博途PID工艺指令怎么用的自动化专业学生。内容全是实操层面的东西,没有那种"官方手册复读机"的废话。
2. 项目需求与方案选型:恒温系统要控的是什么
2.1 控制对象与控制要求拆解
这套设备的工艺需求很简单:一个带夹套的储水罐,罐内用电加热管加热,搅拌电机保持水温均匀,出水口和回水口接到外部换热器,形成一个闭式循环。工艺要求出水温度稳定在设定值正负0.5度以内。用户操作人员可以在触摸屏上直接修改设定温度,比如做实验时把温度从40度改到85度,系统需要尽快跟上,又不能出现大幅超调。
可能有人觉得正负0.5度很容易,但真做起来有几个难点。第一,加热管功率相对水体容积来说裕量很大,属于典型的"大滞后、大惯性"对象,温度刚到设定值附近时加热管余热还会继续推高温度。第二,搅拌和循环泵一直在搅动水体,温度传感器测到的值是动态波动的,如果PID参数和采样周期不合适,输出会来回抽搐,温度就是在设定值附近画波浪线。第三,工艺要求常年连续运行,不能三天两头因为参数失配就去现场重新整定。这些约束决定了控制器必须具备良好的抗积分饱和能力和较强的适应性,而这正是PID_Temp的设计目标。
将台达VFD-M变频器接在CM5的S1端子上。在接线完成后,通过变频器面板设定运行频率为40Hz,启动变频器,观察电机是否按照设定频率运转。如果接线和参数无误,电机应该平稳运行在40Hz。
这里有个很容易弄混的点,就是我们控制的是"水温",不是"加热管表面温度"或者"夹套温度"。所以温度传感器必须安装在水流最代表性的位置,一般选在出水口附近,而且探头插入深度要足够。上一个项目里,我把PT100装在回水管路的死角位置,结果测出来的温度滞后了至少30秒,PID怎么整都调不好,后来把探头挪到出水管路中间位置,问题立刻缓解。这个细节后面还会细说。
2.2 为什么选PID_Temp而不是PID_Compact
这是方案设计阶段想得比较久的一个问题。S7-1200里面PID_Compact也能做温控,两条指令都是博途自带的PID工艺对象。但从我实测效果和使用体验来看,PID_Temp有几个明显优势。
第一,PID_Temp内部针对温度对象做了专门的预配置。它默认使用带抗积分饱和处理的PI算法,而且对微分项做了更保守的处理。温度系统本身的滞后很大,如果微分作用太强,一有扰动输出的波动反而更剧烈,PID_Temp在这一点上比PID_Compact"温顺"得多。第二,PID_Temp天然支持加热和冷却两种输出,如果你现场有加热器也有冷却阀,一条指令就能同时处理两个方向的控制,不必像用PID_Compact时那样自己做输出分离。第三,PID_Temp内部直接集成了PWM输出功能,可以设定PWM周期,直接在指令输出端挂一个固态继电器或接触器,不需要额外写脉宽调制程序。
当然,PID_Compact也不是不能用。如果你的控制对象是流量、压力这种惯性较小的物理量,或者你需要工作在纯手动模式做精确开度控制,PID_Compact会更灵活。从官方文档来看,PID_Temp适用的领域描述就是"温度控制",选型思路很清楚。
2.3 系统硬件选型清单
这套系统的硬件配置如下,我测试过好几种组合,直接给出一套稳定可靠的方案。
| 部件 | 型号/规格 | 说明 |
|---|---|---|
| CPU | S7-1200 CPU 1214C DC/DC/DC | 6ES7 214-1AG40-0XB0,性价比高,IO点数够用 |
| 温度采集 | SM1231 AI 4xRTD(6ES7 231-5PD30-0XB0) | 直接接PT100,精度够了,不需要额外变送器 |
| 加热执行 | 固态继电器SSR + 加热管 | 3kW加热管,SSR控制220V通断 |
| 人机界面 | KTP700 Basic PN | 博途直接组态,省事 |
| 通信 | CPU集成PN口 | 与HMI、编程器通信 |
这里面有个选型要点值得单独说:温度模块选RTD还是热电偶。PT100在常温到150度范围内线性度不错、抗干扰能力也强,所以优先选RTD。热电偶适合测量几百度甚至上千度的场景,但冷端补偿和线性化处理比较麻烦。如果只能选热电偶,那PID_Temp的输入处理也没问题,只是模块量程和滤波参数要重新设置。
3. 博途组态与PID_Temp指令的基本配置
3.1 硬件组态和模块地址分配
这部分是纯操作层面的东西,但很多初学者在这里就被卡住了。首先在博途里新建项目,添加S7-1200 CPU,然后在硬件目录里找到SM1231 RTD模块,拖到CPU右侧的插槽位置。编译之后,模块的输入地址会自动分配,我这里是IW64和IW66,不过要记住,这个地址是模块起始地址,具体通道地址是IW64、IW66这样依次排。如果后面程序里模拟量模块地址改了,记得回到设备组态里看地址分配,别写死地址。
RTD模块接PT100,一般三线制接法。模块侧A+、B+、B-分别接传感器对应线,屏蔽层单端接地。线路过长时建议用屏蔽双绞线。上电后先不做任何PID配置,直接在"设备组态 > 模块参数"里把测量范围设成PT100,确认模块"输入滤波器"的数值,一般默认50Hz工频干扰抑制就行。
3.2 添加PID_Temp指令对象
在博途的OB1循环组织块里,从右侧指令列表的"指令 > 工艺 > PID"文件夹里能找到PID_Temp,拖拽到程序段,它会提示你自动生成背景DB。这个背景DB很重要,PID_Temp的全部参数(设定值、过程值、PID参数、输出值、状态字等)都在这个DB里,建议给它起个有意义的名字,比如"PID_温度控制_DB"。
然后在PID_Temp指令的接口上连接变量。指令的输入输出引脚看起来比普通功能块多,但关键就这么几个:
- Setpoint:设定值。变量类型REAL,单位是物理量。比如设定温度80,就连接一个HMI写入的REAL变量,也可以直接在程序里赋值。
- Input:过程值输入,REAL类型,接实际温度值。这里要注意,PID_Temp的Input引脚默认接受的是物理量数值,不是原始码。所以从SM1231读回来的原始整数需要先做一次归一化转换成实际温度值,或者直接把模块的量程转换逻辑和Input对接。新版博途里PID_Temp会识别Input_PER,如果你连接的是IW64这种外围I/O地址,它会自动按标准值转换处理。但我个人建议还是自己显式转换一次,把PT100的量程和工程量对应关系写清楚,方便查问题。
- Output:控制器输出,REAL类型,0到100之间的百分比数值。
- 引脚上还有Reset、ManualEnable、ManualValue、Error、State等,后面调试会用到。
3.3 水管里的空气怎么排:PWM输出配置
PID_Temp输出是0~100的连续百分比,但实际执行机构可能是接触器或SSR,只有通和断两个状态。所以关键的一步是在PID_Temp指令的组态里启用PWM输出,设置一个合适的PWM周期。
PWM周期的选择有很多学问。如果周期太短,比如1秒或更短,固态继电器频繁通断,虽然后期温度控制精度高,但继电器寿命会受影响,还会对电网造成谐波干扰。如果周期太长,比如30秒甚至60秒,温度波动会很明显,因为加热功率是以"通一会儿、断一会儿"的平均功率来施加的,周期越长,等效热量的纹波越大。
我实测下来,SSR驱动加热管时PWM周期设成2~5秒比较理想,接触器驱动时建议10~20秒。具体值要根据系统的热惯性和传感器位置来微调。快速系统的PWM周期要短,滞后大的系统可以稍微长一点,只要温度波动控制在允许范围内就行。
在PID_Temp组态界面里,输出部分可以选"PWM"类型,填上周期时间。此时Output就不再是模拟量输出,而是一个0~100的PWM占空比信号,实际输出在指令的某个输出引脚上以BOOL量形式给出,直接驱动线圈/SSR。
3.4 关于采样周期和滤波的正确姿势
物极必反,参数也不是越短越好。温度对象是大惯性系统,如果采样周期设为10ms,程序倒是跑得飞快,但PID在每个扫描周期里看到的温度变化几乎为零,微分项基本没用,而积分项又因为长期累积可能会导致输出饱和。一般温度控制的采样周期建议设在500ms到2s之间。S7-1200的PID_Temp有自己的采样时间参数,在组态里可以设置,和OB1的扫描周期是独立的。我的做法是在OB1里用定时中断OB,每1秒调用一次PID_Temp指令,这样采样周期就是稳定的1秒,不受OB1主循环扫描时间波动影响。
传感器滤波这一块也提一句。SM1231 RTD模块自带数字滤波功能,默认值可能是4或8,对应50Hz抑制次数。如果现场干扰不大,滤波设成4就够了。滤波越大,信号越平滑,但滞后越严重。温度PID最怕的就是"假平滑真滞后",宁可有一点微小波动,也不要为了曲线好看而把滤波拉到最大。
4. 参数整定实战:从自整定到手动精调
4.1 自动整定的前置条件
PID_Temp支持在博途的调试面板里做自动整定。自动整定并不是万能的,前置条件没做好,整出来也是垃圾参数。我的建议是,第一次做自动整定先把以下条件准备好。
第一,确认系统处于安全的、可被激励的状态。就是说,加热管能正常投切,冷却(如果有)也能正常动作,传感器读数正常。第二,把温度设定值设在工作点附近。比如工艺常用温度80度,就用80度作为自整定的目标设定值。第三,把PID_Temp的Output限幅先设成0~100,别把输出卡太死,给自整定足够的激励空间。
自整定的原理是让输出做阶跃变化,观察温度响应曲线,然后根据响应特性识别出一阶或二阶模型,进而计算PID参数。所以如果系统正在其他模式下运行,或者温度不稳,整定结果不可信。
4.2 博途调试面板里的自整定步骤
在博途的工艺对象视图里打开PID_Temp,左侧导航有"调节"面板。面板上有一个"启动自整定"按钮,点击后按下启动,控制器会自动进入整定流程。工艺流程大致分三步:
- 输出激励阶段:控制器的输出会在一定范围内变化,通常是设定值附近做正负阶跃激励。此时你会看到实际温度开始周期性波动,不要干预它,等它自己跑完。
- 模型辨识阶段:内部根据温度变化率、时间滞后等信息计算出被控对象的近似模型参数,然后基于这些参数算出PID值。
- 参数写入阶段:整定完成后,面板上会出现新的Gain、积分时间、微分时间等参数,可以选择是否写入到背景DB中。
自整定过程一般需要几分钟到十几分钟不等。刚启动整定时,我建议把HMI的自动运行模式断开,让PID_Temp自己控制输出。如果整定中途被手动切换打断,结果很容易作废。
4.3 手动整定的经验口诀
自整定对大多数简单温控系统足够用了,但对一些特殊系统(比如热容特别大、响应特别慢),自动整定给出的参数不一定是最优的。这时候就要手动微调三个核心参数:比例增益Gain、积分时间TI、微分时间TD。
我的经验口诀是:先比例,再积分,微分看着办。具体操作是把积分时间设成一个比较大的值(比如300秒),微分时间设为0,只用纯比例控制,然后逐渐加大Gain,观察温度响应。当Gain足够大时你会看到温度开始等幅振荡,此时记录下振荡周期。然后Gain乘以0.5左右作为工作增益,积分时间设在振荡周期的0.5倍左右。这就是经典的Ziegler-Nichols整定法思路。
PID_Temp里的参数名称不完全等同于传统PID,你在组态里看到的是Gain(增益)、TI(积分时间)、TD(微分时间),单位分别是秒。温度控制一般很少用微分,大多数情况下PI就够了。如果温度曲线开始抖动,优先减小Gain,而不是去动微分。温度系统的噪声会让微分项放大干扰,这是我调试中反复确认过的事情。
4.4 抗积分饱和和输出限幅
PID算法里有个隐藏杀手就是积分饱和。比如刚开机时,设定温度是80度,实际温度只有15度,偏差很大,积分项拼命累积,输出到100。等实际温度慢慢追上来接近80度时,积分项已经积累了很大的值,此时控制器还继续输出100%加热,等到温度超过设定值后再反过来减输出,超调就已经发生了。
PID_Temp内置的抗积分饱和逻辑可以缓解这个问题,它会把积分项限制在输出限幅对应的范围内。但这里有个操作上的坑:一定要在指令组态里把输出限幅的上下限设置正确。如果系统只有加热没有冷却,上限设为100,下限可以设为0。如果加热和冷却都有,那上下限要根据执行机构特性来设。
另外,现场调试时一旦发现温度冲过头了,先别急着去调PID参数,先看一眼输出是不是长时间卡在100%或者0%。如果是,多半是饱和了,而不是参数不对。PID_Temp的状态字里也有饱和相关的标志位,可以读出来在HMI上显示。
4.5 实际整定记录
我这里贴一套实际整定数据供参考。系统是120L循环水罐,3kW加热管,PT100测温,PID_Temp采样周期1秒,PWM周期3秒。自整定跑完后给出的参数大约是Gain=8.5,TI=120秒,TD=0。写入后实际运行,从冷态25度加热到80度,稳态波动约正负0.3度,满足工艺要求的正负0.5度。
后来为了减小超调,我把Gain从8.5降到6.0,TI保持120秒,超调从2.5度降到了1度左右,但升温时间长了约20%。这就是典型的"精度和响应速度"之间的取舍。做项目时要记得问清楚工艺方,到底更在意升温速度还是更在意不过冲,然后有针对性地整定,不能盲目追求又快又稳,那是不存在的。
5. 程序编写细节与HMI联动
5.1 调用方式:OB1还是循环中断组织块
前面提到PID_Temp采样周期要稳定,所以最好的做法不是在主OB1里调用它,而是创建一个循环中断组织块(Cyclic Interrupt OB),比如OB30,把循环中断的间隔设置为1000ms,也就是1秒。然后把PID_Temp指令放到OB30里。这样即使OB1里的其他程序耗时较长,也不会影响PID采样和计算的稳定性。
这里有个细节经验:S7-1200循环中断组织块默认时间设置是1秒的话,实际启动会有很小的时间偏移,但这个偏移对温控这种系统没有影响。如果你对时间精度有要求,可以在OB的组态里设置"相位偏移",让多个中断错开执行,避免CPU在同一时刻集中处理多个中断任务。
5.2 PRG模式、手动模式和手自动无扰切换
PID_Temp支持手动模式和自动模式。手动模式时,输出值由ManualValue引脚直接给定,比如你在HMI上输入50,代表输出占空比50%。自动模式时,PID算法根据设定值和过程值计算输出。这个手动模式不是给现场随便玩的,而是给调试阶段或设备检修时用的。
手自动切换一定要无扰。PID_Temp内部对手动到自动的切换做了缓冲处理,但如果你的程序里手动强制了输出,而PID内部的积分项还残留着旧值,切换瞬间输出会跳变一下。解决方法是:在切换到自动模式之前,先把设定值改成当前实际温度,等稳定一个采样周期后再把设定值切回目标值。另外,ManualValue引脚最好连接HMI的输入域,并且加一个中间变量做限幅,防止操作员误输入大于100的值。
5.3 HMI变量映射和报警显示
PID_Temp的背景DB变量在HMI里可以直接访问,但博途的工艺对象变量名很长,建议在PLC侧做一个变量映射,把要用到的几个关键量拷贝到单独的全局DB里,再连接到HMI。需要显示的量通常包括:设定温度、实际温度、输出百分比、当前状态、故障代码。
状态字建议解析成几个简单的BOOL量:正在运行、正在整定、输出饱和、故障。这样HMI上可以用指示灯直观显示,屏幕提示"正在自整定,请勿操作设备"这类文字,减少现场人员误操作的可能。
报警方面,除了温度超限报警,我额外做了两个判断:一是实际温度长时间偏离设定值超过2度持续5分钟,判定为控制异常报警;二是输出百分比持续为100%超过30分钟但温度还没有上来,判定为加热回路故障。这两个判断逻辑都很简单,但实际很有用,能第一时间发现加热管烧断或传感器失灵的问题。
6. 现场调试常见问题与排查方法
6.1 温度波动大、输出在"抽搐"是什么原因
这是我最常被问到的问题。温度在设定值上下反复震荡,PID输出曲线看起来像锯齿一样。排查思路按顺序来。
第一步看传感器信号是否有干扰。用博途的在线监测功能直接看PID_Temp的Input值,如果输入信号本身就是毛刺状的,那后面怎么调参数都是白搭。检查传感器屏蔽层接地、线路是否和动力线走同一线槽。
第二步看PWM周期是否太短。如果PWM周期是1秒,但加热管功率很大、温度响应又慢,那输出占空比的小幅变化都会让温度出现波动。试着把PWM周期加长到3秒、5秒,往往能立竿见影。
第三步再考虑PID参数。如果温度曲线是有规律的等幅振荡,多半是Gain过大。先减小Gain,再适当增大TI,让系统"慢下来"。
6.2 自整定报错:Error代码该去哪查
PID_Temp的Error引脚会输出一个十六进制错误代码。最常遇到的有几类:16#8001表示输入值无效,通常是温度模块断线或量程设置错误;16#8002表示设定值无效;16#8003表示参数设置无效;16#8080开头的一般是整定过程中出现问题。
排查时我一般是这么做的:先把PID_Temp整个背景DB的State和Error值放在监控表里,然后在博途在线状态下操作一次自整定,看Error值什么时候变。如果一启动就报错,基本就是参数组态问题,重点查温度输入引脚和组态里的输入上下限,别让它俩打架。如果跑到中途报错,多半是过程值长时间没变化(传感器坏了?加热没动作?),或被手动干预打断了。
6.3 升温时间太长,怎么判断是功率不够还是参数问题
这是工程上很现实的矛盾。用户觉得升温慢,第一反应是"你PID控制没调好"。但实际上可能是加热功率本身就小了。简单的判断方法是:在手动模式下,把输出固定在100%,连续运行10分钟,看温度实际上升了多少。如果温升速率远低于工艺预期,那就是加热功率/系统散热的问题,和控制策略无关。如果手动100%输出时温升还可以,但一打到自动就慢下来,那才是PID参数设置的问题。
我碰到过一种情况:手动100%时温度上升很快,一切自动输出就掉到20%,温度不仅不升反降。查了半天发现是自整定把Gain算得太大,导致控制器稍微有一点偏差就输出满量程,然后立刻又因为超调往回压。用我们前面说的办法,把Gain减半,TI适当增加,症状立刻消失。
6.4 传感器安装位置反复强调
这个问题前面其实提到过,但因为它实在太重要,我专门再列一条。很多温控系统调不好,不是PID的锅,而是传感器装错地方了。传感器要装在能代表被控介质温度的位置,并且要避免"局部过热"的假象。比如加热管附近的水温明显高于远处,如果你把传感器贴在加热管旁边,那控制出来整个罐体温度肯定偏低。
还有一种情况是传感器插入深度不够。管路上安装的热电阻,如果探头没有插到管道中心流速最高的区域,测到的温度会比实际水温低好几度,且响应滞后。我的经验是探头长度至少要有管道直径的三分之一插入深度,并且迎着水流方向安装,这样测量响应最快。
6.5 常见问题速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 温度持续上升停不住 | 输出饱和/SSR击穿/加热管接线错误 | 查看Output是否长期100%;断电测SSR通断 |
| 温度波动±2度以上 | PWM周期过短或Gain过大 | 加长PWM周期;减小Gain |
| 升温特别慢但手动100%正常 | PID参数过于保守 | 增大Gain;减小TI |
| 自整定无法启动 | 输入值无效/设定值不在允许范围 | 检查组态上下限和传感器接线 |
| 温度显示跳动剧烈 | 传感器干扰/模块滤波太小 | 检查屏蔽层;加大滤波参数 |
| 自动模式切到手动再切回有跳变 | 手动前积分项残留 | 切换前把设定值设为当前实际温度 |
7. 项目做完后的一些体会和补充小技巧
整套系统从设计到调试,前后大概花了一周时间。真正用在写程序和组态上的时间其实非常少,大头全在参数整定和设备联调上。我个人的体会是,PID_Temp这个工艺指令把温控项目的"下限"抬得很高,哪怕不太懂PID理论的人,按照组态向导做好设置、跑一次自整定,也能获得勉强能用的控制效果。但如果你想做出超调小、稳态稳、抗扰动强的温控系统,还是得回到控制原理上,把采样周期、PWM周期、传感器安装这些基础问题吃透。
最后再分享一个小技巧,算是我自己的习惯:不管项目多急,一定要在交付时把PID_Temp的整定记录截图保存,连同背景DB参数一起导出存档。因为设备运行半年一年后,用户很可能来电话说"温度控不住了",到时候你远程远程看看参数有没有被改过,大部分时候都是工艺人员在触摸屏上误动过PID参数,或者机械结构发生了变化(加热管结垢、泵老化流量下降),导致原有参数不再适用。有存档对照,远程排查效率会高很多。
关于这套系统后续的扩展方向,如果你有多个温控区,可以考虑用S7-1200的多重背景调用方式管理多个PID_Temp实例,程序结构更清晰,参数集中管理也更方便。另外,如果现场要求记录温控曲线做质量追溯,PID_Temp配合PLC的Web Server功能或者数据日志功能也能实现,成本很低但很受用户欢迎。这些都属于同一个项目骨架上的延伸,一点经验之谈,供你参考。