这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 坤创E-Geek/天科大新电社 » 【2021全国电赛】坤创1队记录:01 modbus调试入门

共8条 1/1 1 跳转至

【2021全国电赛】坤创1队记录:01 modbus调试入门

工程师
2021-07-19 23:12:39     打赏

1、什么是Modbus?

Modbus是一种单主站的主/从通信模式。Modbus网络上只能有一个主站存在,主站在 Modbus网络上没有地址,从站的地址范围为 0 - 247,其中 0 为广播地址,从站的实际地址范围为 1 - 247。

Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。

Modbus具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。通信双方必须同时支持上述模式中的一种。

上面说的是官话,我的理解就是modbus,modbus在电子界的地位就相当于英语在各个国家的地位,modus协议实现了多设备连接,通过这个协议,可以将不同的设备实现沟通,就像不同国家的人,统一都是一种语言沟通。

2、Modbus用来干什么?

用两个字概括:通信

所有级协议都是用来通信的,协议的制定就是让两个人根据这个协议看懂传来的一组数据。

3、Modbus的内容是什么?

先给个官方的文档:

https://download.csdn.net/download/panda5_csdn/10534090

大致分为三种:

● Modbus-RTU+Modbus-ASCII

● Modbus-TCP

● Modbus-Plus

4、如何进行通信:

(重点来了)

这里我使用了一个modbus串口调试精灵然后采用51单片机作为从机,电脑的这个调试精灵作为主机,文章末我会把使用到的软件和程序放到下面,

1626707082483642.jpg

然后用51单片机作为从机,主要代码如下:

void CRCECC()
  {
    uchar len;
    uint crc;
        uchar crch,crcl;
        while(!cmdArrived);
        REN = 0;
        ET0 = 0;        
    TR0 = 0;        
        cmdArrived=0;
        len=UartRead(array,sizeof(array));//将接收到的命令读取到缓冲区中
        if(array[0]==0x01)   //核对地址已决定是否响应命令,本机地址为0x01
         {
          crc=GetCRC16(array,len-2);   //计算CRC校验值
          crch=crc>>8;
          crcl=crc&0xFF;
          if((array[len-2]==crch)&&(array[len-1]==crcl))  //判断CRC校验是否正确
            {  
              switch(array[1]) //按功能码执行操作
             {
                   case 0x03: //读取一个或者连续的寄存器
               if((array[2]==0x00)&&(array[3]==0x00))  //判断寄存器初始地址是否为00
                 {
                      array[2]=0x02;//数据的字节数为寄存器数*2,因Modbus定义的寄存器为16位
                      array[3]=0x00;//寄存器高字节补0
                      array[4]=OFFON; //读取本机的状态
                      len=5;
                      break;
                     }
           else //寄存器地址不被支持时,返回错误码
           {
        array[1]=0x83;
            array[2]=0x02;
            len=3;
                            
        break;
       }
      case 0x06://写入单个寄存器
     if((array[2]==0x00)&&(array[3]==0x00))  //判断寄存器初始地址是否为00
          {
   RUN=array[5];//保存寄存器地址
   len-=2;//长度-2以重新计算CRC
   break;
  }
     else //寄存器地址不被支持时,返回错误吗
       {
        array[1]=0x86;//功能码最高位置1
        array[2]=0x02;//设置异常码为02-无效功能
        len=3;
                        
        break;
           }
               default: //其他不支持的功能码
             array[1]|=0x80; //功能码最高位置1
         array[2]=0x01; //设置异常码为01-无效功能
         len=3;
                     
         break;
             }
        crc=GetCRC16(array,len);//计算CRC校验值
        array[len++]=crc>>8;
        array[len++]=crc&0xFF;
        delayms(3);
        UartWrite(array,len);//发送响应帧
        }
           }
        if(RUN!=0)
          {
            OFFON=0x10;//运行开始,设置本从机状态标志位OFFON值为0x10 即运行状态
        LEN=len;
        GoOn();
            OFFON=0x1F;//运行完毕,设置本从机状态标志位OFFON值为0x1F 即停止状态
        RUN=0x00;
          }
        REN = 1;
        ET0 = 1;        
            TR0 = 1;
          
          }

看不懂没关系,下面有完整代码:

Modbus调试精灵1.024.rar

3个从机1个主机485通信已测试成功.rar




关键词: 2021全国电赛     modbus     51     通讯协议    

工程师
2021-07-19 23:40:43     打赏
2楼

感谢分享


高工
2021-07-19 23:49:25     打赏
3楼

感谢分享


工程师
2021-07-20 08:25:01     打赏
4楼

请问楼主: modbus串口调试精灵在哪里下载?


工程师
2021-07-20 22:23:05     打赏
5楼

软件下载了! nice!


工程师
2021-07-20 22:30:32     打赏
6楼

讲得通俗易懂,我竟然学会了


工程师
2021-07-20 22:42:03     打赏
7楼

很实用的技术文章!


专家
2021-07-26 15:07:46     打赏
8楼

感谢分享


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]