crc问题,请教高手

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年7月4日 下午11:13
下一篇 2021年7月4日

相关推荐

发表回复

登录后才能评论