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