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;
}看不懂没关系,下面有完整代码:

我要赚赏金
