您的位置:控制工程论坛网论坛 » 工程项目交流 » 请教MODBUS校验的计算方法:

yk_wangyu

yk_wangyu   |   当前状态:在线

总积分:3278  2024年可用积分:0

注册时间: 2006-12-04

最后登录时间: 2020-07-04

空间 发短消息加为好友

请教MODBUS校验的计算方法:

yk_wangyu  发表于 2008/12/6 10:28:58    精华  8290 查看 14 回复  [上一主题]  [下一主题]

手机阅读

版主加精华

我想通过MODBUS通讯协议将两个非同一品牌的电气器件联接在一起,在编程的过程中,MODBUS本身自带的通讯校验难住了,不知道其计算方法,我选择的通讯不带奇偶校验,请版主位教我一下.

1楼 0 0 回复
  • dingxiubing

    dingxiubing   |   当前状态:在线

    总积分:8127  2024年可用积分:0

    注册时间: 2006-07-13

    最后登录时间: 2020-12-10

    空间 发短消息加为好友

    dingxiubing   发表于 2008/12/2 16:24:31


    2楼 回复本楼

    引用 dingxiubing 2008/12/2 16:24:31 发表于2楼的内容

  • yk_wangyu

    yk_wangyu   |   当前状态:在线

    总积分:3278  2024年可用积分:0

    注册时间: 2006-12-04

    最后登录时间: 2020-07-04

    空间 发短消息加为好友

    yk_wangyu   发表于 2008/12/3 8:50:48

    3楼 回复本楼

    引用 yk_wangyu 2008/12/3 8:50:48 发表于3楼的内容

  • dingxiubing

    dingxiubing   |   当前状态:在线

    总积分:8127  2024年可用积分:0

    注册时间: 2006-07-13

    最后登录时间: 2020-12-10

    空间 发短消息加为好友

    dingxiubing   发表于 2008/12/3 9:07:35


    4楼 回复本楼

    引用 dingxiubing 2008/12/3 9:07:35 发表于4楼的内容

  • yk_wangyu

    yk_wangyu   |   当前状态:在线

    总积分:3278  2024年可用积分:0

    注册时间: 2006-12-04

    最后登录时间: 2020-07-04

    空间 发短消息加为好友

    yk_wangyu   发表于 2008/12/3 9:26:40

    5楼 回复本楼

    引用 yk_wangyu 2008/12/3 9:26:40 发表于5楼的内容

  • yk_wangyu

    yk_wangyu   |   当前状态:在线

    总积分:3278  2024年可用积分:0

    注册时间: 2006-12-04

    最后登录时间: 2020-07-04

    空间 发短消息加为好友

    yk_wangyu   发表于 2008/12/3 11:48:56

    6楼 回复本楼

    引用 yk_wangyu 2008/12/3 11:48:56 发表于6楼的内容

  • dingxiubing

    dingxiubing   |   当前状态:在线

    总积分:8127  2024年可用积分:0

    注册时间: 2006-07-13

    最后登录时间: 2020-12-10

    空间 发短消息加为好友

    dingxiubing   发表于 2008/12/3 11:51:57

    我用labview和plc分别做过modbus通讯,都不是自己写的校验码。
    7楼 回复本楼

    引用 dingxiubing 2008/12/3 11:51:57 发表于7楼的内容

  • yk_wangyu

    yk_wangyu   |   当前状态:在线

    总积分:3278  2024年可用积分:0

    注册时间: 2006-12-04

    最后登录时间: 2020-07-04

    空间 发短消息加为好友

    yk_wangyu   发表于 2008/12/3 12:25:41

    可以很清楚的看到主控电气产品发来的通讯指令,当我想模拟被控电气产品发送一帧回复时,指令编完了却不会编写校验码.
    8楼 回复本楼

    引用 yk_wangyu 2008/12/3 12:25:41 发表于8楼的内容

  • liwenqun_sias

    liwenqun_sias   |   当前状态:离线

    总积分:3983  2024年可用积分:0

    注册时间: 2008-09-09

    最后登录时间: 2009-11-09

    空间 发短消息加为好友

    liwenqun_sias   发表于 2008/12/3 14:07:48

    对于不同的校验方式,其多项式是固定的


    工业中常用16位的CRC 以太网用32位crc


     


    一下为网络搜索结果


     


    下面以最常用的CRC-16为例来说明其生成过程。



      CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。



      下面为CRC的计算过程:



      1.设置CRC寄存器,并给其赋值FFFF(hex)。



      2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。



      3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。



      4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。



      5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。



      6.重复第2至第5步直到所有数据全部处理完成。



      7.最终CRC寄存器的内容即为CRC值。



      常用的CRC循环冗余校验标准多项式如下:



      CRC(16位) = X16+X15+X2+1



      CRC(CCITT) = X16+X12 +X5+1



      CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1



      以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。



      注意:这儿列出的标准校验多项式都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。



      (注:对二取模的四则运算指参与运算的两个二进制数各位之间凡涉及加减运算时均进行XOR异或运算,即:1 XOR 1=0,0 XOR 0=0,1 XOR 0=1)

    9楼 回复本楼

    引用 liwenqun_sias 2008/12/3 14:07:48 发表于9楼的内容

  • yk_wangyu

    yk_wangyu   |   当前状态:在线

    总积分:3278  2024年可用积分:0

    注册时间: 2006-12-04

    最后登录时间: 2020-07-04

    空间 发短消息加为好友

    yk_wangyu   发表于 2008/12/3 21:30:46

    10楼 回复本楼

    引用 yk_wangyu 2008/12/3 21:30:46 发表于10楼的内容

  • yk_wangyu

    yk_wangyu   |   当前状态:在线

    总积分:3278  2024年可用积分:0

    注册时间: 2006-12-04

    最后登录时间: 2020-07-04

    空间 发短消息加为好友

    yk_wangyu   发表于 2008/12/4 11:42:07

    第5步里说,共需右移8次,即8位数据全部移出,如果我在第4步中由于LSB中有一位0,重复第3步,多一次右移,那对于第5步来说应该仍然移8次,还是加上低位中有0的那次即移动9次?

    11楼 回复本楼

    引用 yk_wangyu 2008/12/4 11:42:07 发表于11楼的内容

总共 , 当前 /, 12【下一页】