//移位指令不能用了,不知道是不是库没装好的问题,也懒得弄了,所以直接用的原始方法移位
变量声明:
FUNCTION FC_CRC16 : WORD
VAR_INPUT
DataArr : POINTER TO BYTE;
Length : UINT;
END_VAR
VAR
Temp : POINTER TO BYTE;
i : UINT;
RMoveValue : UINT;
CurData : BYTE;
CRC16L : BYTE;
CRC16H : BYTE;
END_VAR
程序:
IF Length<=0 THEN
FC_CRC16:=0;
RETURN;
END_IF
//CRC寄存器初始化
FC_CRC16:=16#FFFF;
RMoveValue:=0;
//CRC校验
WHILE Length<>0 DO
length:=Length-1;
CurData:=DataArr^;
FC_CRC16:=CurData XOR FC_CRC16;
FOR i:=0 TO 7 BY 1 DO
RMoveValue:=FC_CRC16 AND 16#1;
IF RMoveValue=1 THEN
FC_CRC16:=(FC_CRC16 AND 16#FFFE)/2;
FC_CRC16:=FC_CRC16 XOR 16#A001;
ELSIF RMoveValue=0 THEN
FC_CRC16:=(FC_CRC16 AND 16#FFFE)/2;
END_IF
END_FOR
DataArr:=DataArr+1;
END_WHILE
//字节转换
CRC16H:=WORD_TO_BYTE(FC_CRC16);
CRC16L:=WORD_TO_BYTE((FC_CRC16 AND 16#FF00)/256);
FC_CRC16:=CRC16H*256;
FC_CRC16:=FC_CRC16 OR CRC16L;
RETURN;