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.
 
 
 
 
 
 

421 lines
6.8 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
(*Automatically declared*)
VAR_EXTERNAL
END_VAR
(** {* **)
(** **)
(** 时 间:20191006 **)
(** 版 本:1.1 **)
(** 作 者:姚立 **)
(** 名 称:PID程序 **)
(** 说 明:用于PID控制计算 **)
(** 备 注:修正了除0情况的报错发生 **)
(** 依赖块:无 **)
(** **)
(** *} **)
(** **)
(** IF RUN=TRUE AND kp<>0.0 AND Ti<>0.0 THEN **)
(* if - Cond *)
LD RUN
EQ TRUE
AND ( kp
NE 0.0
)
AND ( Ti
NE 0.0
)
JMPCN ODK_SKIP_000000000000001_000000000000001
(* then - Stmts *)
(** IF (TIME2<>(DINT_TO_REAL(TIME_TO_DINT(GetTime(t#0ms))))) THEN **)
(* if - Cond *)
LD TIME2
NE ( t#0ms
GetTime
TIME_TO_DINT
DINT_TO_REAL
)
JMPCN ODK_SKIP_000000000000002_000000000000001
(* then - Stmts *)
(** TIME1:=TIME2; **)
(* assign - Stmt *)
LD TIME2
ST TIME1
(** TIME2:=DINT_TO_REAL(TIME_TO_DINT(GetTime(t#0ms))); **)
(* assign - Stmt *)
LD t#0ms
GetTime
TIME_TO_DINT
DINT_TO_REAL
ST TIME2
(** Y1:=Y2; **)
(* assign - Stmt *)
LD Y2
ST Y1
(** Y2:=Y3; **)
(* assign - Stmt *)
LD Y3
ST Y2
(** Y3:=SET-(Kfb*FB); **)
(* assign - Stmt *)
LD SET
SUB ( Kfb
MUL FB
)
ST Y3
(** IF I>=2 AND DEAD_BAND<ABS(Y3) THEN{*死区*} **)
(* if - Cond *)
LD I
GE 2
AND ( DEAD_BAND
LT ( Y3
ABS
)
)
JMPCN ODK_SKIP_000000000000003_000000000000001
(* then - Stmts *)
(** OUTP:=Y3*Kp; **)
(* assign - Stmt *)
LD Y3
MUL kp
ST OUTP
(** Delta:=(TIME2-TIME1)/1000.0; **)
(* assign - Stmt *)
LD TIME2
SUB TIME1
DIV 1000.0
ST Delta
(** IF STOP_I<>TRUE THEN **)
(* if - Cond *)
LD STOP_I
NE TRUE
JMPCN ODK_SKIP_000000000000004_000000000000001
(* then - Stmts *)
(** OUTI:=OUTI+((Y2+Y3)*Delta/2.0)/Ti; **)
(* assign - Stmt *)
LD OUTI
ADD ( Y2
ADD Y3
MUL Delta
DIV 2.0
DIV Ti
)
ST OUTI
(** IF OUTI>Ymax THEN{*防止积分过大*} **)
(* if - Cond *)
LD OUTI
GT Ymax
JMPCN ODK_SKIP_000000000000005_000000000000001
(* then - Stmts *)
(** OUTI:=Ymax; **)
(* assign - Stmt *)
LD Ymax
ST OUTI
JMP ODK_END_IF_000000000000005
(** ELSIF OUTI<(0.0-Ymax) THEN **)
(* elseif - Cond *)
ODK_SKIP_000000000000005_000000000000001:
LD OUTI
LT ( 0.0
SUB Ymax
)
JMPCN ODK_SKIP_000000000000005_000000000000002
(* elsif - Stmts *)
(** OUTI:=(0.0-Ymax); **)
(* assign - Stmt *)
LD 0.0
SUB Ymax
ST OUTI
JMP ODK_END_IF_000000000000005
(** END_IF; **)
(* if - End *)
ODK_SKIP_000000000000005_000000000000002:
ODK_END_IF_000000000000005:
JMP ODK_END_IF_000000000000004
(** END_IF; **)
(* if - End *)
ODK_SKIP_000000000000004_000000000000001:
ODK_END_IF_000000000000004:
(** IF STOP_D<>TRUE THEN **)
(* if - Cond *)
LD STOP_D
NE TRUE
JMPCN ODK_SKIP_000000000000006_000000000000001
(* then - Stmts *)
(** OUTD:=Td*(0.5*Y1-2.0*Y2+1.5*Y3)/Delta; **)
(* assign - Stmt *)
LD Td
MUL ( 0.5
MUL Y1
SUB ( 2.0
MUL Y2
)
ADD ( 1.5
MUL Y3
)
)
DIV Delta
ST OUTD
JMP ODK_END_IF_000000000000006
(** END_IF; **)
(* if - End *)
ODK_SKIP_000000000000006_000000000000001:
ODK_END_IF_000000000000006:
JMP ODK_END_IF_000000000000003
(** ELSE **)
(* else *)
ODK_SKIP_000000000000003_000000000000001:
(* else - Stmts *)
(** I:=I+1; **)
(* assign - Stmt *)
LD I
ADD 1
ST I
(** END_IF; **)
(* if - End *)
ODK_END_IF_000000000000003:
JMP ODK_END_IF_000000000000002
(** END_IF; **)
(* if - End *)
ODK_SKIP_000000000000002_000000000000001:
ODK_END_IF_000000000000002:
(** {* Adder *} **)
(** IF OUTP+OUTI+OUTD>Ymax THEN **)
(* if - Cond *)
LD OUTP
ADD OUTI
ADD OUTD
GT Ymax
JMPCN ODK_SKIP_000000000000007_000000000000001
(* then - Stmts *)
(** OUT:=Ymax; **)
(* assign - Stmt *)
LD Ymax
ST OUT
JMP ODK_END_IF_000000000000007
(** ELSIF OUTP+OUTI+OUTD<Ymin THEN **)
(* elseif - Cond *)
ODK_SKIP_000000000000007_000000000000001:
LD OUTP
ADD OUTI
ADD OUTD
LT Ymin
JMPCN ODK_SKIP_000000000000007_000000000000002
(* elsif - Stmts *)
(** OUT:=Ymin; **)
(* assign - Stmt *)
LD Ymin
ST OUT
JMP ODK_END_IF_000000000000007
(** ELSE **)
(* else *)
ODK_SKIP_000000000000007_000000000000002:
(* else - Stmts *)
(** OUT:=OUTP+OUTI+OUTD; **)
(* assign - Stmt *)
LD OUTP
ADD OUTI
ADD OUTD
ST OUT
(** END_IF; **)
(* if - End *)
ODK_END_IF_000000000000007:
JMP ODK_END_IF_000000000000001
(** **)
(** ELSE **)
(* else *)
ODK_SKIP_000000000000001_000000000000001:
(* else - Stmts *)
(** TIME1:=0.0; **)
(* assign - Stmt *)
LD 0.0
ST TIME1
(** TIME2:=0.0; **)
(* assign - Stmt *)
LD 0.0
ST TIME2
(** Y1:=0.0; **)
(* assign - Stmt *)
LD 0.0
ST Y1
(** Y2:=0.0; **)
(* assign - Stmt *)
LD 0.0
ST Y2
(** Y3:=0.0; **)
(* assign - Stmt *)
LD 0.0
ST Y3
(** CYCL:=FALSE; **)
(* assign - Stmt *)
LD FALSE
ST CYCL
(** START:=FALSE; **)
(* assign - Stmt *)
LD FALSE
ST START
(** Delta:=0.0; **)
(* assign - Stmt *)
LD 0.0
ST Delta
(** OUTP:=0.0; **)
(* assign - Stmt *)
LD 0.0
ST OUTP
(** OUTI:=0.0; **)
(* assign - Stmt *)
LD 0.0
ST OUTI
(** OUTD:=0.0; **)
(* assign - Stmt *)
LD 0.0
ST OUTD
(** OUT :=0.0; **)
(* assign - Stmt *)
LD 0.0
ST OUT
(** I :=0; **)
(* assign - Stmt *)
LD 0
ST I
(** END_IF; **)
(* if - End *)
ODK_END_IF_000000000000001:
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
(** **)
END_FUNCTION_BLOCK