You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
2.0 KiB
132 lines
2.0 KiB
FUNCTION_BLOCK BS_PID
|
|
VAR_EXTERNAL
|
|
|
|
END_VAR
|
|
|
|
VAR_INPUT
|
|
RUN : BOOL ; (* PID功能块启用 *)
|
|
STOP_D : BOOL ; (* 微分启停 *)
|
|
STOP_I : BOOL ; (* 积分启停 *)
|
|
SET : REAL ; (* PID调节目标值 *)
|
|
FB : REAL ; (* PID调节目标值的反馈值 *)
|
|
Kfb : REAL:=1.0; (* 反馈参数 *)
|
|
Kp : REAL:=30.0 ; (* 比例参数 *)
|
|
Ti : REAL:=150.0 ; (* 积分参数 *)
|
|
Td : REAL ; (* 微分参数 *)
|
|
Dead_Band : REAL; (* 死区 *)
|
|
Ymax : REAL ; (* 最大输出值 *)
|
|
Ymin : REAL ; (* 最小输出值 *)
|
|
END_VAR
|
|
|
|
VAR_OUTPUT
|
|
OUT : REAL ; (* 积分最大输出值 *)
|
|
END_VAR
|
|
|
|
VAR
|
|
TIME1 : REAL ;
|
|
TIME2 : REAL ;
|
|
Y1 : REAL ;
|
|
Y2 : REAL ;
|
|
Y3 : REAL ;
|
|
CYCL : BOOL ;
|
|
START : BOOL ;
|
|
Delta : REAL ;
|
|
OUTP : REAL ;
|
|
OUTI : REAL ;
|
|
OUTD : REAL ;
|
|
I : DINT ;
|
|
END_VAR
|
|
(*
|
|
|
|
时 间:20191006
|
|
版 本:1.1
|
|
作 者:姚立
|
|
名 称:PID程序
|
|
说 明:用于PID控制计算
|
|
备 注:修正了除0情况的报错发生
|
|
依赖块:无
|
|
|
|
*)
|
|
|
|
IF RUN=TRUE AND kp<>0.0 AND Ti<>0.0 THEN
|
|
IF (TIME2<>(DINT_TO_REAL(TIME_TO_DINT(GetTime(t#0ms))))) THEN
|
|
TIME1:=TIME2;
|
|
TIME2:=DINT_TO_REAL(TIME_TO_DINT(GetTime(t#0ms)));
|
|
Y1:=Y2;
|
|
Y2:=Y3;
|
|
Y3:=SET-(Kfb*FB);
|
|
IF I>=2 AND DEAD_BAND<ABS(Y3) THEN(*死区*)
|
|
OUTP:=Y3*Kp;
|
|
Delta:=(TIME2-TIME1)/1000.0;
|
|
IF STOP_I<>TRUE THEN
|
|
OUTI:=OUTI+((Y2+Y3)*Delta/2.0)/Ti;
|
|
IF OUTI>Ymax THEN(*防止积分过大*)
|
|
OUTI:=Ymax;
|
|
ELSIF OUTI<(0.0-Ymax) THEN
|
|
OUTI:=(0.0-Ymax);
|
|
END_IF;
|
|
END_IF;
|
|
IF STOP_D<>TRUE THEN
|
|
OUTD:=Td*(0.5*Y1-2.0*Y2+1.5*Y3)/Delta;
|
|
END_IF;
|
|
ELSE
|
|
I:=I+1;
|
|
END_IF;
|
|
END_IF;
|
|
(* Adder *)
|
|
IF OUTP+OUTI+OUTD>Ymax THEN
|
|
OUT:=Ymax;
|
|
ELSIF OUTP+OUTI+OUTD<Ymin THEN
|
|
OUT:=Ymin;
|
|
ELSE
|
|
OUT:=OUTP+OUTI+OUTD;
|
|
END_IF;
|
|
|
|
ELSE
|
|
TIME1:=0.0;
|
|
TIME2:=0.0;
|
|
Y1:=0.0;
|
|
Y2:=0.0;
|
|
Y3:=0.0;
|
|
CYCL:=FALSE;
|
|
START:=FALSE;
|
|
Delta:=0.0;
|
|
OUTP:=0.0;
|
|
OUTI:=0.0;
|
|
OUTD:=0.0;
|
|
OUT :=0.0;
|
|
I :=0;
|
|
END_IF;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
END_FUNCTION_BLOCK
|