☰
PLC水温控制实战:PID+开关量双通道方案,梯形图与调参全解析
2026/9/29 19:56:34 网站建设 项目流程

如果你接过水温控制的活,大概率都遇到过同一种尴尬:加热管一开,温度像坐火箭一样往上冲;一关,又晃晃悠悠往下跌。用温控表加接触器做双位控制,温度能在设定值上下甩出五六度,接触器啪嗒啪嗒响个不停,还没交货,触点就烧黑了。后来我改用汇川PLC自己写了一套PID加开关量控制程序,把一台水箱的温度稳定在正负一度以内,执行机构的动作频率也降了一个量级。这篇文章就把整套方案的原理、梯形图、调参过程和踩坑记录完整摊开讲一遍,适合刚接触PID想用在PLC里的入门工程师,也适合想用可编程控制器把加热流程做得更精细的老手。

1. 为什么水温控制要用"PID+开关量"双通道

1.1 双位控制:简单粗暴但控不住的"大摆锤"

双位控制大概是多数人最先想到的方案:温度低于下限就开加热,高于上限就关加热,中间留一段回差,防止输出频繁翻转。这个思路本身没有错,但水温对象恰恰有两个让人头疼的特性——热惯性大、传热滞后。

加热棒的热量不可能瞬间全部进入水中,水温也不可能瞬间均匀;停止加热后,加热管附近的余热还会继续向水中传递。于是温度曲线就像一个大摆锤:下限触发开加热,等温度传感器看到数值爬上去时,实际水温已经冲过头了很多;上限触发关加热,等温度掉下来时,实际温度又已经低于设定值了。我自己在现场测过一台约1吨的水箱,双位控制下温度波动经常在正负5到8度,这已经是相对乐观的数字。

这里还藏着一个非常现实的坑:接触器。双位控制为了让温度波动小一点,往往要缩小回差,结果接触器频繁启停,几分钟内动作几十次都是正常的,机械寿命和电气寿命根本扛不住,烧触点、触点粘连是再常见不过的故障。把回差调大吧,温度又稳不住,标准的按下葫芦浮起瓢。

1.2 PID连续控制在精度上的优势,以及它的成本代价

PID控制器能做到的是:根据设定值与实际温度的偏差,连续调整加热功率。偏差大时给大功率,接近设定值时给小功率,积分项还能慢慢把静态偏差吃掉,最终把温度稳定在设定点附近很小的范围里。

但问题在于,真正的连续调节需要一个能连续改变输出功率的执行机构。常见的是可控硅调功器、调压器或者变频器,一台像样的调功器便宜的也要上千元,配置稍高一点就是两三千起步,加上安装和散热,整套成本比PLC本身还贵。对很多现场来说,只是为了加热一罐水,这笔投入有点过于奢侈了。

1.3 工程上的破局:PID算占空比,开关量去执行

水温是典型的慢过程,根本不需要像伺服电机那样微秒级精度的连续调节。一个更聪明的做法出现了:让PID算出一个0到100%的控制量,然后把这个控制量转换成一个固定周期内的通电时间占比,也就是时间比例控制,本质上是PWM输出。用接触器或固态继电器按这个占空比去通断加热棒,平均功率就等效于PID输出,控制效果和连续调节非常接近。

在这个基础之上,我再叠加一个开关量通道:当实际温度和设定值差距较大时,不跟PID磨磨唧唧,直接全功率加热;等温度接近设定点了,再切回PID做精细调节。这就是标题里说的"PID+开关量"双通道。这套组合既保住了精度,又避开了连续调节执行机构的高成本,还让大温度阶跃响应更快,是整个方案里最关键的设计决策。

2. 硬件选型:汇川PLC、温度采集和执行机构

2.1 控制器选型:为什么选汇川Easy系列

我用的控制器是汇川Easy系列PLC,具体型号是Easy320,编程环境是AutoShop。选它的原因有几个:CPU本体自带以太网口和RS485串口,方便和上位机、触摸屏通讯;扩展GL20系列模块很灵活;价格也明显低于同配置的进口品牌。

做这类温度控制,PLC的最低配置要求其实不高:支持PID指令(或者至少能用基础指令实现PID计算),带至少一路模拟量输入通道,再有一路开关量输出。从这个角度看,汇川H3U系列、AM系列都可以做,但要注意它们之间还是有区别的:H3U和Easy系列都用AutoShop编程,指令结构和习惯比较接近;AM系列走的是Codesys平台,程序组织方式差别就大了,如果你不是从零开始熟悉Codesys,建议还是优先考虑Easy或H3U。

2.2 温度传感器和变送器:PT100是水温场景的稳妥选择

水温在0到100摄氏度这个范围,我首选PT100热电阻加温度变送器的组合。PT100在测温范围、精度、长期稳定性上都够用;变送器把电阻变化转换成标准的4到20mA电流信号,再进GL20-4AD这类模拟量输入模块。

这里有个很常见的选型误区:GL20系列模块型号很多,不同后缀对应完全不同的功能,比如GL20-2HC是高速计数模块,用来接脉冲传感器做计数定位的,不是温度采集用的。如果采购时没看仔细,很容易买错。温度采集要选模拟量输入模块(比如GL20-4AD)或者专门的温度模块,别看到GL20就以为都能用。

现场接线时还有一个容易被忽略的细节:变送器的量程和模块的量程设置必须一致。我用的变送器量程是0到100度,模块的原始值范围要按实际模块规格来换算。比如有的模块把4到20mA对应成0到4000,有的是0到16383,如果代码里直接拿原始值套公式,不先确认量程,最后的温度值会错得离谱。

2.3 执行机构:接触器和固态继电器怎么选

既然方案核心是"开关量去执行",执行元件就在两种里选:

  • 交流接触器:便宜、直观、坏了能换,但机械结构和触点有动作寿命限制。用于PWM周期长的场合还行,动作太频繁还是会加速老化。
  • 固态继电器(SSR):半导体无触点,开关速度快、寿命长,但导通压降会发热,需要配散热器,选型时电流要留有1.5到2倍的裕量。

在温度控制项目里,我的习惯是按功率分档:加热功率不大(例如3到9kW),用SSR,因为能接受10秒周期的PWM通断,寿命压力小;功率上了15kW,就不太建议用接触器吃PWM了,哪怕周期放到15秒,频繁通断大电流对接触器和电网都是负担,我会改用可控硅调功器。如果现场非得用接触器,PWM周期必须拉长到15秒以上,程序里还要加最小占空比限制,否则接触器几个月就废。

3. PID指令的梯形图调用:从参数到输出

3.1 PLC里的PID是离散化的,理解这一点才能调好参

先把PID原理用最直白的方式过一遍。模拟控制里的PID公式是:

MV = Kp × e + Ki × ∫e dt + Kd × de/dt

MV是输出控制量,e是设定值SV和测量值PV的偏差。问题在于PLC没法做连续积分和微分,所有运算都是按扫描周期离散化处理的:积分项变成历史误差的累加,微分项变成相邻两次误差的差分。

这个离散化过程有两点很重要。第一,每个采样周期算一次MV,采样周期必须远小于被控对象的响应周期,否则控制频率跟不上温度变化。水温对象的响应周期通常是分钟级,我习惯把采样周期设在500毫秒到1秒之间,足够用。第二,积分项有"记忆",它会一直保存历史的累积误差,这是后面积分饱和问题的根源,需要单独处理。

3.2 汇川PLC的PID指令长什么样

不同系列的汇川PLC指令格式会有些差异,但AutoShop环境里的PID指令基本都要指定这几样东西:设定值地址(SV,比如D110,存放设定温度乘以10)、测量值地址(PV,比如D120)、输出值地址(MV,比如D140),以及一个参数区起始地址。

参数区里会按固定顺序存放控制模式、采样周期、比例增益Kp、积分时间Ti、微分时间Td、输出上下限等内容。具体地址排列以你手上PLC型号的官方手册为准,插PID指令时软件会弹出参数配置对话框,按屏幕提示填进去就行,不需要死记硬背地址偏移。

梯形图里有一个关键细节:PID指令不是每个扫描周期都要执行。我的做法是用定时器生成一个周期脉冲M0,把PID指令的驱动条件挂在M0上,扫描到M0为ON时才执行一次PID计算。这样能确保采样周期严格可控,不会因为扫描周期波动而影响控制品质。

3.3 初始化段梯形图:把参数暴露在D区,方便HMI在线修改

直接给一个初始化段的示意。M8002是汇川/三菱系PLC的首次扫描脉冲,程序第一次运行时把参数写进D区:

M8002 |--||-------------------------------[MOV K600 D110]----| 首次脉冲 设定60.0℃(600=60.0) |--||-------------------------------[MOV K180 D130]----| 比例系数Kp=18.0(现场整定) |--||-------------------------------[MOV K600 D132]----| 积分时间Ti=60.0s |--||-------------------------------[MOV K150 D134]----| 微分时间Td=15.0s |--||-------------------------------[MOV K500 D136]----| 采样周期=500ms

注意这只是示意,不要照搬具体地址。我要强调的思路是:把PID参数全部放在D区,而不是写死在程序里。这样后期通过触摸屏或上位机就能在线改参数,不用每次调参都重新下载程序,现场调试会轻松非常多。

3.4 PID调用段梯形图:采样脉冲触发计算

定时器T0每500ms产生一个脉冲M0,用M0去触发PID指令:

M0 PID |--||-----------------[PID D110 D120 D140 D130]----| 采样脉冲 设定值SV 测量值PV 输出MV 参数区

执行完以后,D140里就是0到1000(或者0到10000,取决于指令定义)的控制量,对应0到100%加热功率。接下来要做的,就是把这个数字翻译成开关量输出。

新手最容易在这里犯的一个错误是:SV和PV的刷新时序没安排好。PID指令执行前必须先确保D120里是最新的实际温度值,如果上一段梯形图还没把模拟量转换结果写进D120就调用了PID,那算出来的就是基于旧温度的过时输出,整个控制回路等于没闭环。

4. 开关量输出段梯形图:PWM占空比与大偏差强切

4.1 核心逻辑:固定周期加占空比

水温控制不需要高频PWM,我给自己定的现场参数是10秒固定周期。给外界表现就是:每10秒一个循环,前"ON时间"秒加热,后"OFF时间"秒停止。ON时间由PID输出换算得到:

ON时间 = 周期时间 × MV / 1000

假设MV满量程是1000对应100%,MV等于300,就表示每10秒内加热3秒、停止7秒。这个平均功率等效于30%的连续加热功率。

梯形图的做法是用两个定时器搭一个自复位脉冲发生器。定时器T0负责10秒周期自复位,另一个累加寄存器记录当前周期内走过的时刻;当累计时间小于等于ON时间时,输出Y0为ON,否则为OFF。

梯形图示意(以100ms定时器为例,10秒对应K100):

T0(未到时) D200 |--|/|------------------------------[INC D200]------| 每100ms累加一次 D200 >= K100 T0 |--|>=|------------------------------( )------------| 到达周期,T0置位并自复位 D200 <= D150(ON时间) Y0 |--|<=|------------------------------( )------------| 在ON时间内,加热输出

D150由D140换算得到。每个周期开始时,把D200清零重新累加。不同PLC的定时器复位方式、比较指令写法略有区别,逻辑思路是通用的。

4.2 为什么用"PWM开关量"而不是直接输出模拟量

控制精度上两者的差别其实不大,因为水温是大惯性对象,模拟量连续调节并不会让温度更听话多少;成本上的差别却是实实在在的,连续调节需要加调功器或调压器,一套下来一两千元起步,而PWM方案只需要一个固态继电器,一两百元搞定。

这种方案真正的代价是执行机构的开关损耗和寿命,但上面已经讨论过了,只要PWM周期选得合理、占空比上下限有约束,开关量执行元件完全扛得住。

4.3 大偏差强切:让PID只在"该干活"的地方干活

这是整套方案里画龙点睛的一笔。PID在偏差特别大的时候会显得磨叽,积分项需要很长时间慢慢累积才能把输出推到满量程,而且容易带来超调风险。水温从室温加热到设定值这种大跨度场景,根本不需要这种"温柔"。

我设置了5摄氏度的强切门槛:

  • 实际温度低于设定值5度以上时,强制Y0持续ON,全功率加热,让温度快速逼近。
  • 实际温度进入设定值附近5度以内,强切标志复位,输出回到PWM逻辑,由PID接管精细调节。

梯形图里的处理要注意优先级。千万不要直接拿强切标志去SET Y0,因为SET指令锁存了输出线圈之后,PWM程序里的输出指令是复不了位的,大概率会出现"全功率停不下来"的失控场面。正确做法是:把"强切全功率"和"PWM占空比"这两个控制结果都先计算到中间继电器M1、M2里,最后再做一个或逻辑驱动Y0:

M10(偏差超5℃强切标志) M1 |--||---------------------------------------( )-----| M10(未强切) D200 <= D150 M2 |--|/|---------------|<=|-------------------( )-----| M1 Y0 |--||---------------------------------------( )-----| M2 |--||-----------------------------------------------|

这样Y0只有一个输出线圈,M1和M2各自独立计算,不存在锁存冲突,逻辑清楚,在线监视也方便。

4.4 传感器断线保护:容易被忽略的致命问题

温度变送器断线后,模拟量模块读到的原始值经常会回落到0。PID一看到PV几乎等于0,和设定值的偏差极大,输出会直接打到满功率加热。如果不做保护,一罐水可能会直接被烧开,甚至干烧酿成事故。

梯形图里必须加一段:当PV异常低(比如折合温度小于0.5度)且系统已经运行一段时间,立刻触发断线报警信号,断开Y0输出。这是安全回路层面的东西,不能靠PID参数去兜底。

5. 完整控温程序:逐段梯形图拆解

5.1 IO分配与程序框架

把完整程序结构理一遍之前,先看IO分配表。一个典型的水温控制项目是这样的:

信号地址说明
启动按钮X0常开触点,上升沿启动
停止按钮X1常开触点,下降沿停止
温度变送器 4-20mAAI通道1原始值存D0
加热输出(SSR驱动)Y0PWM输出,3kW加热管
运行指示灯Y1运行时亮
报警输出Y2断线/超温报警

程序框架按扫描顺序从上到下组织,依次是初始化、模拟量读取与换算、滤波、PID计算、PWM与强切、报警保护。PLC的梯形图本质上就是按行顺序扫描执行的,这和高级语言里main函数从上到下跑是一样的逻辑,程序组织顺序直接影响控制时序。

5.2 模拟量读取与温度线性换算

扩展模拟量模块的读取方式,在AutoShop里通常是通过模块映射或专门的读取功能块处理的。我假设模块将原始值映射到D0,后续要做的是线性换算:

每单位原始值对应的温度 = 100.0 / 模块量程上限

假设模块量程是0到4000对应0到100度,那么温度值就是D0除以40。但这里有一个整数运算丢精度的问题:50度以上的温度,除以40会丢掉小数,长期累积下来就是一个稳定的控制误差。

我在工程里习惯的做法是:把温度放大10倍再存储,比如D120里存的是653,表示65.3摄氏度。这样虽然多占用了一点D区,但整数运算精度足够,而且不用频繁进行浮点运算,对PLC的扫描周期更友好。如果你用的CPU性能充裕,也可以用浮点指令做换算,结果存到浮点寄存器区,逻辑同样清晰。

5.3 平均值滤波:让PID看到"平滑"的温度

模拟量信号在电柜里有变频器、接触器等干扰源时,原始值经常跳来跳去。如果直接把这种毛刺很多的温度送给PID,微分项会被噪声放大,输出跟着剧烈波动。

我在程序里做的是10次平均值滤波:每500毫秒采样一次,把数据存入D10到D19循环覆盖,每10次求一次平均,平均值写入D120。梯形图用变址寄存器Z0实现循环指针,每执行一次指针加1,到9就回0,同时累加求和,每10次做一次除法。

温度对象本身是大滞后,滤波引入的几十毫秒延迟根本感觉不出来,但滤掉噪声之后,PID看到的曲线平滑了,微分项的输出也稳定了。

5.4 PID运算段与PWM输出段

PID运算段就是前面说的:M0周期脉冲触发PID指令,SV取D110,PV取D120,输出到D140。PWM输出段把D140换算成D150,再走第4章的占空比逻辑驱动Y0。

5.5 报警与安全段

报警逻辑我写了三条:

  • 超温预报警:实际温度高于设定值5度以上,触发Y2报警,提示操作员检查。
  • 传感器断线报警:PV小于0.5度且运行超过10秒,触发Y2,同时强制关闭Y0。
  • 急停输入:X2直接硬切断Y0输出,不经过程序软逻辑,这是电气安全回路的底线,PLC程序只是辅助。

6. 现场调参记录:从震荡到稳定的实战

6.1 临界比例度法的具体操作步骤

PID参数调试大家第一反应是"经验调",但经验调参最大的问题是不知道从哪里下手。我用的方法是经典的临界比例度法,操作流程如下:

  1. 先把Ti设成最大值或设为0(关闭积分作用),Td设为0(关闭微分作用),PWM周期按10秒固定,大偏差强切门槛临时调大,或者直接暂时屏蔽。
  2. 给定目标温度,比如50度,启动系统观察曲线。
  3. 从Kp等于5开始,每次增加5,观察温度是否在设定值附近持续等幅振荡。注意要区分"过冲一次然后回稳"和"等幅振荡停不下来",后者才是临界状态。
  4. 记下出现持续等幅振荡时的比例增益Ku,以及振荡周期Tu。

我这里要特别提醒一点:Kp的单位取决于PID指令把MV定义成多少满量程,你用我给的数值之前必须先确认自己的指令定义,否则换一台PLC机型,同样的Kp数值对应的实际控制强度可能完全不同。

6.2 按Ziegler-Nichols公式计算初始参数

临界比例度法配套的是Ziegler-Nichols参数公式:

控制方式KpTiTd
P0.5 × Ku∞0
PI0.45 × Ku0.83 × Tu0
PID0.6 × Ku0.5 × Tu0.125 × Tu

我在现场得到的数据是:Ku = 30,Tu = 120秒。代入PID公式:

  • Kp = 0.6 × 30 = 18
  • Ti = 0.5 × 120 = 60秒
  • Td = 0.125 × 120 = 15秒

这套参数上去后,温度曲线通常会有10%上下的超调,能稳定,但还不够好看。工程上不会直接把Z-N值当最终值用,而是把它当做一个可靠的基础点再微调。

6.3 工程微调与最终参数

现场微调的思路是:超调偏大就把Ti往大调(从60秒调到80到100秒),同时Kp小幅降到15左右;如果稳态时输出来回蹿,就适当加一点Td,或者降低Kp。试验下来,我最终用水温控制的参数是:Kp=18,Ti=60秒,Td=8秒,采样周期500ms,PWM周期10秒,大偏差强切门槛5度。

给出一组适合"1吨水箱、3kW加热、采样500ms、PWM周期10秒"场景的经验范围,可以作为起步值参考:

参数经验范围我最终用的
Kp10 ~ 3018
Ti30 ~ 120秒60
Td0 ~ 15秒8
PWM周期5 ~ 15秒10
采样周期0.5 ~ 2秒0.5
大偏差强切门限3 ~ 8度5

6.4 双位控制与PID+开关量的实测对比

我把两种方案的实测数据放在同一张表里,感受会更直观:

方案稳态波动执行机构压力成本
双位控制±6℃以上接触器频繁动作,易损坏低但售后成本高
PID+连续模拟量±0.5℃调功器/调压器,可靠高
PID+PWM开关量±0.8℃接触器或SSR,压力小中低

实测结果是:PID+开关量的稳态波动在正负0.8度左右,对一个大惯性水箱来说完全够用了。另外要提醒:测温点的安装位置非常关键,不要把传感器探头放在离加热管太近的地方,那样测到的是局部高温,会让PID一直误以为温度偏高,输出忽大忽小,很容易误判成"PID没调好"。传感器应该放在能代表整体水温的位置,有搅拌就放到循环比较充分的区域。

7. 容易翻车的几个细节与预防措施

7.1 采样抖动是"PID不收敛"的头号嫌疑犯

前面提过采样滤波的事,这里再展开说一下。PID里的微分项天生对噪声敏感,PV只要抖动0.3度,微分项的输出就能放大大几倍,导致控制输出满幅震荡。

处理这件事要三管齐下:

  • 硬件上:变送器信号用屏蔽双绞线,屏蔽层单端接地,走线时和动力线分开,最好用单独的穿线管。
  • 软件上:做平均值滤波,这是最直接有效的手段。
  • 参数上:Td不要超过15秒,水温对象本身就不是一个需要强微分作用的系统,噪声环境下宁可牺牲一点响应速度。

实测下来,只做硬件屏蔽不做软件滤波,噪声能降到一半以内;软件平均值滤波再叠加一次,PV曲线基本就是一条干净的直线。

7.2 积分饱和:PID最阴险的那个坑

积分饱和的场景非常典型:升温阶段偏差很大,PID输出早早顶到了100%,但积分项还在不停累加。等温度终于到了设定值,偏差归零了,积分项却还保留着巨大的累积值,PID输出下不来,于是温度继续往上冲一大截。

我的处理方式有三个,按效果从高到低排列:

  • 积分分离:偏差大于2℃时不让积分累加,偏差小了才恢复积分作用。这个策略对热水这种带大滞后的对象非常有用。
  • 输出限幅:MV输出上限限制在90%以内,不给积分项"顶天"的空间。
  • 积分限幅:在PID参数区里设置积分上限,从源头限制积分项的堆积量。

三选一或者组合用都行,我自己的项目里用了积分分离加输出限幅,升温过冲明显减小。

7.3 PWM周期和占空比上下限的钳位

接触器和SSR都有最小可靠开断时间,占空比设得太小,可能开关还没真正导通就又到关断时间了;占空比设得太大,也可能出现一直开着的状态,和持续加热没区别。

程序里要对占空比做钳位:MV小于30时直接输出OFF,MV大于950时直接输出ON。这样执行机构始终工作在可靠的开关区间内,不会出现SSR半导通发热这种说不清道不明的故障。另外PWM周期并不是越短越好,周期短了,温度波动是小一点,但执行机构开关频率会直线上升。水温对象惯性大,5到15秒的周期已经是合理区间,不需要往2秒以下走。

7.4 手动自动切换瞬间的"输出跳变"

调试阶段免不了手动开开关关。把手动状态切回自动的那一刻,如果PID的积分初始值和当前手动输出差得很远,PID输出会"啪"地跳一下,温度也跟着抖一下,情况严重的时候甚至引入一次不小的扰动。

解决这个问题的思路叫积分预加载,也叫积分跟踪:手动模式下让PID一直参与运算,但输出不真正控制加热,而是把输出值跟踪为当前手动输出值;或者切换瞬间把积分寄存器预置成"当前输出对应的积分等效值"。很多汇川PLC的PID指令本身带有手动/自动切换输入端子,接上这个端子,指令内部会自动处理输出跟踪的逻辑,比自己搭切换逻辑要稳得多。

7.5 传感器断线保护必须在程序里存在

最后再强调一次断线保护,因为这个问题真的能造成安全事故。温度变送器断线、模拟量模块接线松动、传感器损坏,这些情况发生后模块读到的原始值通常会掉到0。PID看不到温度,偏差极大,输出直接冲到满功率,设备会一直加热。

程序里写一条简单的判断逻辑:PV低于正常下限(折合温度小于0.5度)且系统已经运行10秒以上,置位断线报警标志,强制断开Y0。这条逻辑不依赖PID参数,属于独立的安全兜底,无论谁改参数都不能误删这一段。


做完整套项目,我的体会是:控制方案的选择不在高端,而在匹配。水温这种大惯性、大滞后的对象,用PID算占空比、用开关量去执行,就是成本最低、效果又稳的组合。最后再分享一个提高效率的小技巧:把这套程序的PID参数全部做成配方数据存到触摸屏里,调试时只需要在HMI上切换配方翻页修改参数,不用反复下载程序,一天下来能省下不少时间,也避免了下载程序时把生产中的设备停掉的风险。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询