目录
一、什么是Modbus协议?
Modbus协议是一种用于工业控制的网络通讯协议,可以片面的理解为,Modbus协议一种机器与机器之间进行数据、信息传递的一种格式规范。
Modbus协议还遵循主从协议,支持单主机,多从机,最多支持247个从机设备。并且,在同一个通信线路上只会有一个主机,所有的通讯过程全部由主机主动发起,从机接收到主机请求后,会对请求做出响应。从机不会主动进行数据的发送,从机之间也不会有通讯过程。
二、Modbus通讯方式
Modbus的通讯方式有:串行通讯方式、以太网通讯方式、串行-以太网转换方式、无线通讯方式
表现在物理层就是,可使用3线232、2线485、4线422进行主从机之间的连接,或通过光纤、网线、无线网络等进行主从机之间的连接
通俗一点来说:
主机从机之间想要实现通讯,需要将主机与从机进行连接,然后再进行数据传输。而连接方式有上述4种方式,连接实现之后,主机与从机之间就可以进行数据传输了。而它们传输的数据内容,均按照Modbus协议规定的格式进行转换。这样,就保证了能够让同一个主机与不同功能、不同厂家的设备之间进行准确的通讯。
三、Modbus通信协议的特点
- 标准、开放、免费
- 支持多种电器接口,如串行接口RS-232、RS-485等,还可以在各种介质上传递,如:光纤、无线等
- Modbus的帧格式简单、紧凑、通俗易懂。用户使用简单,厂商开发简单。
四、Modbus的4种寄存器类型
- 线圈(Coils)
- 离散量输入(Discrete Input)
- 输入寄存器(Input registers)
- 保持寄存器(Holding registers)
暂不细讲,大家可以自行了解,或者等我更新。
五、Modbus的协议版本
包括Modbus RTU、Modbus ASCII、Modbus TCP/IP、Modbus UDP/IP等
Modbus RTU与Modbus ASCII,都使用串口通讯协议,Modbus RTU使用二进制格式进行数据传输,通讯效率更高,Modbus ASCII使用ASCII码进行数据传输,可读性好,但通讯效率更低。
Modbus TCP/IP是基于以太网的一种通讯方式,它将Modbus协议封装在TCP/IP协议栈中,通过以太网传输数据。具有高速、稳定的特点。
Modbus UDP/IP是基于UDP/IP协议的一种通讯方式。与Modbus TCP/IP不同,Modbus UDP/IP采用无连接的通讯方式,不保证数据的可靠性和顺序。相比于Modbus TCP/IP,Modbus UDP/IP的通讯开销较小,可以减少网络负载。
六、Modbus数据帧格式
无论哪一种Modbus协议版本的帧格式都是一样的
- 地址域:主机要访问的从机的地址
- 功能码:主机对从机实现的操作,功能码有很多,不同的功能码也对应操作不同类型的寄存器。比如:0x01读线圈、0x03读保持寄存器、0x06写单个寄存器、0x10写多个寄存器等。(更多功能码见下方Modbus功能码列表)
- 数据:根据功能的不同,以及传输的数据为请求数据还是响应数据的不同,会有不同的内容。(详见七、报文结构解析)
- 差错校验:为保障传输数据的准确性,modbus会进行差错校验,如Modbus CRC16校验等。详情请自行了解。
功能码 | 解释翻译 | 作用 | |
---|---|---|---|
0x01 | Read Coils | 读线圈状态 | 读取远程设备中1到2000个连续的线圈的状态 |
0x02 | Read Discrete Inputs | 读离散输入状态 | 读取远程设备中1到2000个连续的离散输入的状态 |
0x03 | Read Holding Registers | 读保持寄存器内容 | 读取远程设备中1到125个连续的保持寄存器的内容 |
0x04 | Read Input Registers | 读输入寄存器内容 | 读取远程设备中1到125个连续的输入寄存器的内容 |
0x05 | Write Single Coil | 写单个线圈 | 在远程设备中把单个线圈状态改变为打开或关闭的状态 |
0x06 | Write Single Register | 写单个保持寄存器 | 在远程设备中写入单个保持寄存器 |
0x07 | Read Exception Status (Serial Line only) | 读取异常状态(仅限串行线路) | 读取远程设备中八个异常状态输出的内容 |
0x08 | Diagnostics (Serial Line only) | 通信系统诊断(仅限串行线路) | |
0x0B | Get Comm Event Counter (Serial Line only) | 获取通讯事件计数器(仅限串行线路) | 从远程设备的通信事件计数器获取状态字和事件计数 |
0x0C | Get Comm Event Log (Serial Line only) | 获取通讯事件日志(仅限串行线路) | 从远程设备获取状态字、事件计数、消息计数和事件字节字段 |
0x0F | Write Multiple Coils | 写多个线圈 | 强制远程设备中线圈序列中的每个线圈接通或断开 |
0x10 | Write Multiple registers | 写多个保持寄存器 | 在远程设备中写入连续寄存器块 |
0x11 | Report Slave ID (Serial Line only) | 报导从机信息(仅限串行线路) | 读取远程设备特有的类型、当前状态和其他信息的说明。数据内容特定于每种类型的设备 |
0x14 | Read File Record | 读取文件记录 | |
0x15 | Write File Record | 写文件记录 | |
0x16 | Mask Write Register | 带屏蔽字写入寄存器 | |
0x17 | Read/Write Multiple registers | 读、写多个寄存器 | 执行一次连续写和连续读,写入操作在读取之前执行 |
0x18 | Read FIFO Queue | 读取先进先出队列 | |
0x2B | Encapsulated Interface Transport | 封装接口传输 |
七、报文结构解析(Modbus RTU版本)
此处以使用Modbus RTU版本、使用Modbus CRC16校验的保持寄存器(Holding registers)做演示,解析其三个常用功能0x03读、0x06写单个、0x10写的报文结构。
1、0x03请求应答方式
主机请求:
示例:01 03 00 01 00 0A 94 0D
含义:从机设备地址(01)+功能码(03)+起始寄存器完整地址(00 01)+要读取的寄存器个数(00 0A)+CRC16校验码(94 0D)
解析:从地址为1的从机读取寄存器块内容,寄存器开始地址为1,连续读取10个寄存器,即读取地址为1到10的寄存器块。
补:CRC16在线校验工具
从机应答:
示例:01 03 14 00 D7 3F 70 00 14 00 0F 00 11 00 08 00 0B 00 0B 00 02 00 00 7E 3F
含义:从机设备地址(01)+功能码(03)+数据字节数(14)+读取到的数据内容(00 D7 3F 70 00 14 00 0F 00 11 00 08 00 0B 00 0B 00 02 00 00)+CRC16校验码(7E 3F)
解析:从地址为1的从机读取寄存器块内容,返回的数据字节20个,寄存器返回数据:寄存器1--215,寄存器2--16240,寄存器3--20,寄存器4--15,寄存器5--17,寄存器6--8,寄存器7--11,寄存器8--11,寄存器9--2,寄存器10--0。
2、0x06请求应答方式
主机请求:
示例:01 06 27 11 00 01 12 BB
含义:从机设备地址(01)+功能码(06)+寄存器完整地址(27 11)+写入的数据(00 01)+CRC16校验码(12 BB)
解析:在地址为1的从机中,向地址为10001的寄存器,写入数据1。
从机应答:
示例:01 06 27 11 00 01 12 BB
含义:从机设备地址(01)+功能码(06)+寄存器完整地址(27 11)+成功写入的数据(00 01)+CRC16校验码(12 BB)
解析:在地址为1的从机,地址为10001的寄存器中,成功写入数据1。如果06功能写入成功的话,请求码和响应码会是一样的。
3、0x10请求应答方式
主机请求:
示例:01 10 4E 21 00 03 06 00 01 00 11 00 08 BB 05
含义:从机设备地址(01)+功能码(10)+起始寄存器地址(4E 21)+写入的寄存器个数(00 03)+数据字节数(00 06)+数据内容(00 01、00 11、00 08)+CRC16校验码(BB 05)
解析:在地址为1的从机中,向起始地址为20001的连续3个寄存器,分别写入1、17、8,字节数6个。
从机应答:
示例:01 10 4E 21 00 03 C7 2A
含义:从机设备地址(01)+功能码(10)起始寄存器地址(4E 21)+写入的寄存器个数(00 03)+CRC16校验码(C7 2A)
解析:在地址为1的从机,起始地址为20001的连续3个寄存器中(20001、20002、20003),写入数值。
本文到此完结,文章内容均为我个人理解所创作,如有偏差误解欢迎指正!