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

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