目录
- 1 Modbus TCP 数据协议
- 1.1 数据格式
- 1.2 报文头(MBAP头)
- 1.3 功能码
- 1.4 Modbus 地址映射到 CPU 地址
- 2 Modbus TCP 通讯数据示例
- 2.1 功能码01 读离散输出线圈
- 2.2 功能码02 读离散输入线圈
- 2.3 功能码03 读保持寄存器
- 2.4 功能码04 读输入寄存器
- 2.5 功能码05 写单个离散输出寄存器
- 2.6 功能码06 写单个保持寄存器
- 2.7 功能码15 写多个线圈寄存器
- 2.8 功能码16 写多个保持寄存器
- 3 西门子200Samrt 做服务器端编程示例
- 3.1 调用库指令
- 3.2 编程
- 4 Modbus TCP通讯调试软件测试
- 4.1 软件介绍
- 4.2 软件使用说明
- 4.2.1 连接PLC
- 4.2.2 访问PLC
- 4.2.3 其它说明
1 Modbus TCP 数据协议
1.1 数据格式
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据 |
---|---|---|---|---|---|---|
2字节 | 2字节 | 2字节 | 1字节 | 1字节 | 2字节 | N字节 |
1.2 报文头(MBAP头)
其中,事务处理标识、协议标识符、长度和单元标识符统称为报文头(MBAP头)。
内容 | 解释 |
---|---|
事务处理标识 | 可以理解为报文序列号,一般每次通信后就要加1,以区分不同的通信数据报文。 |
协议标识符 | 00 00 表示Modbus TCP 协议 |
长度 | 接下来数据长度,单位字节 |
单元标识符 | 设备地址,一般为01 |
1.3 功能码
功能码 | 描述 | 说明 | MOUBUS地址 |
---|---|---|---|
01 | 读离散输出寄存器 | 位操作 | 00001 ~ 09999 |
02 | 读离散输入寄存器 | 位操作 | 10001 ~ 19999 |
03 | 读保持寄存器 | 字操作 | 40001 ~ 49999 |
04 | 读输入寄存器 | 字操作 | 30001 ~ 39999 |
05 | 写离散输出寄存器 | 位操作 | 00001 ~ 09999 |
06 | 写保持寄存器 | 字操作 | 40001 ~ 49999 |
15 | 写多线圈寄存器 | 位操作 | 00001 ~ 09999 |
16 | 写多个保持寄存器 | 字操作 | 40001 ~ 49999 |
1.4 Modbus 地址映射到 CPU 地址
Modbus 地址 | CPU 地址 |
---|---|
00001 | Q0.0 |
00002 | Q0.1 |
…… | …… |
10001 | I0.0 |
10002 | I0.1 |
…… | …… |
30001 | AIW0 |
30002 | AIW2 |
…… | …… |
40001 | Vx(保持寄存器起始地址)例:VW0 |
40002 | Vx+2 =(保持寄存器起始地址+2)例:VW2 |
…… | …… |
2 Modbus TCP 通讯数据示例
2.1 功能码01 读离散输出线圈
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据长度 |
---|---|---|---|---|---|---|
00 11 | 00 00 | 00 06 | 01 | 01 | 00 00 | 00 08 |
注释:读取Q0.0地址开始的8个连续输出点(即Q0.0-Q0.7)。
2.2 功能码02 读离散输入线圈
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据长度 |
---|---|---|---|---|---|---|
00 15 | 00 00 | 00 06 | 01 | 02 | 00 00 | 00 08 |
注释:读取I0.0地址开始的8个连续输出点(即I0.0-I0.7)。
2.3 功能码03 读保持寄存器
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据长度 |
---|---|---|---|---|---|---|
00 66 | 00 00 | 00 06 | 01 | 03 | 00 00 | 00 02 |
注释:读取VW0地址开始的2个连续字空间(即vw0,vw2)。
2.4 功能码04 读输入寄存器
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据长度 |
---|---|---|---|---|---|---|
00 97 | 00 00 | 00 06 | 01 | 04 | 00 00 | 00 02 |
注释:读取AIW0地址开始的2个连续字空间(即AIW0,AIW2)。
2.5 功能码05 写单个离散输出寄存器
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据 |
---|---|---|---|---|---|---|
00 C2 | 00 00 | 00 06 | 01 | 05 | 00 00 | FF 00 |
注释:将地址00000的输出离散线圈置一(即让Q0.0置一)。
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据 |
---|---|---|---|---|---|---|
01 0A | 00 00 | 00 06 | 01 | 05 | 00 01 | 00 00 |
注释:将地址00001的输出离散线圈置一(即让Q0.1复位)。
2.6 功能码06 写单个保持寄存器
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据 |
---|---|---|---|---|---|---|
01 5e | 00 00 | 00 06 | 01 | 06 | 00 02 | 00 7b |
注释:往地址VW4寄存器中写入数值0x007B(即十进制数123)。
2.7 功能码15 写多个线圈寄存器
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据长度(位) | 字节数 | 数据 |
---|---|---|---|---|---|---|---|---|
01 5e | 00 00 | 00 09 | 01 | 0F | 00 00 | 00 10 | 02 | aa cb |
注释:往地址QB0寄存器中写入数值0xaa,往地址QB1寄存器中写入数值0xcb。
数据长度位不满8的N倍,字节数也算N个。
2.8 功能码16 写多个保持寄存器
事务处理标识 | 协议标识 | 长度 | 单元标识 | 功能码 | 起始地址 | 数据长度(字) | 字节数 | 数据 |
---|---|---|---|---|---|---|---|---|
02 68 | 00 00 | 00 0B | 01 | 10 | 00 00 | 00 02 | 04 | 00 7B 00 EA |
注释:往地址VW0寄存器中写入数值0x007B,往地址VW2寄存器中写入数值0x00EA。
3 西门子200Samrt 做服务器端编程示例
3.1 调用库指令
3.2 编程
具体操作数值详见F1帮助文档。
4 Modbus TCP通讯调试软件测试
4.1 软件介绍
软件名称为:Modbus Poll
网络搜索自行下载,破解。
4.2 软件使用说明
4.2.1 连接PLC
依次点击Connection→Connect…→弹出界面
按图指引自行修改,单击OK按钮。
4.2.2 访问PLC
单击图示指引图标
弹出界面,按需修改(图示以写单个保持寄存器为例),单击OK按钮。
双击数值处表格,在弹出的对话框中修改数值即可。
4.2.3 其它说明
软件在使用功能码05时,无法通过双击表格修改数据,只能设置为功能码01,然后通过双击表格修改数据。