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