关于MODBUS通讯校验 点击:1542 | 回复:6



BOYgirl

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:28帖 | 152回
  • 年度积分:0
  • 历史总积分:422
  • 注册:2004年6月22日
发表于:2007-01-09 10:52:00
楼主
本人在准备做通讯时,对crc-16的校验计算没有搞懂请大家多多指教

校验方法如下:
CRC-16检查资料
CRC-16是一个16-Bit Binary 值,计算CRC-16之步骤如下:
1.先设定CRC Register 为FFFFH。
2.将CRC Register 的低字节与信息中第一个字节作XOR,并将结果传回CRC Register的低字节。
3.CRC Register 右移一位,最高位填入0。
4.如果LSB是0,重复步骤。
如果LSB是1,则CRC Register 与 A001H作XOR。
5.重复步骤3及4直到已经右移8位为止。
6.对信息的下一个Byte,重复步骤2~5,直到信息中的所有Byte都处理完。
7.此时CRC Register中的值,即为CRC-16 Data。
 在传送CRC-16检查数据时,先传送低字节的检查数据,再传送高字节的检查数据。
 
数组如下:
  命令信息    
Slave 地址    01H    
功能码             03H    
第一个缓存器地址     
         高字节   00H    
    低字节    00H    
缓存器数量(*1)    
         高字节    00H    
    低字节    01H    
CRC-16    低字节    84H    
    高字节    0AH    

能否帮助我把计算的过程给我写出来 谢谢
电子邮件:zhzjboy@163.com







sevenlee

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 4回
  • 年度积分:0
  • 历史总积分:10
  • 注册:2007年1月09日
发表于:2007-01-09 17:05:00
1楼
   uint16 CRC(uint16 frame[],int n)
 
  {
   int i,j;
  uint16 crc,flag;
   crc=0xffff;
   for(i=0; i<n; i++)
   { crc^= frame[i];
   for(j=0; j<8; j++)
   {
   flag=crc&0x0001;
   crc>>=1;
   if(flag)
   { crc &= 0x7fff;
   crc ^= 0xa001;
   }
   }
   }
   return(crc);
  }
一个网上看到的  我也正在调试  看是否可行

BOYgirl

  • 精华:1帖
  • 求助:0帖
  • 帖子:28帖 | 152回
  • 年度积分:0
  • 历史总积分:422
  • 注册:2004年6月22日
发表于:2007-01-10 07:36:00
2楼
好的,我试一试
谢谢 你
如果用plc怎么做?

sevenlee

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 4回
  • 年度积分:0
  • 历史总积分:10
  • 注册:2007年1月09日
发表于:2007-01-11 09:25:00
3楼
可以用的 刚才测试了 不过要注意高低位!

伺服爱好者

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:106
  • 注册:2007年1月11日
发表于:2007-01-11 17:11:00
4楼
可以了,但是要注意unsigned 与singed的问题,如果弄错了,会有时候CRC正确,有时候不正确的.
   这个问题是我很长时间才找到原因的.

东北电

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 261回
  • 年度积分:0
  • 历史总积分:689
  • 注册:2003年3月31日
发表于:2007-05-17 18:13:00
5楼
使用PLC的梯形图语言,是可以的

恨水

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 43回
  • 年度积分:0
  • 历史总积分:50
  • 注册:2007年2月07日
发表于:2007-05-19 21:34:00
6楼
http://www.kitsnet.cn/blog/post/155.html

这个软件对你有帮助了

热门招聘
相关主题

官方公众号

智造工程师