1 概念
要开发一个新项目,上位机与下位机通讯使用Modbus TCP协议,在网上找了好多资料了解此协议,此处仅描述TCP/IP协议。
Modbus原先是施耐德电气(Schneider Electric)为PLC(可编程逻辑控制器)通信而研发的一种串行通信协议,现在它已经成为工业领域通信协议的业界标准,并且现在是工业电子、工业控制、电力等设备之间常用的连接方式。
Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。Modbus的工作方式是请求/应答,每次通讯都是主设备先发送指令,可以是广播,或是向特定从设备的单播,从设备响应指令,并按要求应答,或者报告异常。当主设备不发送请求时,从设备不会自己发出数据,从设备和从设备之间不能直接通讯。
Modbus TCP/IP协议应用于以太网连接,ModbusTCP的数据帧格式:ADU = MBAP + PDU,即 MBAP(7字节) + 功能码 (1字节)+ 数据域(长度不定,由具体功能决定)。
MBAP为报文头,长度为7字节,组成如下:
事务处理标识 | 协议标识 | 长度 | 单元标识符 |
2byte | 2byte | 2byte | 1byte |
事务处理标识: 报文的序列号,每次通信之后就要加1以区别不同的通信数据报文。
协议标识符 : 00 00表示ModbusTCP协议。
长度 :表示长度后面所有的字节数,即值为ADU字节长度减去6,单位为字节。
单元标识符 : 可以理解为从设备地址。
功能码
功能码 | 作 用 |
---|---|
0x01 | 读线圈 |
0x02 | 读离散量输入 |
0x03 | 读保持寄存器 |
0x04 | 读输入寄存器 |
0x05 | 写单个线圈 |
0x06 | 写单个寄存器 |
0x0F | 写多个线圈 |
0x10 | 写多个寄存器 |
2 例子
数据帧格式:ADU = MBAP + PDU,即 MBAP(7字节) + 功能码 (1字节)+ 数据域
MODBUS请求的生成:
在收到来自用户应用的需求后,客户端必须生成一个MODBUS请求,并发送到TCP管理。
MBAP+ 功能码 +起始地址H+ 起始地址L+ 寄存器数量H+ 寄存器数量L(共12字节)。
- 如:起始地址是0x0000,寄存器数量是 0x0003
00 01 00 00 00 06 01 03 00 00 00 03
见下表:
类型 | 描述 | 字节大小 | 实例 |
---|---|---|---|
MBAP报文头 | 事务处理标识符 | 2 | 0x0001 |
协议标识符 | 2 | 0x0000 | |
长度 | 2 | 0x0006 | |
单元标识符(从设备地址) | 1 | 0x01 | |
MODBUS请求 | 功能码 | 1 | 0x03 |
起始地址 | 2 | 0x0000 | |
寄存器数量 | 2 | 0x0003 |
MODBUS响应的生成
一旦处理请求,MODBUS 服务器必须使用适当的MODBUS服务器事务处理生成一个响应,并且必须将响应发送到TCP管理组件。
根据处理结果,可以生成两类响应:
肯定的MODBUS响应:
响应功能码 = 请求功能码
回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00
类型 | 描述 | 字节大小 | 实例 |
---|---|---|---|
MBAP报文头 | 事务处理标识符 | 2 | 0x0001 |
协议标识符 | 2 | 0x0000 | |
长度 | 2 | 0x0009 | |
单元标识符(从设备地址) | 1 | 0x01 | |
MODBUS请求 | 功能码 | 1 | 0x03 |
数据长度 | 2 | 0x06 | |
数据 | 6 | 0x002100000000 |
MODBUS异常响应:
目的是为客户机提供与处理过程检测到的错误相关的信息
响应功能码 = 请求功能码+0x80
提供异常码来表明出错的原因。
异常码 | MODBUS名称 | 备注 |
---|---|---|
01 | 非法的功能码 | 服务器不了解功能码 |
02 | 非法的数据地址 | 与请求有关 |
03 | 非法的数据值 | 与请求有关 |
04 | 服务器故障 | 在执行过程中,服务器故障 |
05 | 确认 | 服务器接受服务调用,但是需要相对长的时间完成服务。因此,服务器仅返回一个服务调用接收的确认 |
06 | 服务器繁忙 | 服务器不能接受MODBUS请求PDU。客户应用由责任决定是否和何时重发请求。 |
0A | 网关故障 | 网关路经是无效的 |
0B | 网关故障 | 目标设备没有响应 |
参考建议:
https://blog.csdn.net/sgmcumt/article/details/87435191
https://blog.csdn.net/YiWangJiuShiXingFu/article/details/105557082
https://blog.csdn.net/qq_36339249/article/details/90664839