将论坛里“学生在此”用户贴出的程序做了一些改动,用逐位法计算CRC,同样的程序在单片机里计算出来的CRC校验码跟PLC计算出的不一样,用网上下载的CRC校验软件得出的结果与单片机运行结果一样,不知道哪里出错了,希望大家指点指点!G(X)简记为1021.
FUNCTION_BLOCK "WCRC_FB"
TITLE =
VERSION : 0.1
VAR_INPUT
db_no : INT ;
dbb_no : INT ;
byte_len : INT ;
END_VAR
VAR_OUTPUT
wcrc : WORD ;
END_VAR
VAR
old_wcrc : WORD ;
c : BYTE ;
j : INT ;
END_VAR
VAR_TEMP
db_no1 : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
L #db_no
T #db_no1
OPN DB [#db_no1]
// 发送指令的起始字节放在指针AR1中
L #dbb_no
LAR1
//初始化old_wcrc=0xffff;
L W#16#FFFF
T #old_wcrc
// 进入大循环,byte_len:需要计算CRC的字节个数
loop: L #byte_len
L 0
<=I
JC end
//c:字节
L DBB [AR1,P#0.0]
T #c
//字节与crc寄存器异或
L #old_wcrc
L #c
XOW
T #old_wcrc
//j:位个数
L 0
T #j
//判断一个字节是否计算完,j是否为8
a: L #j
L 8
>=I
JC b
//得到lsb位
L #old_wcrc
L W#16#1
AW
//判断lsb,为1:右移一位;为0:右移一位与1021异或。位指针加1
JZ c
L #old_wcrc
SRW 1
L W#16#1021
XOW
T #old_wcrc
c: L #old_wcrc
SRW 1
T #old_wcrc
L 1
L #j
+I
T #j
JU a
b: L -1
L #byte_len
+I
T #byte_len
//指向下一个字节
+AR1 P#1.0
//输出最终的CRC值
JU loop
end: L #old_wcrc
T #wcrc
BE
END_FUNCTION_BLOCK