登录
首页 PLC论坛 三菱Mitsubishi
回帖 发帖
正文

主题:CRC校验码是由哪几个数怎么计算出来的?

点击:5195 回复:7

小弟根据网络资料写了一个fx2n 与安川 v7的485通讯控制程序,已测试可以正常运行停止,图片上是运行停止时候的监控数据,但是对这个程序原理还不太懂,不知道这个上下位的CRC校验码是由哪几个数计算出来的,用什么方式计算的,自己用crc计数器算得对不上
17-06-16 21:36
附件 启动停止.jpg
17-06-16 21:38
你这个近似modbus.最后那列是异常.
如果和你用CRC计算的不一样,可以参考modicon.com的modbus协议文本,里面有专门的CRC计算方法.
但是,很多机器CRC会自动计算,不用关心.
17-06-17 06:44
从地址码到最后一个数据码中间的所有数据
17-06-17 06:52

引用 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。
流程如下:
附件 snap1.jpg
手工计算你可以参照下面的图示,估计你要算到昏过去,用ExecL方式来手工计算比你用纸笔的效率高。
附件 snap2.jpg
最后,上面讨论的仅仅是常用的基于ModbusRTU下CRC-16的讨论,鉴于CRC校验方式种类较多,以及ModbusASC方式下的LRC校验方式,如果你有不同的见解,也可以开新帖讨论。
Good Luck~
17-06-17 06:57
三菱的3u开始是不是就有crc指令了,2n的话用子程序写个crc校验程序,然后调用李金城老师的书上有实例。
17-06-17 08:50
这个CRC校验码分上位和下位,都是16位的,也就是说发送的这13个数据中包含2个16位的校验码,想知道每个校验码是由哪几个数计算来的,单个的数据计算crc我知道,可是这里出现了2个高低位,头晕了
附件 000.jpg
17-06-17 10:43

引用 hello8879 在 2017/6/17 10:43:39 发言【内容省略】

其实CRC的校验的基本单位是位,是按位异或校验,上面流程图已经明确了,一个字节一个字节,每个字节校验8次,每个位都校验,所以你不需要去纠结如何计算的。
如果你一定要纠结如何计算的,那么去花点时间阅读一下我贴出的图片以及手工校验一下。
不过我觉得你基础还不够扎实,这样也搞不清通讯的计算过程。
Good Luck~
17-06-17 12:30

工控新闻

更多新闻资讯