一、MODBUS协议的基本表格
MODBUS 以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:
基本表格 | 对象类型 | 访问类型 | 内容 |
---|---|---|---|
输入离散量 | 单个bit | 只读 | I/O 系统提供这种类型数据 |
线圈 | 单个bit | 读写 | 通过应用程序改变这种类型数据 |
输入寄存器 | 单个寄存器 | 只读 | I/O 系统提供这种类型数据 |
保持寄存器 | 单个寄存器 | 读写 | 通过应用程序改变这种类型数据 |
对于基本表格中任何一项,协议都允许单个地选择 65536 个数据项,而且设计那些项的读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。MODBUS 功能码中使用的 MODBUS 逻辑参考数字是以 0 开始的无符号整数索引。
每个设备根据其应用都有它自己的数据结构,也即以上四种基本表格在具体设备中的存储位置由设备自身构造决定。
二、MODBUS 事务处理流程
依据上图,从机在处理完主机请求后,可能会建立两种响应:
- 正常的MODBUS 响应
响应的功能码 = 请求的功能码 - 异常的MODBUS 响应
向主机提供一个异常码来指示差错原因
响应功能码 = 请求功能码 + 0x80
MODBUS 异常码:01 非法功能;02 非法数据地址;03 非法数据值;04 从站设备故障;其他异常码 略…。
三、功能码
1、功能码分类
有三类 MODBUS 功能码:公共功能码、用户定义功能码、保留功能码
MODBUS功能码的有效范围是十进制 1-255(128-255 为异常响应保留)。
2、常用公共功能码定义
功能码 | 定义功能 |
---|---|
0X01 | 读线圈 |
0X02 | 读输入离散量 |
0X03 | 读保持寄存器 |
0X04 | 读输入寄存器 |
0X05 | 写单个线圈 |
0X06 | 写单个寄存器 |
0X0F | 写多个线圈 |
0X10 | 写多个寄存器 |
0X14 | 读文件记录 |
0X15 | 写文件记录 |
0X16 | 屏蔽写寄存器 |
0x17 | 读/写多个寄存器 |
3、部分公共功能码的请求/响应数据格式
MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的 MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。
1)0X01(读线圈)
请求PDU
功能码 | 1个字节 | 0X01 |
起始地址 | 2个字节 | 0 - 65535 |
线圈数量 | 2个字节 | 1-2000(0X7D0) |
响应PDU
功能码 | 1个字节 | 0X01 |
字节数 | 1个字节 | N* |
线圈状态 | N个字节 |
错误
功能码 | 1个字节 | 0X81(功能码+0X80) |
异常码 | 1个字节 | 01、02、03或04 |
举例:读取线圈20-38
请求 | 响应 | ||
---|---|---|---|
功能码 | 0X01 | 功能码 | 0x01 |
起始地址Hi | 00 | 字节数 | 0X03 |
起始地址Lo | 0x13 | 输出状态27-20 | ** |
线圈数量Hi | 00 | 输出状态35-28 | ** |
线圈数量Lo | 0x13 | 输出状态38-36 | ** |
输出38 是左侧第六个比特位置,输出 36 是这个字节的 LSB。用零填充五个剩余高位比特。
2)0X02(读输入离散量)
略
3)0X03 (读保持寄存器)
请求PDU
功能码 | 1个字节 | 0X03 |
起始地址 | 2个字节 | 0 至 65535 |
寄存器数量 | 2个字节 | 1-125(0X7D) |
响应PDU
功能码 | 1个字节 | 0X03 |
字节数 | 1个字节 | 2xN* |
寄存器值 | 2xN*个字节 |
错误
功能码 | 1个字节 | 0X83(功能码+0X80) |
异常码 | 1个字节 | 01、02、03或04 |
举例:读寄存器108-110
请求 | 响应 | ||
---|---|---|---|
功能码 | 0X03 | 功能码 | 0x03 |
起始地址Hi | 00 | 字节数 | 0X06 |
起始地址Lo | 0x6B | 寄存器Hi(108 ) | ** |
寄存器数量Hi | 00 | 寄存器Lo(108 ) | ** |
寄存器数量Lo | 0x03 | 寄存器Hi(109 ) | ** |
寄存器Lo(109 ) | ** | ||
寄存器Hi(110 ) | ** | ||
寄存器Lo(110 ) | ** |
4)0X04(读输入寄存器)
略
5)0X05(写单个线圈)
请求PDU
功能码 | 1个字节 | 0X05 |
写入地址 | 2个字节 | 0 - 65535 |
写入值 | 2个字节 | 0X0000(OFF) 或 0XFF00(ON) |
响应PDU
功能码 | 1个字节 | 0X01 |
写入地址 | 1个字节 | 0 - 65535 |
写入值 | 2个字节 | 0X0000(OFF) 或 0XFF00(ON) |
错误
功能码 | 1个字节 | 0X85(功能码+0X80) |
异常码 | 1个字节 | 01、02、03或04 |
举例:写线圈173为ON
请求 | 响应 | ||
---|---|---|---|
功能码 | 0X05 | 功能码 | 0x05 |
写入地址Hi | 00 | 写入地址Hi | 00 |
写入地址Lo | 0xAC | 写入地址Lo | 0xAC |
写入值Hi | 0XFF | 写入值Hi | 0XFF |
写入值Lo | 0x00 | 写入值Lo | 0x00 |
6)0X06(写单个寄存器)
请求PDU
功能码 | 1个字节 | 0X06 |
写入地址 | 2个字节 | 0 - 65535 |
写入值 | 2个字节 | 0X0000 - 0XFFFF |
响应PDU
功能码 | 1个字节 | 0X01 |
写入地址 | 1个字节 | 0 - 65535 |
写入值 | 2个字节 | 0X0000 - 0XFFFF |
错误
功能码 | 1个字节 | 0X86(功能码+0X80) |
异常码 | 1个字节 | 01、02、03或04 |
举例:向寄存器13写入01 02
请求 | 响应 | ||
---|---|---|---|
功能码 | 0X06 | 功能码 | 0x06 |
写入地址Hi | 00 | 写入地址Hi | 00 |
写入地址Lo | 0x0D | 写入地址Lo | 0x0D |
写入值Hi | 0X01 | 写入值Hi | 0X01 |
写入值Lo | 0x02 | 写入值Lo | 0x02 |
7)0X0f(写多个线圈)
请求PDU
功能码 | 1个字节 | 0X0f |
起始地址 | 2个字节 | 0 - 65535 |
线圈数量 | 2个字节 | 1- 1968(0X7B0) |
字节数 | 1个字节 | N* |
写入值 | N*个字节 |
备注:N*=线圈数量/8,如果余数不等于 0,那么 N = N+1
响应PDU
功能码 | 1个字节 | 0X01 |
起始地址 | 2个字节 | 0 - 65535 |
线圈数量 | 2个字节 | 1- 1968(0X7B0) |
错误
功能码 | 1个字节 | 0X8F(功能码+0X80) |
异常码 | 1个字节 | 01、02、03或04 |
举例:从线圈20开始写入10个线圈值为 CD 01 (二进制 1100 1101 0000 0001)
请求 | 响应 | ||
---|---|---|---|
功能码 | 0X0F | 功能码 | 0x0F |
起始地址Hi | 00 | 起始地址Hi | 00 |
起始地址Lo | 0x13 | 起始地址Lo | 0x13 |
线圈数量Hi | 0X00 | 线圈数量Hi | 0X00 |
线圈数量Lo | 0x0A | 线圈数量Lo | 0x0A |
字节数 | 0X02 | ||
写入值Hi | 0XCD | ||
写入值Lo | 0X01 |
8)0X10 (写多个寄存器)
请求PDU
功能码 | 1个字节 | 0X0f |
起始地址 | 2个字节 | 0 - 65535 |
线圈数量 | 2个字节 | 1- 123(0X7B) |
字节数 | 1个字节 | 2xN* |
写入值 | 2xN*个字节 |
备注:N*=寄存器数量
响应PDU
功能码 | 1个字节 | 0X10 |
起始地址 | 2个字节 | 0 - 65535 |
线圈数量 | 2个字节 | 1- 123(0X7B) |
错误
功能码 | 1个字节 | 0X90(功能码+0X80) |
异常码 | 1个字节 | 01、02、03或04 |
举例:将01 02 和 03 04 写入02,03寄存器
请求 | 响应 | ||
---|---|---|---|
功能码 | 0X10 | 功能码 | 0x10 |
起始地址Hi | 00 | 起始地址Hi | 00 |
起始地址Lo | 0x02 | 起始地址Lo | 0x02 |
寄存器数量Hi | 0X00 | 寄存器数量Hi | 0X00 |
寄存器数量Lo | 0x02 | 寄存器数量Lo | 0x02 |
字节数 | 0X04 | ||
写入值Hi | 0X01 | ||
写入值Lo | 0X02 | ||
写入值Hi | 0X03 | ||
写入值Lo | 0X04 |
声明
以上内容仅供个人学习使用,如果侵权请联系删除。另外,如有出错,欢迎指正。