|
|
|
发表人:hequan005 |
发表时间:2010/10/8 12:49:00 |
|
发表新论题
|
FUNCTION FC300: VOID
VAR_INPUT
Source:ARRAY[0..19] OF BYTE;
Number:INT;
END_VAR
VAR_OUTPUT
CrcHigh,CrcLow:BYTE;
END_VAR
VAR_TEMP
Crc16Low, Crc16High, CLow, CHigh:BYTE;
SaveLow, SaveHigh:BYTE;
i, j:INT;
END_VAR
BEGIN
Crc16Low:=B#16#FF;
CRC16High:=B#16#FF;
CLow:=B#16#1;
CHigh:=B#16#A0;
FOR i:= 0 TO Number-1 BY 1 DO
Crc16Low:= Crc16Low XOR Source[i];
FOR j:= 0 TO 7 BY 1 DO
SaveHigh:= Crc16High;
SaveLow:= Crc16Low;
Crc16High:=SHR(IN:=Crc16High,N:=1);
Crc16Low:=SHR(IN:=Crc16Low,N:=1);
IF ((SaveHigh AND 2#1)=2#1) THEN
Crc16Low:= Crc16Low OR 2#10000000;
END_IF;
IF ((SaveLow AND 2#1) = 2#1) THEN //如果LSB为1,则与多项式码进行异或
CRC16High:= CRC16High XOR CHigh;
Crc16Low:= Crc16Low XOR CLow;
END_IF;
END_FOR;
END_FOR;
CrcHigh:=Crc16High;
CrcLow:=Crc16Low;
END_FUNCTION
1、装载16#FFFF到一个16位CRC寄存器;
2、将CRC寄存器的高8位字节与信息中的第一个8位字节相异或,结果返回到CRC寄存器中;
3、将CRC寄存器数据向右移动一位;
4、如果溢出的位等于1,则将CRC寄存器与16#A001相异或,结果返回到CRC寄存器中;
4、如果溢出的位等于0,则重复第3步;
5、重复第3、4步骤,直到已经移位了8次;
6、将CRC寄存器的高8位字节与信息中的下一个8位字节相异或,结果返回到CRC寄存器中;
7、重复第3步到第6步,直到信息中所有字节都与CRC寄存器相异或,并都移位了8次;
8、最后的CRC寄存器中的结果即为CRC校验码,最后被添加到信息(数据)的末尾(交换!低8位
|
|
|
回复人:wly1984 |
回复时间:2015/2/2 10:30:00 |
|
|
|
相关技术论坛: |
|
|