MODBUS-TCP协议详解
Modbus TCP协议
1. 简介
Modbus TCP是运行在TCP/IP上的Modbus报文传输协议。通过此协议,控制器相互之间通过网络(例以太网)和其它设备之间可以通讯。
Modbus TCP开放式的协议,IANA(Internet Assigned Numbers Authoritr,互联网编号分配管理机构)给MODBUS协议赋予TCP编口号502,这是目前在仪表与自动化行业中唯一分配到的端口号。
MODBUS TCP/IP协议模型
2. Modbus TCP 通讯结构
Ø Modbus TCP/IP的通讯设备:连接至TCP/IP网络的Modbus TCP/IP客户机和服务器设备;
Ø 互连设备,如:在TCP/IP网络和串行链路子网之间互连的网桥、路由器或网关设备;
3. Modbus TCP数据帧
MODBUS TCP数据帧与串行链路数据帧的区别
Modbus TCP的数据帧可分为两部分:MBAP+PDU。
事务处理标识 | 协议标识符 | 长度 | 单元标识符 | 功能码 | 数据 |
2 Bytes | 2 Bytes | 2 Bytes | 1 Bytes | 1 Byte | n Bytes |
3.1 报文头 MBAP
MBAP为报文头,长度为7字节,组成如下:
①事务处理标识 :可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
②协议标识符 :00 00表示Modbus-TCP协议。
③长度 :表示接下来的数据长度,单位为字节。
④单元标识符 :设备通讯站地址。
3.2 帧结构PDU
PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。
①功能码
Modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。
线圈:PLC的输出位,开关量,在Modbus中可读可写
离散量:PLC的输入位,开关量,在Modbus中只读
输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读
保持寄存器:PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写
根据对象的不同,Modbus的功能码有:
0x01:读线圈
0x05:写单个线圈
0x0F:写多个线圈
0x02:读离散量输入
0x04:读输入寄存器
0x03:读保持寄存器
0x06:写单个保持寄存器
0x10:写多个保持寄存器
② PDU详细结构
例:ZM10-32DI-11
MODBUS寄存器定义
偏移地址 | 数据内容 | 功能码 | 长度 |
0X 00 | 第1 路开关量输入 | 0X 02 | 1(bit) |
0X 01 | 第2 路开关量输入 | 0X 02 | 1(bit) |
0X 02 | 第3 路开关量输入 | 0X 02 | 1(bit) |
…… | 0X 02 | 1(bit) | |
0X 1F | 第32 路开关量输入 | 0X 02 | 1(bit) |
0X 00 | 第1~16路开入 | 0X 04 | 1(WORD) |
0X 01 | 第17~32路开入 | 0X 04 | 1(WORD) |
0X 00 | 第1~16路开入 | 0X 03 | 1(WORD) |
0X 01 | 第17~32路开入 | 0X 03 | 1(WORD) |
使用时一般仅采用02号功能码即可。
在从站中读32个连续离散量输入,ON=1,OFF=0
请求: 5E 36 00 00 00 06 01 02 00 00 00 20
响应: 5E 36 00 00 00 07 01 02 04 01 00 00 00
解析:
请求:[5E 36]事物处理标识,[00 00] MODBUS-TCP协议标识,[00 06]数据发送区字节数,[01]从站号,[02]读取开关量输入功能码,[00 00]起始地址,[00 20]32个离散输入寄存器。
响应:[5E 36]事物处理标识,[00 00] MODBUS-TCP协议标识,[00 07]数据发送区字节数,[01]从站号,[02]读取开关量输入功能码,[04]寄存器偏个数,[01 00 00 00]32个离散输入分别对应4字节,此4路第一字节对应第1~8 路数据为0x01,按位解析00000001,表示第1路开关量闭合;第9~16、17~24、25~32路离散输入依次对应后面3个字节; [00 00 00]表示9~32路开关量输入均未导通。
4. Modbus TCP报文传输服务结构
5. 通讯应用层
Ø Modbus 客户机:允许用户应用控制与远程设备的信息交换。Modbus 客户机根据用户应用向Modbus 客户机的发送要求中包含的参数来建立一个请求;
Ø Modbus 客户机接口:Modbus 客户机接口提供一个接口,使得用户应用能够生成各类Modbus服务的请求,该服务包括对Modbus应用对象的访问。
Ø Modbus服务器:在收到一个Modbus请求后,模块激活一个本地操作进行读、写或完成其它操作。
6. TCP管理层
管理通讯的建立和结束以及管理在所建立的TCP连接上的数据流。
Ø 连接管理:在客户机和服务器的Modbus模块之间的通讯需要使用TCP连接管理模块,负责全面管理报文传输TCP连接。
Ø 访问控制:在某些至关重要的场合,必须禁止无关的主机对设备内部数据的访问。
7. TCP/IP栈层
可以对TCP/IP的栈进行参数配置,以适应不同的产品或系统特定的约束条件,来进行数据流控制、地址管理和连接管理,使用BSD套接字接口来管理TCP连接。
8. TCP 连接管理
Ø Modbus通讯需要建立客户机与服务器之间的TCP连接;
Ø 连接的建立可以由用户应用模块直接实现,也可以由TCP连接管理模块自动完成;
Ø 在第一种情况下,用户应用模块必须提供应用程序接口,以便完全管理连接。这种方式为应用开发人员提供了灵活性,但需要TCP/IP机制方面的专长。
Ø 在第二种情况,TCP连接管理完全不出现,用户应用仅需要发送和接受Modbus报文。TCP连接管理模块负责在需要时建立新的TCP连接。
9. TCP连接的建立
Ø Modbus报文传输服务必须在502端口上提供一个监听套接字,允许接受新的连接和与其它设备交换数据;
Ø 当报文传输服务需要与远程服务器交换数据时,它必须与远程502端口建立一个新的客户及连接,以便于远距离地交换数据。本地端口必须高于1024,并且对每个客户机的连接各不相同。
10. 信息交换过程
完整的Modbus TCP通讯过程:客户机建立一个连接,向服务器发送3个Modbus请求,而不等待第一个请求的应答到来。在收到所有的应答后,客户机正常地关闭连接。
Ø 客户机的通讯过程如下:
①用Connect 命令建立与目标设备的连接;
②准备Modbus报文包括7个字节的MBAP在内的请求;
③使用Send命令发送报文;
④在同一连接下等待应答;
⑤用Recv命令读取报文,完成一次数据交换过程。当通讯任务结束时,关闭TCP连接,使MODBUS TCP服务器可为其它客户机服务。
11. Modbus TCP数据帧详解示例
11.1 离散量示例
① 0x02:读离散量输入(读取1 #开关量输入状态,假设设备地址为1)
Ø 主站发送命令示例
00 01 00 00 00 06 01 02 00 00 00 01
MBAP 设备地址 功能码 起始地址 离散量数量
Ø 从设备返回数据示例
00 01 00 00 00 04 01 02 01 01
MBAP 设备地址 功能码 数据长度 数据内容
数据内容01表示,1#开关量输入为ON
② 0x02:读离散量输入(读取1到18#开关量输入状态,假设设备地址为1)
Ø 主站发送命令示例
00 01 00 00 00 06 01 02 00 00 00 12
MBAP 设备地址 功能码 起始地址 离散量数量
Ø 从设备返回数据示例
00 01 00 00 00 06 01 02 03 01 04 00
MBAP 设备地址 功能码 数据长度 数据内容
数据内容01 04 00,表示第1个离散量输入和第11个离散量输入为ON,其余为OFF
③ 0x02:读离散量输入(读取1到32#开关量输入状态,假设设备地址为1)
Ø 主站发送命令示例
00 01 00 00 00 06 01 02 00 00 00 20
MBAP 设备地址 功能码 起始地址 离散量数量
Ø 从设备返回数据示例
00 01 00 00 00 07 01 02 04 01 01 01 01
MBAP 设备地址 功能码 数据长度 数据内容
数据内容01 01 01 01,表示第1、9、17、25个开关量输入为ON,其余为OFF
11.2 线圈读取状态、控制示例
① 0x01:读线圈(读取开始地址为0x0002[即第3路]的线圈数据,连续读8路,假设设备地址为1)
Ø 主站发送命令示例:
00 01 00 00 00 06 01 01 00 02 00 08
MBAP 设备地址 功能码 起始地址 线圈数量
Ø 从设备返回数据示例:
00 01 00 00 00 05 01 01 01 01
MBAP 设备地址 功能码 数据长度 数据内容
数据长度为0x01个字节,数据为0x01,从0x0002地址起的第一个线圈状态为ON,其余为OFF
② 0x01:读线圈(读取开始地址为0x0000[即第1路]的线圈数据,连续读32位,假设设备地址为1)
Ø 主站发送命令示例:
00 01 00 00 00 06 01 01 00 00 00 20
MBAP 设备地址 功能码 起始地址 线圈数量
Ø 从设备返回数据示例:
00 01 00 00 00 07 01 01 04 01 02 04 08
MBAP 设备地址 功能码 数据长度 数据内容
数据长度为0x04个字节,数据为0x01 02 04 08,第1、10、19、28路线圈状态为ON,其余为OFF
③ 0x05:写单个线圈(将地址为0x0003的线圈[即第4路线圈],假设设备地址为1)设为ON
主站发送命令示例:
00 01 00 00 00 06 01 05 00 03 FF 00
MBAP 设备地址 功能码 起始地址 数据内容
从设备返回数据示例:
00 01 00 00 00 06 01 05 00 03 FF 00
MBAP 设备地址 功能码 起始地址 数据内容
将主站发送的数据原样返回,表示写线圈成功
④ 0x05:写单个线圈(将地址为0x0003的线圈[即第4路线圈],假设设备地址为1)设为OFF
主站发送命令示例:
00 01 00 00 00 06 01 05 00 03 00 00
MBAP 设备地址 功能码 起始地址 数据内容
从设备返回数据示例:
00 01 00 00 00 06 01 05 00 03 00 00
MBAP 设备地址 功能码 起始地址 数据内容
将主站发送的数据原样返回,表示写线圈成功
⑤ 0x15:写多个线圈,将第1~16路线圈的前8路线圈设为ON,后8路线圈设为OFF
主站发送命令示例:
00 01 00 00 00 09 01 0F 00 00 00 10 02 FF 00
MBAP 设备地址 功能码 起始地址 线圈个数 数据长度 数据内容
从设备返回数据示例:
00 01 00 00 00 06 01 0F 00 00 00 10
MBAP 设备地址 功能码 起始地址 线圈个数
⑥ 0x15:写多个线圈,将第1~32路线圈的第1、3、5、6、7、8、10、12路线圈设为ON,其余线圈设为OFF
主站发送命令示例:
00 01 00 00 00 0B 01 0F 00 00 00 20 04 F5 0A 00 00
MBAP 设备地址 功能码 起始地址 线圈个数 数据长度 数据内容
从设备返回数据示例:
00 01 00 00 00 06 01 0F 00 00 00 20
MBAP 设备地址 功能码 起始地址 线圈个数
上一篇:没有了!