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_BANDTRUE 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