社区导航

 

搜索
查看: 4065|回复: 1

[讨论] Modbus通讯常识 2

[复制链接]

247

TA的帖子

0

TA的资源

禁止发言

发表于 2007-5-15 11:59 | 显示全部楼层

Modbus通讯常识 2

 

计算CRC码的步骤为:

1、预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;

2、把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;

3、把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;

4、如果最低位为0:重复第3步(再次移位); 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;

5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;

6、重复步骤2到步骤5,进行下一个8位数据的处理;

7、最后得到的CRC寄存器即为CRC码。

(3)功能码03,读取点和返回值:

仪表采用Modbus RTU通讯规约,利用通讯命令,可以进行读取点(“保持寄存器”) 或返回值(“输入寄存器” )的操作。保持和输入寄存器都是16位(2字节)值,并且高位在前。这样用于仪表的读取点和返回值都是2字节。一次最多可读取寄存器数是60。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。从机响应的命令格式是从机地址、功能码、数据区及CRC码。数据区中的寄存器数据都是每两个字节高字节在前。

(4)功能码06,单点保存

主机利用这条命令把单点数据保存到仪表的存储器。从机也用这个功能码向主机返送信息。

下面是一个用VC编写的ModBus RTU通讯的例子

通讯口设置

DCB dcb;
hCom=CreateFile("COM1"

,
     GENERIC_READ|GENERIC_WRITE,
      0,
      NULL,
      OPEN_EXISTING,
      0,
      NULL);
if(hCom==INVALID_HANDLE_VALUE)
{
   MessageBox("createfile error,error");
}
BOOL error=SetupComm(hCom,1024,1024);
if(!error)
   MessageBox("setupcomm error");
error=GetCommState(hCom,&dcb);
if(!error)
   MessageBox("getcommstate,error");
dcb.BaudRate=2400;
dcb.ByteSize=8;
dcb.Parity=EVENPARITY;//NOPARITY;
dcb.StopBits=ONESTOPBIT;

error=SetCommState(hCom,&dcb);

CRC校验码计算

UINT crc
void calccrc(BYTE crcbuf)
{
BYTE i;

crc=crc ^ crcbuf;
for(i=0;i<8;i++)
{
BYTE TT;
TT=crc&1;
crc=crc>>1;
crc=crc&0x7fff;
if (TT==1)
crc=crc^0xa001;
crc=crc&0xffff;
}
}

数据发送

zxaddr=11;//读取地址为11的巡检表数据
zxnum=10;//读取十个通道的数据

writebuf2[0]=zxaddr;
writebuf2[1]=3;
writebuf2[2]=0;
writebuf2[3]=0;
writebuf2[4]=0;
writebuf2[5]=zxnum;
crc=0xffff;
calccrc(writebuf2[0]);
calccrc(writebuf2[1]);
calccrc(writebuf2[2]);
calccrc(writebuf2[3]);
calccrc(writebuf2[4]);
calccrc(writebuf2[5]);

writebuf2[6]=crc & 0xff;
writebuf2[7]=crc/0x100;
WriteFile(hCom,writebuf2,8,&comnum,NULL);

数据读取

ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL);//读取zxnum个通道数据可增加错误处理程序,如地址码错误、CRC码错误判断、通讯故障处理等。

读书,让你忘掉烦恼(http://ordinarysky.cn)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/8 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-16 08:30 , Processed in 0.090411 second(s), 23 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表