Modbus通信协议
- Modbus协议是一种单主/多从的通信协议,其特点是在同一时间,总线上只能有一个主设备,但可以有一个或者多个(最多247个 ip地址1-247)从设备。每一个从设备一个ip地址
在请求的报文中请求的地址为0则为广播模式,248-255保留
小知识:一般请求方为主设备,应答方为从设备;从设备之间是不能直接通信的,原因是协议不支持
-
主设备通过两种方式向从设备发送请求报文,即单播模式和广播模式;
-
单播模式:主设备仅仅寻址单个从设备,从设备返回一个响应报文。
-
广播模式:主设备向所有的从设备发送请求指令,从设备收到指令后,各自处理,不要求返回应答;这种模式下,请求指令必须是Modbus标准功能中的写指令;比如 0x06 指令 (写单个保持寄存器)
-
Modbus的消息帧有多种方式,这里主要说一下Modbus Tcp消息帧;
-
主/从设备 - 转变为客户端和服务器;
其实就是通过TCP/IP协议在502端口上接收报文
ADU:应用数据单元
PDU:协议数据单元
下图是Modbus基本报文格式:
而Modbus TCP/IP协议在这个基础上添加一个MBAP(Modbus应用协议)
Modbus TCP/IP 消息例子
请求报文:
00 00 00 00 00 06 09 03 00 04 00 01
根据上面的协议格式从左到右:
00 00 为传输标识符; 00 00 协议标识符(这里是modbus协议); 00 06 报文后边的字节数;
09 单元标识符 (比如IP地址:10.128.99.9这个地址的从设备);03 功能码(读保持寄存器的值);00 04 Modbus起始地址;00 01 读取寄存器的个数 (这里读取一个寄存器 一个寄存器2个字节);
响应报文:
00 00 00 00 00 05 09 03 02 00 05
从左到右:
00 00 为传输标识符(与请求报文一致);00 00 协议标识符;00 05 报文后边的字节数;09 单元标识符;03 功能码; 02 后边的字节数;00 05 具体数据 (这里是一个寄存器)
以上例子可以通过mbsalve 和 mbpoll工具实现;
如何有需要了解更多的内容我建议去看下《Modbus软件开发实践指南》里面写的很详细,包括原理、功能码的介绍和使用以及一些编程语言的实现方法