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单片机作为从机,电脑的这个调试精灵作为主机,文章末我会把使用到的软件和程序放到下面,
然后用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; }
看不懂没关系,下面有完整代码: