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.
95 lines
1.6 KiB
95 lines
1.6 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
|
|
(*
|
|
|
|
时 间: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;
|
|
p2:=&CRC_IN;
|
|
v2v(DEST :=p1 , SRC :=p2 , LENGTH :=CRC_LEN , IQM :=0 );
|
|
CRC16Lo := 255;
|
|
CRC16Hi := 255;
|
|
CL := 1;
|
|
CH := 160;
|
|
|
|
For i := 0 To (CRC_LEN-1) by 1 do
|
|
CRC16Lo := CRC16Lo Xor VALCRC[i];
|
|
For Flag := 0 To 7 by 1 do
|
|
SaveHi := CRC16Hi;
|
|
SaveLo := CRC16Lo;
|
|
CRC16Hi := shr(CRC16Hi,1);
|
|
CRC16Lo := shr(CRC16Lo,1);
|
|
|
|
If ((SaveHi And 1) = 1) Then
|
|
CRC16Lo := CRC16Lo Or 128;
|
|
End_If;
|
|
If ((SaveLo And 1) = 1) Then
|
|
CRC16Hi := CRC16Hi Xor CH;
|
|
CRC16Lo := CRC16Lo Xor CL;
|
|
End_If;
|
|
end_for;
|
|
|
|
end_for;
|
|
|
|
CRC16H:=CRC16Lo;
|
|
CRC16L:=CRC16Hi;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
END_FUNCTION_BLOCK
|