FUNCTION_BLOCK GETCRC16
VAR_EXTERNAL
  VALCRC : array[0..100] of byte;
END_VAR

VAR_INPUT
   CRC_ADR :dword;
   CRC_LEN :word;
END_VAR

VAR_OUTPUT
   CRC16H :byte; 
   CRC16L :byte;
END_VAR

VAR
(*CRC计算用定义*)
   CRC16Lo,CRC16Hi : Byte;     
   CL,CH : Byte;		
   SaveHi,SaveLo : Byte;
   Flag: Int;
   	i : int;
	j : int;
	k : int;
(*	MemToVar : AdvMemToVar;
	VarToMem : AdvVarToMem;
*)
END_VAR

(*Automatically declared*)
VAR_EXTERNAL
END_VAR
(**   {*MemToVar(EN :=true , DW_MEM_ADDR :=CRC_ADR , W_MEM_LEN :=CRC_LEN , STR_FILENAME :='OPCDA1' , STR_VARNAME :='VALCRC' );*} **)
(**       CRC16Lo := 255; **)
	(* assign - Stmt *)
	LD 255
	ST CRC16Lo

(** 	  CRC16Hi := 255; **)
	(* assign - Stmt *)
	LD 255
	ST CRC16Hi

(** 	  CL := 1; **)
	(* assign - Stmt *)
	LD 1
	ST CL

(** 	  CH := 160; **)
	(* assign - Stmt *)
	LD 160
	ST CH

(**    **)
(** 	  For i := 0 To (word_to_int(CRC_LEN)-1) by 1 do **)
	(* for - Init *)
	LD 0
	ST i
	EQ( CRC_LEN
	word_to_int 
	SUB 1
	)
	JMPC ODK_FOR_STMTS_000000000000001

	(* for - Cond *)
	ODK_FOR_000000000000001:

	LD 0
	GT( CRC_LEN
	word_to_int 
	SUB 1
	)
	JMPC ODK_FOR_DOWN_000000000000001

	LD 0
	GT 1
	JMPC ODK_END_FOR_000000000000001

	LD CRC_LEN
	word_to_int 
	SUB 1
	LT i
	JMPC ODK_END_FOR_000000000000001
	JMP ODK_FOR_STMTS_000000000000001

	ODK_FOR_DOWN_000000000000001:

	LD CRC_LEN
	word_to_int 
	SUB 1
	GT i
	JMPC ODK_END_FOR_000000000000001

	LD 0
	LT 1
	JMPC ODK_END_FOR_000000000000001

		(* for - Stmts *)
		ODK_FOR_STMTS_000000000000001:

(** 	    CRC16Lo := CRC16Lo Xor VALCRC[i];  **)
		(* assign - Stmt *)
		LD CRC16Lo
		XOR VALCRC[i]
		ST CRC16Lo

(** 	    For Flag := 0 To 7 by 1 do **)
		(* for - Init *)
		LD 0
		ST Flag
		EQ 7
		JMPC ODK_FOR_STMTS_000000000000002

		(* for - Cond *)
		ODK_FOR_000000000000002:

		LD 0
		GT 7
		JMPC ODK_FOR_DOWN_000000000000002

		LD 0
		GT 1
		JMPC ODK_END_FOR_000000000000002

		LD 7
		LT Flag
		JMPC ODK_END_FOR_000000000000002
		JMP ODK_FOR_STMTS_000000000000002

		ODK_FOR_DOWN_000000000000002:

		LD 7
		GT Flag
		JMPC ODK_END_FOR_000000000000002

		LD 0
		LT 1
		JMPC ODK_END_FOR_000000000000002

			(* for - Stmts *)
			ODK_FOR_STMTS_000000000000002:

(** 	      SaveHi := CRC16Hi; **)
			(* assign - Stmt *)
			LD CRC16Hi
			ST SaveHi

(** 	      SaveLo := CRC16Lo; **)
			(* assign - Stmt *)
			LD CRC16Lo
			ST SaveLo

(** 	      CRC16Hi := shr(CRC16Hi,1);             **)
			(* assign - Stmt *)
			LD CRC16Hi
			shr 1
			ST CRC16Hi

(** 	      CRC16Lo := shr(CRC16Lo,1); **)
			(* assign - Stmt *)
			LD CRC16Lo
			shr 1
			ST CRC16Lo

(** 	             **)
(** 		      If ((SaveHi And 1) = 1) Then  **)
			(* if - Cond *)
			LD SaveHi
			AND 1
			EQ 1
			JMPCN ODK_SKIP_000000000000003_000000000000001

				(* then - Stmts *)

(** 		        CRC16Lo := CRC16Lo Or 128;       **)
				(* assign - Stmt *)
				LD CRC16Lo
				OR 128
				ST CRC16Lo

				JMP ODK_END_IF_000000000000003

(** 		      End_If;                            **)
			(* if - End *) 
			ODK_SKIP_000000000000003_000000000000001:
			ODK_END_IF_000000000000003:

(** 		      If ((SaveLo And 1) = 1) Then  **)
			(* if - Cond *)
			LD SaveLo
			AND 1
			EQ 1
			JMPCN ODK_SKIP_000000000000004_000000000000001

				(* then - Stmts *)

(** 		        CRC16Hi := CRC16Hi Xor CH; **)
				(* assign - Stmt *)
				LD CRC16Hi
				XOR CH
				ST CRC16Hi

(** 		        CRC16Lo := CRC16Lo Xor CL; **)
				(* assign - Stmt *)
				LD CRC16Lo
				XOR CL
				ST CRC16Lo

				JMP ODK_END_IF_000000000000004

(** 		      End_If; **)
			(* if - End *) 
			ODK_SKIP_000000000000004_000000000000001:
			ODK_END_IF_000000000000004:

		(* for - By *)
		LD 1
		ADD Flag
		ST Flag
(** 	     end_for; **)

		JMP ODK_FOR_000000000000002

		(* for - End *) 
		ODK_END_FOR_000000000000002:

	(* for - By *)
	LD 1
	ADD i
	ST i
(** 	  **)
(** 	   end_for; **)

	JMP ODK_FOR_000000000000001

	(* for - End *) 
	ODK_END_FOR_000000000000001:

(**     **)
(** 	 CRC16H:=CRC16Lo; **)
	(* assign - Stmt *)
	LD CRC16Lo
	ST CRC16H

(** 	 CRC16L:=CRC16Hi;  **)
	(* assign - Stmt *)
	LD CRC16Hi
	ST CRC16L

(**  **)
(**  **)
(**  **)
(**  **)
(**  **)
(**  **)
(**  **)

END_FUNCTION_BLOCK