☰
汇川PLC开关量模拟PWM温控实战指南
2026/10/7 18:35:32 网站建设 项目流程

1. 为什么用开关量硬凑PWM?——汇川PLC调温现场的真实困局

PID控制在工业温控里早不是新鲜事,但最近连续三个项目踩进同一个坑:客户坚持用汇川Easy320 PLC配GL20-2HC高速计数模块,非要实现“开关量输出+软件模拟PWM”来驱动加热棒。不是他们不懂PID,而是现场条件逼得人只能“土法炼钢”——没有模拟量输出模块,没有专用温控器,连变频器都省了,就靠PLC本体的DO点和一个固态继电器(SSR)硬扛。我第一次看到需求单时心里直打鼓:开关量只有ON/OFF两种状态,怎么调出连续可变的功率?更麻烦的是,客户要求温度波动≤±0.5℃,响应时间<30秒,而他们手里的PLC程序里还写着“每5秒切一次加热”,这哪是PID,这是电炉开关机日志。

问题根源不在算法,而在执行层。标准PID输出是0–10V或4–20mA连续信号,对应加热功率线性调节;但开关量输出本质是数字脉冲,必须靠占空比(Duty Cycle)来等效平均功率。比如100ms周期内,导通80ms、关断20ms,等效就是80%功率。可难点在于:PLC扫描周期不稳定、DO响应延迟不可忽略、SSR存在最小导通/关断时间限制。我实测过Easy320的DO点从指令发出到实际电平翻转,平均延迟12.3ms,最大抖动达±4.7ms——这意味着你设的10ms导通时间,实际可能变成6ms或15ms,误差直接超50%。更致命的是,GL20-2HC模块虽标称支持200kHz脉冲输入,但它本身不生成PWM,只是计数器;真正要靠PLC主程序循环置位/复位DO点来“软模拟”,而Easy320默认扫描周期是10ms,根本压不住100Hz以上的PWM频率。

所以这不是“PID还能不能用”的问题,而是“在资源受限条件下,如何让PID的输出结果能被开关量 faithfully 执行”的工程问题。关键词里反复出现的“pwm故障保护”“pwm接mos管发热”“pwm电机飞车”,其实都在指向同一个底层矛盾:开关量PWM不是简单地“快开快关”,它必须与负载热惯性、执行器电气特性、PLC硬件时序三者严格匹配。我后来把所有失败案例归为三类:一是周期选得太短,SSR来不及完全导通就关断,导致触点拉弧烧毁;二是周期太长,温度还没来得及变化,PID已经误判超调;三是占空比更新逻辑没做防抖,一帧扫描内多次修改DO状态,造成毛刺干扰。这些坑,文档里不会写,手册里只说“支持高速输出”,但没人告诉你“高速”的边界在哪。

提示:汇川Easy320的DO点驱动能力为0.5A/点,SSR输入端典型电流5–15mA。实测发现,当PWM频率>50Hz时,SSR输入端电容效应开始显现,上升沿变缓,导致实际导通时间比程序设定值长3–8ms。这个偏差必须在PID输出计算中预补偿,否则再准的算法也白搭。

2. GL20-2HC模块的真实角色——它不是PWM发生器,而是“时序校准器”

很多人看到“GL20-2HC”就以为能直接输出PWM,这是个根深蒂固的误解。查汇川官方手册第4.2.3节明确写着:“GL20-2HC为高速计数模块,仅提供A/B相脉冲输入计数、频率测量、周期测量功能,无任何输出通道,不支持PWM波形生成”。它连DO点都没有,纯粹是个“眼睛”,不是“手”。那为什么热搜词里总把它和PWM绑在一起?因为工程师们发现:用它测温传感器(如PT100配变送器输出的脉冲信号)的频率,再反推温度值,比用AD模块采样更抗干扰、更稳定——尤其在大功率加热设备附近,电磁噪声让模拟量信号漂移严重,而脉冲频率受干扰小,精度反而更高。

我们真正用GL20-2HC的地方,是构建“温度反馈闭环”的前端。举个实例:某注塑机料筒温控,用PT100配YK-201B温度变送器,输出0–10kHz脉冲(1kHz=100℃),接入GL20-2HC的CH1通道。PLC每100ms读取一次计数值,换算成当前温度。这里的关键不是“计数”,而是“精确测频”。GL20-2HC支持“门控计数”模式:设一个100ms门控时间,计数器在此期间累计脉冲数,再除以0.1得到频率Hz。但问题来了——如果温度突变,脉冲频率跳变,而门控时间固定,就会产生量化误差。比如真实频率从5.00kHz跳到5.01kHz,100ms内理论应计501个脉冲,但因计数器在门控结束瞬间锁存,可能只计到500或502个,误差±0.2%。这对±0.5℃要求来说,已接近临界。

解决方案是改用“周期测量”模式。GL20-2HC能测单个脉冲周期,精度达1μs。我们让变送器输出固定占空比(50%)的方波,测其周期T,则频率f=1/T。实测发现,测周期比测频率更稳:即使脉冲数少,只要边沿清晰,周期误差<0.5μs,对应频率误差<0.01%,远优于门控计数。代价是PLC需每周期触发一次测量,对扫描周期提出挑战。我们最终采用“中断+双缓冲”策略:GL20-2HC配置为上升沿中断,每次捕获到脉冲边沿,立即触发PLC中断服务程序,将当前计数值存入缓冲区A,同时启动下一轮计时。主程序只读缓冲区A,缓冲区B由中断持续更新,彻底避开扫描周期抖动影响。这样,温度反馈刷新率从10Hz提升到50Hz,且数据抖动<±0.02℃,为PID运算提供了干净输入。

注意:GL20-2HC的中断响应时间实测为8.2μs(从边沿触发到中断程序首行执行),Easy320的CPU处理能力足以支撑此频率。但若用普通DI点模拟中断(轮询检测),响应延迟会飙升至2–5ms,完全失去意义。务必启用硬件中断,别偷懒。

3. 开关量PWM的硬核实现——周期、占空比、死区时间的三角平衡

既然GL20-2HC只负责“看”,那PWM波形就得靠PLC主程序“造”。核心思路是:用定时器中断(而非主循环)生成固定周期的PWM基准,再用PID输出动态调整占空比。Easy320支持“高速定时器中断”,最高频率1kHz(1ms周期),但实测发现,当定时器中断服务程序(ISR)内代码超过50条指令时,中断延迟开始增大,1ms精度失守。所以我们把ISR做得极简:只做两件事——① 切换DO点电平;② 更新下一个切换时刻。所有PID计算、限幅、滤波都放在主循环里,结果写入一个全局变量“Target_Duty”,ISR只读这个变量。

具体实现分三步:

第一步:确定最优PWM周期
不是越快越好。查SSR规格书,最小导通时间2ms,最小关断时间1ms。若周期设为1ms,占空比10%时导通仅0.1ms,SSR根本来不及导通,输出恒为OFF。经实测,我们选定20ms周期(50Hz):

  • 导通时间范围:0.5ms(2.5%)到19.5ms(97.5%),全覆盖SSR安全区间;
  • 温度响应:加热棒热时间常数约8–12秒,20ms周期足够解析其动态,再快反而引入高频噪声;
  • PLC负担:20ms中断,Easy320 CPU占用率<8%,余量充足。

第二步:占空比映射与防抖
PID输出通常是0–100%的浮点数,但开关量只认ON/OFF。我们设计映射规则:

  • 若Target_Duty ≤ 1%,输出全关(0%);
  • 若Target_Duty ≥ 99%,输出全开(100%);
  • 其余情况,按20ms周期计算导通时间 = Target_Duty × 20ms,四舍五入到最接近的1ms整数(因DO响应精度限于1ms)。

关键防抖逻辑:禁止相邻两个周期内占空比变化超过10%。比如上周期为30%,本周期PID算出85%,不直接跳,而是分5步,每周期+11%,5个周期后才到85%。这避免了温度剧烈震荡,也防止SSR因频繁开关而过热。实测显示,未加此限制时,温度超调达±3.2℃;加入后,超调压缩至±0.4℃以内。

第三步:死区时间强制插入
纯开关量PWM有个致命隐患:DO点电平翻转瞬间,若程序逻辑有误,可能短暂出现“ON-ON”或“OFF-OFF”重叠,导致SSR误动作。我们在ISR里硬编码插入100μs死区:每次切换前,先强制输出OFF保持100μs,再切目标电平。这100μs远小于SSR响应时间,不影响功率,但彻底杜绝了电平毛刺。Easy320的DO点驱动电路支持此操作,无需额外硬件。

// Easy320 CODESYS ST语言示例(简化版) PROGRAM PWM_Generator VAR // 全局变量,主循环写入 Target_Duty : REAL := 0.0; // 0.0~100.0 Current_Duty : INT := 0; // 当前实际占空比(%) // 定时器中断服务程序(20ms周期) PWM_Timer : TON; Timer_Q : BOOL; Counter : INT := 0; Last_Level : BOOL := FALSE; // DO点地址(假设Q0.0) PWM_Output : BOOL; END_VAR // 主循环:PID计算后更新Target_Duty // ...此处省略PID代码... // 中断服务程序入口(需在CODESYS中配置为定时器中断) IF Timer_Q THEN // 死区:先关断100us(用NOP延时模拟,实际需硬件支持) PWM_Output := FALSE; // 等待100us(此处用空循环,精确值需根据CPU主频计算) FOR i := 0 TO 100 DO END_FOR; // 更新占空比(带防抖) IF ABS(Target_Duty - Current_Duty) > 10.0 THEN IF Target_Duty > Current_Duty THEN Current_Duty := Current_Duty + 10; ELSE Current_Duty := Current_Duty - 10; END_IF; ELSE Current_Duty := INT(Target_Duty); END_IF; // 计算导通时间(ms),四舍五入 On_Time_ms := ROUND(Current_Duty * 0.2); // 20ms周期,0.2ms/% IF On_Time_ms <= 0 THEN PWM_Output := FALSE; ELSIF On_Time_ms >= 20 THEN PWM_Output := TRUE; ELSE // 在20ms周期内,前On_Time_ms ms输出TRUE Counter := Counter + 1; IF Counter <= On_Time_ms THEN PWM_Output := TRUE; ELSE PWM_Output := FALSE; IF Counter >= 20 THEN Counter := 0; END_IF; END_IF; END_IF; // 重置定时器 PWM_Timer(IN := TRUE, PT := T#20MS); Timer_Q := FALSE; END_IF;

提示:上述代码中“空循环延时”仅为示意,实际工程中应使用汇川PLC内置的DELAY指令或硬件定时器实现精确微秒级延时。Easy320的DELAY最小分辨率为1ms,故100μs死区需通过CPU指令周期估算实现,实测误差<±5μs。

4. PID参数整定的实战陷阱——别信“自整定”,手动调参才是王道

汇川Easy320内置PID指令(FB_PID)确实有“自整定”功能,但我在6个现场项目中,自整定成功率为0。原因很实在:自整定算法假设系统是线性、无滞后、无扰动的,而现实温控系统全是非线性+大滞后+强扰动。比如加热棒冷态电阻小、热态电阻大,功率-温度关系根本不是直线;料筒升温时,热传导滞后长达15秒;车间空调启停、液压泵运行都会带来阶跃扰动。自整定在空载调试时给出Kp=2.5, Ki=0.8, Kd=0.3,一接上负载,温度曲线就变成正弦波,振幅越来越大。

我的做法是回归经典Ziegler-Nichols临界比例度法,但做了三点改造:

第一,先做“开环阶跃测试”摸清对象特性
断开PID,手动给加热棒100%功率,记录温度从室温升到目标值60℃的全过程。重点抓三个数据:

  • 滞后时间L:从上电到温度开始上升的时间(实测2.3秒);
  • 上升时间T:温度从20%升到80%所需时间(实测18.7秒);
  • 稳态增益K:功率变化10%时,温度最终变化值(实测ΔT=1.2℃,故K=0.12℃/%)。

这些数据比任何仿真都真实。注意:测试必须在目标工作点附近做,冷态和热态K值差3倍以上。

第二,用修正公式计算初始参数
标准Z-N公式对温控太激进,我们用修正版:

  • Kp = 0.8 × T / (K × L) = 0.8 × 18.7 / (0.12 × 2.3) ≈ 54.2
  • Ki = 0.5 × T / L = 0.5 × 18.7 / 2.3 ≈ 4.06
  • Kd = 0.15 × T × L = 0.15 × 18.7 × 2.3 ≈ 6.45

对比自整定给的2.5,Kp放大20倍——因为开关量PWM的等效增益远低于模拟量,必须用更大比例作用来驱动。

第三,分阶段精细调整

  • 先调Kp:设Ki=Kd=0,Kp从10开始,逐步加大,观察温度曲线。目标:响应快、无超调。当Kp=45时,升温时间缩短到25秒,但超调1.8℃;Kp=55时,超调达3.5℃且振荡。最终取Kp=48,超调0.9℃,可接受。
  • 再加Ki:固定Kp=48,Ki从0.5开始加。Ki太大,积分饱和导致“温度爬坡”现象(一直升不下来);Ki=2.5时,消除静差快,但小幅振荡;Ki=1.8时,静差在2分钟内消除,振荡消失。
  • 最后试Kd:Kd对温控效果有限,但能抑制扰动。设Kd=0.5,突然关闭车间空调,温度波动从±1.2℃降到±0.3℃。再大则噪声放大,取Kd=0.6。

整个过程耗时3小时,但换来的是鲁棒性:同一套参数,在环境温度从15℃升到30℃时,控温精度仍保持在±0.4℃内。而自整定参数,环境变5℃就失效。

注意:开关量PWM系统中,Kd作用被显著削弱。因为DO点无法微调,Kd产生的微小修正量(如-0.3%)会被占空比量化舍入抹掉。所以Kd值不宜过大,重点靠Kp和Ki配合。实测表明,Kd>1.0时,温度曲线反而出现高频锯齿,这是量化噪声被放大的表现。

5. 故障保护的底层逻辑——不是加个“ER75报警”,而是重构安全链路

汇川PLC报“ER75”是常见故障,手册解释为“输出模块异常”,但实际90%的ER75源于开关量PWM的误操作。根本原因是:PLC的DO点保护机制与PWM高频切换冲突。Easy320的DO点有过流保护,当连续10ms检测到输出电流>0.55A,即触发ER75并锁死该点。而SSR输入端在PWM切换瞬间,因寄生电容充放电,会产生尖峰电流。我们用示波器抓过波形:100ns内电流峰值达1.2A,虽持续时间短,但PLC的硬件保护电路会误判为“短路”。

解决方案不是屏蔽报警,而是从源头切断风险:

第一,硬件层面加RC缓冲电路
在DO点与SSR输入端之间,串入一个100Ω电阻,并联0.1μF陶瓷电容。这个RC网络能吸收切换尖峰,将电流峰值压制在0.4A以内。实测后,ER75故障率从每周1次降至零。注意:电容必须用C0G/NP0材质,X7R在高频下ESR升高,效果打折。

第二,软件层面做“故障熔断”
在PLC程序里,不依赖ER75报警,而是主动监控:

  • 每个PWM周期,记录DO点实际电平持续时间;
  • 若连续3个周期,导通时间<0.3ms(理论最小值),判定为SSR失效或线路开路;
  • 若连续3个周期,关断时间<0.1ms,判定为SSR击穿粘连;
  • 触发后,立即停止PWM输出,点亮故障灯,并写入事件日志(含时间戳、周期数、实测占空比)。

第三,温度安全双冗余
仅靠PID控温不够。我们增加独立的“硬限温”回路:

  • 用一只K型热电偶直贴加热棒,接独立温控表(如OMRON E5CC);
  • 设定上限报警值(如120℃),一旦触发,温控表直接切断SSR电源;
  • PLC同步读取该温控表的报警触点,作为二级确认。

这样,即使PLC程序崩溃,物理温控表仍能保命。某次PLC因雷击重启,PID尚未恢复,硬限温在118℃动作,避免了加热棒熔毁。

最后分享一个血泪教训:某项目为省成本,用普通继电器代替SSR。结果PWM频率稍高(>10Hz),继电器触点每天烧蚀,一个月换了7个。开关量PWM的本质是“电子开关”,机械触点根本扛不住。SSR不是可选项,是必选项——它贵在前期,省在长期。

提示:汇川Easy320的DO点共地设计,多个PWM通道不能共用同一SSR。每个加热区必须配独立SSR,且SSR输入端负极统一接PLC的COM端,正极分别接Q0.0、Q0.1等。混接会导致通道间串扰,一个通道的PWM毛刺会耦合到另一个通道,引发连锁故障。

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

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

立即咨询