西门子200smart 自写PID功能块,西门子200smartPLC本身只支持8路PID而且不支持PID参数变量引接到触摸屏以及上位机,这给实际项目运用以及调试带来不少麻烦。 功能块是自写的PID,可以免去自己重写PID程序的麻烦,方便快速开发,如果有需要拿来研究学习也可以,算法完整,而且注释详细!!!
搞过西门子200smart PLC的老司机都知道,这货自带的PID回路就8条,参数还锁死在程序里,连触摸屏都改不了。调试现场要是想调个比例增益,还得蹲在PLC旁边改代码?这操作简直能把人逼疯。好在江湖救急,自己搓了个全开放式的PID功能块,参数随便绑定,回路数量管够,今天直接上硬货。
先看功能块长啥样(关键代码摘录):
// PID核心计算部分 LDSM0.0 MOVR VD2004, AC0 // 当前误差E(k) MOVR VD2008, AC1 // 上次误差E(k-1) MOVR VD2012, AC2 // 上上次误差E(k-2) // 比例项计算 MOVR AC0, VD2020 *R VD1000, VD2020 // Kp * E(k) // 积分分离策略(防饱和) A( LDR VD2016, AC3 // 积分累计值 +R VD1004*AC0, AC3 // Ki * T * E(k) ) MOVR AC3, VD2016 // 微分项带滤波 MOVR AC0-AC1, VD2024 // E(k)-E(k-1) /R VD1012, VD2024 // 除以采样周期T *R VD1008, VD2024 // Kd * [E(k)-E(k-1)]/T // 输出合成 MOVR VD2020+VD2016+VD2024, VD1020 // PID输出这段代码最骚的地方是积分分离策略。当输出超过设定阈值时自动暂停积分,防止阀门卡死——这招在控制气缸这类执行机构时贼管用。Kp/Ki/Kd三个参数直接用的VD1000、VD1004、VD1008这类V区地址,意味着触摸屏上随便拖几个数值输入框就能实时调参。
西门子200smart 自写PID功能块,西门子200smartPLC本身只支持8路PID而且不支持PID参数变量引接到触摸屏以及上位机,这给实际项目运用以及调试带来不少麻烦。 功能块是自写的PID,可以免去自己重写PID程序的麻烦,方便快速开发,如果有需要拿来研究学习也可以,算法完整,而且注释详细!!!
参数绑定更是简单粗暴:
// 在功能块调用时传参 CALL PID_Block, PV_Address:=VW500, // 过程量地址 SV_Address:=VW502, // 设定值地址 Output_Address:=VW504, // 输出量地址 Kp:=VD1000, Ki:=VD1004, Kd:=VD1008V区地址全开放的设计,让威纶通、MCGS这些触摸屏直接通过Modbus协议就能读写参数。实测在20ms采样周期下,8个PID回路同时跑CPU占用率不到15%,比原厂自带的PID省资源得多。
避坑指南:
- 微分项建议加个一阶低通滤波(代码里已经内置),否则现场传感器噪声能让你体验什么叫"抽风式控制";
- 输出限幅一定要做!曾经有个项目没加限制,PID输出直接干到32767,气缸当场表演"人间大炮";
- 调用功能块时记得用
SM0.0常开触点激活,别用定时器触发——PID算法最怕的就是计算周期不稳。
最后附上调试彩蛋:某次在造纸厂调张力控制,把积分时间设成0.1秒,结果卷纸机直接跳起踢踏舞。后来发现机械传动有0.5秒延迟,把采样周期拉到200ms立马稳如老狗——所以说,参数不是越灵敏越好,得看现场实际响应。
需要源码的兄弟直接评论区喊一嗓子,注释写得比小黄文还详细,保准你三天上手PID玄学调参。