西门子SMART200程序 PID的控制写法,突破8路,PID直接做成子程序,无密码,直接调用。

搞工控的兄弟都知道,S7-200 SMART自带的PID向导最多生成8路,这破限制逼疯过多少做复杂温控的老铁。今天教你们一个野路子——手动搓PID子程序,想开多少路就开多少路,跟下饺子似的随便整。

西门子SMART200程序 PID的控制写法,突破8路,PID直接做成子程序,无密码,直接调用。

先看这段核心代码:

//主程序调用示例
CALL PID_Control, 1, VD200, VD204, VD208, Q0.0

就这么简单粗暴,最后那个Q0.0直接怼输出点。重点在子程序里的骚操作:

//PID子程序SBR_0
LD SM0.0
MOVR VD0, VD100      //设定值转存
MOVR VD4, VD104      //反馈值转存
MOVR VD8, VD108      //输出地址
MOVD &VB10, VD112    //参数表首地址
+D  VD12*20, VD112   //动态偏移计算
PID VB112, 0         //核心指令
MOVR VD108, VD[VD108]//输出映射

重点在参数表的动态寻址。每个PID实例自动偏移20字节(实测参数表长度),用VD12存储回路编号。比如开20路就搞个循环指针:

//主程序扫描周期处理
LD SM0.1
MOVD 0, VD500   //初始化指针

LD SM0.0
FOR VW100, 1, 20  //20路循环
    MOVD VD500, VD12
    CALL PID_Control, VD12, ...  //传入不同IO地址
    +D 20, VD500
NEXT

这波操作直接把系统自带的8路限制按在地上摩擦。实测单个扫描周期处理32路PID(0.5ms间隔)还能稳定跑,注意三点:

  1. 每个回路单独配参数表区域
  2. 输出地址别撞车
  3. 别手贱用向导生成的PID,会跟咱们的土制PID抢资源

遇到震荡别慌,八成是采样周期没调好。记住这个公式:采样时间=扫描周期×回路数+2ms冗余。搞温控的话,建议把PID计算放在定时中断里更稳。

最后扔个真实项目里的参数表结构:

VB10~VB30: 第1路参数(比例/积分/微分...)
VB30~VB50: 第2路参数
...
VBn~VBn+20: 第N路参数

参数首地址直接往子程序里怼就行,维护起来比系统自带的向导生成的代码清爽十倍。需要改参数直接往对应V区写数据,连HMI都不用重新配变量。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐