发布于 2011-11-08 17:50:23
8楼
最简单的PID程序(未验证)
SUBROUTINE_BLOCK PIDCal:SBR0
TITLE=
VAR_INPUT
set:INT; // 给定
back:INT; // 反馈
kp:REAL; // Kp
ki:REAL; // Ki
kd:REAL; // Kd
END_VAR
VAR_IN_OUT
initial:REAL; // 积分寄存
err:REAL; // e(n-1)
END_VAR
VAR_OUTPUT
result:INT; // 输出
END_VAR
VAR
temp:DINT;
temp0:REAL;
temp1:REAL;
END_VAR
BEGIN
Network 1
// P
LD SM0.0
-I LW2, LW0
ITD LW0, LD26
DTR LD26, LD30
*R LD30, LD4
*R LD30, LD8
+R LD16, LD8
MOVR LD8, LD16
+R LD8, LD4
MOVR LD30, LD34
-R LD20, LD30
MOVR LD34, LD20
*R LD30, LD12
+R LD12, LD4
ROUND LD4, LD26
DTI LD26, LW24
Network 2
// 输出上限保护
LDW> LW24, 10000
MOVW 10000, LW24
Network 3
// 输出下限保护
LDW< LW24, 0
MOVW 0, LW24
END_SUBROUTINE_BLOCK