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.
64 lines
1.2 KiB
64 lines
1.2 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
|
|
(*MemToVar(EN :=true , DW_MEM_ADDR :=CRC_ADR , W_MEM_LEN :=CRC_LEN , STR_FILENAME :='OPCDA1' , STR_VARNAME :='VALCRC' );*)
|
|
CRC16Lo := 255;
|
|
CRC16Hi := 255;
|
|
CL := 1;
|
|
CH := 160;
|
|
|
|
For i := 0 To (word_to_int(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
|