modbus RTU中,需要crc进行校验,要求低字节在前,高字节在后。书上说,如数据帧为0101023803EA3D,crc码为3DEA。(不明白为什么,我算的是16#845A)已知是CRC-16校验,生成多项式即16#8005,逆序16#A001,发现01010238033DEA并不能整除16#8005,想问:S7-200中的CRC码格式究竟是如何定义的?比如,是否逆序,取反?
问题补充:
苦斗老师讲的我都明白,关键我想弄明白S7-200中定义的CRC格式,比如寄存器初始化为$FFFF,意义何在?200如何进行校验检查,等等。
最佳答案
没必要搞清它的数学推导过程!
按下列顺序处理即可:
是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效!
每个8位字符都单独和寄存器内容相异或,结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值(16#A001)异或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相异或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。
CRC添加到消息中时,低字节先加入,然后高字节。
下面是我做的一个子程序仅供参考:
LD Always_On:SM0.0
WDR
MOVW 16#FFFF, LW6
WDR
FOR LW8, +1, #count:LW4
XORB *#start_add:*LD0, #crc_Lo:LB7
INCD #start_add:LD0
FOR LW10, +1, +8
SRW LW6, 1
LD Overflow_Illegal:SM1.1
XORW 16#A001, LW6
NEXT
NEXT
电子邮件内信我 给你详细讲解!
提问者对于答案的评价:
其实Modbus协议中的CRC校验顺序是逆序的,高低字节互换位置。初始化为16#FFFF是为了使CRC寄存器能判断出以0为起始为的源数据。
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc347004.html