有尝服务
最佳答案
自己编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