FUNCTION_BLOCK CRC
(*Процедура подсчета CRC*)
(*
(C) by Jeck 2009
*)


VAR_INPUT
INPUT:ARRAY [0..1023] OF BYTE; (*входной буфер*)
sz: DWORD;(*длина буфера*)
END_VAR
VAR_OUTPUT
CRC16: WORD;
END_VAR
VAR
B: INT;
N: INT;
C: BOOL;
END_VAR

________________________________


CRC16:=16#FFFF;
B:=0;
N:=0;
REPEAT
CRC16:= CRC16 XOR BYTE_TO_WORD(INPUT[B]);
N:=0;
REPEAT
C:=CRC16.0;
CRC16:=SHR(CRC16,1);
IF C THEN
CRC16:= CRC16 XOR 16#A001;
END_IF
N:=N+1;
UNTIL
N>7
END_REPEAT
B:=B+1;
UNTIL
B>sz
END_REPEAT