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.
 
 
 
 
 
 

258 lines
4.0 KiB

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