恭喜,你发布的帖子
发布于 2018-11-14 07:47:37
1楼
之前论坛一个大师写的,名字不记得了,今天分享给你:
FUNCTION FC16 : WORD
// ModBus CRC16算法
CONST
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; //CRC16Lo为CRC寄存器低8位
CRC16Hi := 16#FF; //CRC16Hi为CRC寄存器高8位
CL := 16#01;
CH := 16#A0; // A001 H 是CRC-16多项式代码
FOR i := 0 TO Count-1 DO
CRC16Lo := CRC16Lo XOR Byte_Array[i]; //每一个数据与CRC寄存器异或
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 //如果高位字节最后一位是1的话
CRC16Lo := CRC16Lo OR 16#80; //低位字节右移后前面补1
END_IF;
IF ((UseLo AND 16#1) = 16#1) THEN //如果LSB 为1,则与多项式进行异或
CRC16Hi := CRC16Hi XOR CH;
CRC16Lo := CRC16Lo XOR CL;
END_IF;
END_FOR;
END_FOR;
FC16 := SHL(IN:=CRC16Lo, N:=8) OR CRC16Hi;
END_FUNCTION
请填写推广理由:
分享
只看
楼主