Modbus概述
Modbus通信协议由Modicon公司(现被施耐德公司收购,成为其子品牌)于1979年发明,是世界上最早应用于工业领域的总线协议。由于其免费公开发行,使用该协议的制造商无需支付任何费用。Modbus通信协议采用主从通信方式(即主从通信方式),广泛应用于分布式控制中,从而使得Modbus协议在全球范围内得到广泛应用。
Modbus通信协议有很多变体,支持串口(主要是RS-485总线)和以太网版本,其中最著名的有Modbus RTU、Modbus ASCII和Modbus TCP。Modbus RTU和Modbus ASCII都是支持RS-485总线的通信协议。Modbus RTU以其二进制表示和紧凑的数据结构,具有较高的通信效率和广泛的应用。但是,Modbus ASCII使用ASCII码进行传输,并使用特殊字符作为其字节的开始和结束标记,因此其传输效率远低于Modbus RTU协议。一般只在通信数据量较小时才考虑Modbus ASCII通信协议,工业领域一般采用Modbus RTU协议。一般来说,基于串行通信的Modbus通信协议是指Modbus RTU通信协议。
00-1010功能代码:功能代码用于表示modbus协议中信息帧的功能。常用的功能代码包括03、04、06、16等。其中,03功能码用于读取保持寄存器的内容,04功能码用于读取输入寄存器的内容,06功能码用于写入单个保持寄存器,16功能码用于写入多个保持寄存器。
输入寄存器和保持寄存器:04功能码用于读取输入寄存器,03功能码用于读取保持寄存器。很多人在看到这两个功能码的时候,总想找出这两个功能码的区别,保持寄存器和输入寄存器有什么区别。modbus协议最初用于解决PLC的通信协议问题,主要用于输入输出数字信号和模拟信号。所谓输入寄存器是从模拟信号输入中推导出来的,即输入寄存器只能从模拟信号输入端改变寄存器,而主机不能通过发出指令来改变输入寄存器的数据,而保持寄存器用于输出模拟信号。主机可以改变寄存器数据,也就是说,对于主机来说,输入寄存器是只读的,保持寄存器可以读写。当主机使用06和16功能代码的指令预设输入寄存器时,器件将返回代码0x81。
Modbus中的数据地址格式:在Modbus协议中,经常会出现类似3xxxx、4xxxx、4xxxxx的寄存器,表示寄存器支持的数据类型。Modbus数据地址格式从0开始,如下面的寄存器40009,表示保持寄存器,寄存器地址为00 08。组态软件和可编程控制器系统中经常使用类似的数据地址格式。
Modbus RTU/ASCII/TCP: Modbus协议最初用于可编程逻辑控制器(PLC)之间的通信,由于其开放性,被广泛应用于现场智能仪表中。Modbus协议有很多变体,最著名的有Modbus RTU/Modbus ASCII和Modbus TCP通信协议。RTU/ASCII协议基于串口通信,而TCP协议基于以太网通信。
Modbus错误码表:Modbus有功能码、校验码、异常功能码和错误码,其中异常功能码和错误码容易混淆。一般来说,异常功能代码是指执行某个功能代码时对应的异常功能代码。通常,0x80会添加到功能代码中。例如03功能码的异常代码为0x83异常功能码。16个功能代码对应的异常功能代码为0x90,错误代码表示错误的具体情况,如寄存器地址不存在,是读还是写,如果寄存器地址不存在,则错误代码为02。
其中,物理离散输入和输入寄存器只能有I/O系统提供的数据类型,即离散输入和输入寄存器的值只能由I/O系统改变,而上位机程序不能改变的数据类型是只读的,而内部位或物理线圈、内部寄存器或物理输出寄存器(保持寄存器)是上位机应用程序可以改变的数据类型,在数据读写上是可读可写的。
Modbus RTU/TCP协议
Modbus TCP协议则是在RTU协议上加一个MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码。
RTU数据格式:
主机请求消息
[03][03][00][00][00][0A][C4][2F]
Slave id(BIT0)
Function(BIT1)
addr(BIT2、BIT3)
nb(BIT4、BIT5) 请求的数据大小
CRC(BIT6、BIT7)
从机回复消息
03 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 16 6F
Slave id(BIT0)
Function(BIT1)
nb(BIT2) 回复的数据大小,是请求数据大小的两倍,每个数据占两个自己
data(BIT3-BIT22)
CRC(BIT23、BIT24)
TCP数据格式:
主机请求消息
07 78 00 00 00 06 03 03 00 00 00 14
事务处理标识
2字节
07 78可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
协议标识符
2字节
00 00表示ModbusTCP协议。
长度
2字节
00 06表示接下来的数据长度,单位为字节。
单元标识符
1字节
03可以理解为Slave设备地址。
功能码
1字节
03 功能码,读保持寄存器
起始地址
2字节
00 00 起始地址
寄存器数量
2字节
00 14 读取寄存器数量
从机回复消息
07 78 00 00 00 2B 03 03 28 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
事务处理标识
2字节
07 78可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
协议标识符
2字节
00 00表示ModbusTCP协议。
长度
2字节
00 2B表示接下来的数据长度,单位为字节。
单元标识符
1字节
03可以理解为Slave设备地址。
功能码
1字节
03 功能码,读保持寄存器
起始地址
1字节
28 回复的数据大小
寄存器数据
xxx字节
读取的寄存器数据
一分快三计划高手>Function(BIT1)
addr(BIT2、BIT3)
nb(BIT4、BIT5) 请求的数据大小
CRC(BIT6、BIT7)
从机回复消息
03 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 16 6F
Slave id(BIT0)
Function(BIT1)
nb(BIT2) 回复的数据大小,是请求数据大小的两倍,每个数据占两个自己
data(BIT3-BIT22)
CRC(BIT23、BIT24)
TCP数据格式:
主机请求消息
07 78 00 00 00 06 03 03 00 00 00 14
事务处理标识
2字节
07 78可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
协议标识符
2字节
00 00表示ModbusTCP协议。
长度
2字节
00 06表示接下来的数据长度,单位为字节。
单元标识符
1字节
03可以理解为Slave设备地址。
功能码
1字节
03 功能码,读保持寄存器
起始地址
2字节
00 00 起始地址
寄存器数量
2字节
00 14 读取寄存器数量
从机回复消息
07 78 00 00 00 2B 03 03 28 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
事务处理标识
2字节
07 78可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
协议标识符
2字节
00 00表示ModbusTCP协议。
长度
2字节
00 2B表示接下来的数据长度,单位为字节。
单元标识符
1字节
03可以理解为Slave设备地址。
功能码
1字节
03 功能码,读保持寄存器
起始地址
1字节
28 回复的数据大小
寄存器数据
xxx字节
读取的寄存器数据