那位老师能告诉我自己编写PID控制的程序S7-200

有尝服务

最佳答案

自己编PID?这很好,呵呵。  不过你需要先确定你到底要干什么,也就是说你的PID是用来干嘛的?  
 你需要的是纯比例控制?还是比例+积分?还是比例+积分+微分?  是增量式的还是位置式的?
 你需要微分先行吗? 需要积分分离吗?需要死区吗?需要可变系数吗?  等等... ...可以说涉及的东西还挺多,不是几句话就能说明的。你可以去找一本这方面的书详细的了解一下各种PID的方法及作用。下面是我用S7-200自己写的一个用MM440变频器控制张力的PI(没有微分作用),增量式的,没有死区,也没有积分分离,也没有微分先行等。(根据自己的工艺写)
 SUBROUTINE_BLOCK 张力:SBR1
 TITLE=张力控制
 VAR_INPUT
 Sv:INT; // PID设定值
 Pv:INT; // PID反馈值
 Kc:INT; // 比例系数
 Ki:INT; // 积分系数
 F:REAL; // 额定频率工程量值16384=4000H=50HZ
 LMTMax:REAL; // 上限限幅值
 LMTMin:REAL; // 下限限幅值
 EnCheck:BOOL; // 使能断带检测
 END_VAR
 VAR_IN_OUT
 PvLast:INT; // 反馈值上一周期值
 OutLast:REAL; // 输出值上一周期值
 END_VAR
 VAR_OUTPUT
 Errer:BOOL; // 断带标志
 Out:INT; // PID输出值
 END_VAR
 BEGIN
 Network 1 
 // Pv(k-1)-Pv(k)
 LD     SM0.0
 MOVW   #PvLast, AC1
 -I     #Pv, AC1
 Network 2 
 LDN    #EnCheck                    //禁止断带检测
 R      #Errer, 1
 JMP    0
 Network 3 
 LD     SM1.2                       //张力在增大
 R      #Errer, 1
 NOT                                //张力在减小
 S      #Errer, 1
 Network 4 
 LBL    0
 Network 5 
 // U(k)=U(k-1) + △U         △U=Kc[E(k)-E(k-1)]+KiE(k)=Kc[Pv(k-1)-Pv(k)]  + Ki[Sv-Pv]     
 LD     SM0.0
 MOVW   #Pv, #PvLast
 MOVW   #Sv, AC2
 -I     #Pv, AC2
 MUL    #Kc, AC1                    //比例项 
 MUL    #Ki, AC2                    //积分项
 +D     AC1, AC2
 DTR    AC2, AC3
 *R     #F, AC3                     //乘以额定频率工程量值(5000=50.00HZ=4000H)
 /R     3.2767E+007, AC3            //1000*32767;HMI内PI参数为三位小数,故除以1000 
 +R     AC3, #OutLast
 Network 6 
 // 上限限幅
 LDR>   #OutLast, #LMTMax
 MOVR   #LMTMax, #OutLast
 Network 7 
 // 下限限幅
 LDR<   #OutLast, #LMTMin
 MOVR   #LMTMin, #OutLast
 Network 8 
 // 输出
 LD     SM0.0
 ROUND  #OutLast, AC3
 DTI    AC3, #Out
 Network 9 
 Network 10 

 END_SUBROUTINE_BLOCK

 
 

提问者对于答案的评价:
你好谢谢了我做中央空调工程的需要恒温恒湿控制新风机组温度精度在0.1度以下用那种控制比较好有位老师说自己编的不容易死机为啥只用PI调节可以吗

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc359663.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年7月5日 上午11:06
下一篇 2021年7月5日 上午11:06

相关推荐

发表回复

登录后才能评论