Modbus协议简介
Modbus 就是为了实现多个设备相互通信的应用层协议。 在市面上很多数据采集设备都会采用Modbus协议。
主要包括三种报文:
ModbusRtu,ModebusAscii , ModbusTcp
- 这三种报文的报文主体(包括从机地址+功能码+数据域)都相同,没有本质区别。
- 注意的是,ModebusAscii 因为使用的是ASCII编码,相比Rtu 来说,占用空间更大,传输效率更低。
优点:
-
Modbus 是最开始使用RS232 、RS485等串行链路作为底层通信方式,串行总线的接口芯片成本低,而且布线简单;
-
Modbus 是简单的应用层协议,其信息格式简单易懂。
-
开源免费
-
可以在多种电气接口(R232,R485)和通讯介质(以太网、蓝牙、wifi等)中运行
-
报文帧简单紧凑
-
常用介质:串口、以太网,主要的通讯方式:
ModbusRtu(常用在串口运行,使用原始二进制,底层使用RS485串行链路通讯)
ModebusAscii (常用在串口运行,使用ASCII编码底层使用RS485串行链路通讯)
ModebusUdp
ModbusTcp
ModebusRtuOverTcp
ModebusAsciiOverTcp
ModebusRtuUdp
ModebusAsciiUdp
Rtu 和 Ascii 的区别:例如:
发送10 这个数据,使用Rtu 的话,数据被转换为 0x0A = 10,
但是Ascii会将数据转化为两个字符(1 ,0) 0x31 0x30(针对Ascii码表对应的1,0的数转的),而且还有包头包尾
Modbus总线
- Modbus,bus即总线的意思,而总线是一种网络拓扑结构,一般包括星型结构、环型、树型、总线型等多种。当然无论哪种网络拓扑结构最终都是为了实现多个设备之间的通讯。
- Modbus 则是采用的总系型拓扑结构,如下:
特点:
-
如图,多个设备复用同一条总线,能大大减少了布线的复杂性。
-
此时多个设备复用同一条总线时,会出现,当同时发送数据时,数据会产生冲突,为了避免数据冲突的出现,Modbus协议就采用了一种主从通讯方式去解决这种问题。
主从通讯模式
- 主从模式就是如图所示,在整个系统中只能存在一个主机设备(master),和 多个从机设备(slave)
- Modbus 采用请求-应答的模式,并规定,Modbus请求只能有主机发起,即主机发送请求数据给从机,从机只能接收来自主机的请求并做出相应的应答,返回应答数据给主机。
- 从机不能主动发起请求,只能被动接收主机的请求。
- 为了避免数据冲突,主机不能并行发送数据,当发送完第一个数据,只有等到从机返回应答或者应答超时后,才能发送第二个数据
- 每个从机在一个系统中只有一个从机地址,主机发送数据请求时,会在请求数据中携带目标从机的地址,当主机发送数据到总线上时,每一个从机都会接到主机的数据,但是只有与请求数据中目标地址相同的从机才会做出应答,其他从机则会忽略此请求。
Modbus存储区
数据类型,分:布尔量 寄存器
读写性,分:只读 读写
只读布尔量:输入线圈 ————规定为 1区,即寄存器1,一般情况地址范围:10001-19999
只读寄存器:输入寄存器———规定为 3区,即寄存器3,范围:30001-39999
读写布尔量:输出线圈————规定为 0区,即寄存器0,范围:00001-09999
读写寄存器:输出寄存器———规定为 4区,即寄存器4,范围:40001-49999
操作
- 读取输入线圈
- 读取输入寄存器
- 读取输出线圈
- 读取输出寄存器
- 写入单个输出线圈
- 写入多个输出线圈
- 写入单个输出寄存器
- 写入多个输出寄存器
如何进行上面的操作——功能码
- 读取输入线圈1—————0x02
- 读取输入寄存器3————0x04
- 读取输出线圈0—————0x01
- 读取输出寄存器4————0x03
- 写入单个输出线圈0———0x05
- 写入多个输出线圈0———0x0F
- 写入单个输出寄存器4——0x06
- 写入多个输出寄存器4——0x10
Modbus 调试工具:
ModbusPoll (扮演客户端或者主站的角色)
ModbusSlave(扮演服务器或者从站的角色)
VSPD(扮演虚拟串口)
Modbus报文格式 / 消息帧格式
前面已经说过了Modus 通讯协议主要包括以下三种报文
主要包括三种报文:
ModbusRtu,ModebusAscii , ModbusTcp
- 这三种报文的报文主体(包括从机地址+功能码+数据域)都相同,没有本质区别。
从机地址:
首先从机地址是唯一的,用户可以自定义配置设备的从机地址,但是必须保证从机地址是唯一的。
从机地址范围为1-247, 0为广播地址, 248-255为预留地址
功能码:
功能码就对应了设备提供的某个服务或者功能,Modbus 标准中把功能码分为了3类:
(1)公共功能码:modbus已经规定好的,其功能已经被明确的
(2)用户自定义功能码:设备根据需求自定义的功能码,取值范围为 65-72 和 100-110
(3)保留功能码:目前没有使用,可忽略。
- 读取输入线圈1—————0x02
- 读取输入寄存器3————0x04
- 读取输出线圈0—————0x01
- 读取输出寄存器4————0x03
- 写入单个输出线圈0———0x05
- 写入多个输出线圈0———0x0F
- 写入单个输出寄存器4——0x06
- 写入多个输出寄存器4——0x10
数据域
数据域用来存放真正要通讯的数据,数据域是以字节为单位的,长度可变的,数据域的格式可变,而具体的格式是由功能码决定的。
- 数据地址
Modbus读写时必须要数据地址,理论上每种寄存器的数据地址的取值范围都为0x0000-0xFFFF,注意不同种类的寄存器的数据地址是独立的。
Modbus TCP
由于以太网的流行,所以modbus也引进了TCP/IP作为通信方式。尽管RS485串行链路比以太网链路简单。毕竟Modbus是应用层协议,不管底层使用RS485链路还是TCP,应用层变化不大。
Modbus 的 TCP通信的相较于串口通讯的特点
前面提到过了Modbus 主从通信模式主要是为了避免多个设备的数据冲突,而TCP 底层已经使用CSMA/CD(我目前还不懂)解决了数据冲突的问题,而且TCP是全双工通讯,RS485是半双工,这就使得Modbus TCP的从机可以主动发送报文到系统中而不会产生冲突,(尽管这种操作是不符合Modbus标准的),所以在使用TCP连接时,Modbus 系统可以实现 多主/多从的通信模式。