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.
301 lines
4.8 KiB
301 lines
4.8 KiB
FUNCTION_BLOCK BS_GETCRC16
|
|
VAR_EXTERNAL
|
|
|
|
END_VAR
|
|
|
|
VAR_INPUT
|
|
(*CRC_ADR :dword;*)
|
|
CRC_IN : array[0..200] of byte;
|
|
CRC_LEN :INT;
|
|
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;
|
|
VALCRC : array[0..100] of byte;
|
|
v2v : NW_MemCopy;
|
|
p1,p2 : pointer;
|
|
(*
|
|
MemToVar : AdvMemToVar;
|
|
VarToMem : AdvVarToMem;
|
|
*)
|
|
END_VAR
|
|
|
|
(*Automatically declared*)
|
|
VAR_EXTERNAL
|
|
END_VAR
|
|
(** {* **)
|
|
(** **)
|
|
(** 时 间:20200924 **)
|
|
(** 版 本:1.0 **)
|
|
(** 作 者:姚立 **)
|
|
(** 名 称:CRC校验 **)
|
|
(** 说 明: **)
|
|
(** 备 注: **)
|
|
(** **)
|
|
(** INPUT: **)
|
|
(** CRC_IN : array[0..200] of byte; modbus发送序列 **)
|
|
(** **)
|
|
(** CRC_LEN :INT; 发送序列数据长度 **)
|
|
(** **)
|
|
(** **)
|
|
(** OUTPUT: **)
|
|
(** CRC16H :byte; **)
|
|
(** CRC16L :byte; **)
|
|
(** *} **)
|
|
(** **)
|
|
(** **)
|
|
(** **)
|
|
(** {*MemToVar(EN :=true , DW_MEM_ADDR :=CRC_ADR , W_MEM_LEN :=CRC_LEN , STR_FILENAME :='OPCDA1' , STR_VARNAME :='VALCRC' );*} **)
|
|
(** **)
|
|
(** p1:=&VALCRC; **)
|
|
(* assign - Stmt *)
|
|
LD &VALCRC
|
|
ST p1
|
|
|
|
(** p2:=&CRC_IN; **)
|
|
(* assign - Stmt *)
|
|
LD &CRC_IN
|
|
ST p2
|
|
|
|
(** v2v(DEST :=p1 , SRC :=p2 , LENGTH :=CRC_LEN , IQM :=0 ); **)
|
|
(* call - Stmt *)
|
|
CAL v2v (
|
|
DEST := p1,
|
|
SRC := p2,
|
|
LENGTH := CRC_LEN,
|
|
IQM := 0
|
|
)
|
|
|
|
(** 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 (CRC_LEN-1) by 1 do **)
|
|
(* for - Init *)
|
|
LD 0
|
|
ST i
|
|
EQ( CRC_LEN
|
|
SUB 1
|
|
)
|
|
JMPC ODK_FOR_STMTS_000000000000001
|
|
|
|
(* for - Cond *)
|
|
ODK_FOR_000000000000001:
|
|
|
|
LD 0
|
|
GT( CRC_LEN
|
|
SUB 1
|
|
)
|
|
JMPC ODK_FOR_DOWN_000000000000001
|
|
|
|
LD 0
|
|
GT 1
|
|
JMPC ODK_END_FOR_000000000000001
|
|
|
|
LD CRC_LEN
|
|
SUB 1
|
|
LT i
|
|
JMPC ODK_END_FOR_000000000000001
|
|
JMP ODK_FOR_STMTS_000000000000001
|
|
|
|
ODK_FOR_DOWN_000000000000001:
|
|
|
|
LD CRC_LEN
|
|
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
|