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

5 months ago
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