引用 hello8879 在 2017/6/16 21:38:07 发言【内容省略】
以指令内容为例:计算从驱动器地址到发后记录中的字节。
计算方法如下:
CRC 的计算, 开始对一个16 位寄存器预装全1。然后将报文中的连续的8 位子节对其进行后
续的计算。只有字符中的8个数据位参与生成CRC 的运算,起始位,停止位和校验位不参与CRC
计算。
CRC 的生成过程中, 每个 8–位字符与寄存器中的值异或。然后结果向最低有效位(LSB)方向
移动(Shift) 1位,而最高有效位(MSB)位置充零。然后提取并检查LSB:如果LSB 为1, 则寄存
器中的值与一个固定的预置值异或;如果LSB 为 0, 则不进行异或操作。
这个过程将重复直到执行完8 次移位。完成最后一次(第8 次)移位及相关操作后,下一个8
位字节与寄存器的当前值异或,然后又同上面描述过的一样重复8 次。当所有报文中子节都运算之
后得到的寄存器的最终值,就是CRC。
流程如下:
手工计算你可以参照下面的图示,估计你要算到昏过去,用ExecL方式来手工计算比你用纸笔的效率高。
最后,上面讨论的仅仅是常用的基于ModbusRTU下CRC-16的讨论,鉴于CRC校验方式种类较多,以及ModbusASC方式下的LRC校验方式,如果你有不同的见解,也可以开新帖讨论。
Good Luck~