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.
 
 
 
 
 
 

73 lines
1.3 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
(*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