老帖中发现的一个CRC校验,帖子说是正确的,可我感觉在第一个FOR循环,AC1在怎么加一,永远都是将&VB0的数据送给它啊,是我理解错误,还是程序有错误?怎么修改才好呢?
Network 1 // 网络标题
// 网络注释
LD SM0.1
MOVB 16#1, VB0
MOVB 16#1, VB1
MOVB 16#0, VB2
MOVB 16#20, VB3
MOVB 16#0, VB4
MOVB 16#20, VB5
Network 2
LD M0.1
FOR VW10, +1, +6
Network 3
LDW= VW10, +1
MOVW 16#FFFF, AC0
MOVD &VB0, AC1
Network 4
LD SM0.0
XORB *AC1, AC0
Network 5
LD SM0.0
FOR VW12, +1, +8
SRW AC0, 1
AENO
A SM1.1
XORW 16#A001, AC0
Network 6
NEXT
Network 7
LD SM0.0
INCD AC1
Network 8
NEXT
Network 9
LD M0.1
SWAP AC0
AENO
MOVW AC0, VW6
最佳答案
程序没问题,CRC本身的校验机制要清楚。请参考RTU协议给的CRC校验算法。
CRC开始时先把寄存器的16位全部置成“1”,然后把相邻2个8位字节的数据放入当前寄存器中,只有每个字符的8位数据用作产生CRC,起始位,停止位和奇偶校验位不加到CRC中。 产生CRC期间,每8位数据与寄存器中值进行异或运算,其结果向右移一位(向LSB方向),并用“0”填入MSB,检测LSB,若LSB为“1”则与预置的固定值异或,若LSB为“0”则不作异或运算。 重复上述处过程,直至移位8次,完成第8次移位后,下一个8位数据,与该寄存器的当前值异或,在所有信息处理完后,寄存器中的最终值为CRC值。
产生CRC的过程:
1. 把16位CRC寄存器置成FFFFH.
2. 第一个8位数据与CRC寄存器低8位进行异或运算,把结果放入CRC寄存器。
3. CRC寄存器向右移一位,MSB填零,检查LSB.
4. (若LSB为0):重复3,再右移一位。
(若LSB为1):CRC寄存器与Aool H 进行异或运算
5. 重复3和4直至完成8次移位,完成8位字节的处理。
6. 重复2至5步,处理下一个8位数据,直至全部字节处理完毕。
7. CRC寄存器的最终值为CRC值。
8. 把CRC值放入信息时,高8位和低8位应分开放置。
把CRC值放入信息中 ,发送信息中的16 位CRC值时,先送低8位,后送高8位。
提问者对于答案的评价:
谢谢您的回答,这次真的理解了。
专家置评
已阅,最佳答案正确。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc252980.html