发布于 2014-12-26 13:22:58
2楼
FUNCTION FC16 : WORD
//
// ModBus CRC16算法
// www.tansoo.cn
CONST
// Constants
ARRAY_COUNT := 32;
END_CONST
VAR_INPUT
Byte_Array : ARRAY[0..ARRAY_COUNT-1] OF BYTE;
Count : INT;
END_VAR
VAR_TEMP
CRC16Lo, CRC16Hi, CL, CH, UseHi, UseLo: WORD;
i, index: INT;
END_VAR
CRC16Lo := 16#FF;
CRC16Hi := 16#FF;
CL := 16#01;
CH := 16#A0;
FOR i := 0 TO Count-1 DO
CRC16Lo := CRC16Lo XOR Byte_Array[i];
FOR index := 0 TO 7 DO
UseHi := CRC16Hi;
UseLo := CRC16Lo;
CRC16Hi := SHR (IN:=CRC16Hi, N:=1);
CRC16Lo := SHR (IN:=CRC16Lo, N:=1);
IF ((UseHi AND 16#1) = 16#1) THEN
CRC16Lo := CRC16Lo OR 16#80;
END_IF;
IF ((UseLo AND 16#1) = 16#1) THEN
CRC16Hi := CRC16Hi XOR CH;
CRC16Lo := CRC16Lo XOR CL;
END_IF;
END_FOR;
END_FOR;
FC016 := SHL(IN:=CRC16Lo, N:=8) OR CRC16Hi;
END_FUNCTION
个人博客 www.tansoo.cn