原文连接:https://blog.csdn.net/iknow_nothing/article/details/84292914html
简介
Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。服务器
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。spa
标准的Modbus协议物理层接口有RS23二、RS42二、RS485和以太网接口,采用master/slave方式通讯。.net
ModbusTCP数据帧
ModbusTCP的数据帧可分为两部分:MBAP+PDU。3d
报文头MBAP
MBAP为报文头,长度为7字节,组成以下:server
事务处理标识 |
协议标识 |
长度 |
单元标识符 |
2字节 |
2字节 |
2字节 |
1字节 |
内容 |
解释 |
事务处理标识 |
能够理解为报文的序列号,通常每次通讯以后就要加1以区别不一样的通讯数据报文。 |
协议标识符 |
00 00表示ModbusTCP协议。 |
长度 |
表示接下来的数据长度,单位为字节。 |
单元标识符 |
能够理解为设备地址。 |
帧结构PDU
PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。htm
功能码对象
Modbus的操做对象有四种:线圈、离散输入、输入寄存器、保持寄存器。blog
对象 |
含义 |
线圈 |
PLC的输出位,开关量,在Modbus中可读可写 |
离散量 |
PLC的输入位,开关量,在Modbus中只读 |
输入寄存器 |
PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读 |
保持寄存器 |
PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写 |
根据对象的不一样,Modbus的功能码有:接口
功能码 |
含义 |
0x01 |
读线圈 |
0x05 |
写单个线圈 |
0x0F |
写多个线圈 |
0x02 |
读离散量输入 |
0x04 |
读输入寄存器 |
0x03 |
读保持寄存器 |
0x06 |
写单个保持寄存器 |
0x10 |
写多个保持寄存器 |
PDU详细结构
0x01:读线圈
在从站中读1~2000个连续线圈状态,ON=1,OFF=0
- 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
- 响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)
- 如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位
00 01 00 00 00 06 01 01 00 02 00 08
- 回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其他为OFF
00 01 00 00 00 04 01 01 01 01
0x05:写单个线圈
将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF
- 请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
- 响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
- 如:将地址为0x0003的线圈设为ON
00 01 00 00 00 06 01 05 00 03 FF 00
- 回:写入成功
00 01 00 00 00 06 01 05 00 03 FF 00
0x0F:写多个线圈
将一个从站中的一个线圈序列的每一个线圈都强制为ON或OFF,数据域中置1的位请求相应输出位ON,置0的位请求响应输出为OFF
- 请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L
- 响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L
0x02:读离散量输入
从一个从站中读1~2000个连续的离散量输入状态
- 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
- 响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))
- 如:从地址0x0000开始读0x0012个离散量输入
00 01 00 00 00 06 01 02 00 00 00 12
- 回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其他为OFF
00 01 00 00 00 06 01 02 03 01 04 00
0x04:读输入寄存器
从一个远程设备中读1~2000个连续输入寄存器
- 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
- 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
- 如:读起始地址为0x0002,数量为0x0005的寄存器数据
00 01 00 00 00 06 01 04 00 02 00 05
- 回:数据长度为0x0A,第一个寄存器的数据为0x0c,其他为0x00
00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00
0x03:读保持寄存器
从远程设备中读保持寄存器连续块的内容
- 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
- 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
- 如:起始地址是0x0000,寄存器数量是 0x0003
00 01 00 00 00 06 01 03 00 00 00 03
- 回:数据长度为0x06,第一个寄存器的数据为0x21,其他为0x00
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00
0x06:写单个保持寄存器
在一个远程设备中写一个保持寄存器
- 请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
- 响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
- 如:向地址是0x0000的寄存器写入数据0x000A
00 01 00 00 00 06 01 06 00 00 00 0A
- 回:写入成功
00 01 00 00 00 06 01 06 00 00 00 0A
0x10:写多个保持寄存器
在一个远程设备中写连续寄存器块(1~123个寄存器)
- 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)
- 响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
- 如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
- 回:写入成功
00 01 00 00 00 06 01 10 00 00 00 01
Modbus TCP 示例报文
原文连接:https://blog.csdn.net/mikasoi/article/details/81782159
ModBusTcp与串行链路Modbus的数据域是一致的,具体数据域能够参考串行Modbus。这里给出几个ModbusTcp的链路解析说明,辅助新人分析报文。




ModbusTCP通讯
通讯方式
Modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通讯时,主站为client端,主动创建链接;从站为server端,等待链接。
- 主站请求:功能码+数据
- 从站正常响应:请求功能码+响应数据
- 从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
- 注意:须要超时管理机制,避免无期限的等待可能不出现的应答
IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中惟一分配到的端口号。
通讯过程
- connect 创建TCP链接
- 准备Modbus报文
- 使用send命令发送报文
- 在同一链接下等待应答
- 使用recv命令读取报文,完成一次数据交换
- 通讯任务结束时,关闭TCP链接
4 仿真软件
- Modbus poll 和Modbus slave是一组Modbus仿真软件,能够实现Modbus RTU、TCP、串口仿真等。
- 在ModbusTCP中,Modbus poll 做为客户端请求数据,Modbus slave 做为服务器端处理请求。
- 使用c语言编写客户端链接Modbus slave时,注意数据格式,一条指令一次性发出,不然链接会出错。
- 使用软件时,须要指定功能码,在setup->slave definition或者poll definition中进行设置。
– slave ID:从站编号(事务标识符)
– function:功能码,0x01对应线圈操做,0x02对应离散量操做,0x03对应保持寄存器操做,0x04对应输入寄存器操做
– address:开始地址
– quantity:寄存器/线圈/离散量 的数量
参考:
https://wenku.baidu.com/view/c2a9e1cc376baf1ffd4fad5c.html
https://blog.csdn.net/zwxue251/article/details/24154951
https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1
一些概念
原文连接:https://wenku.baidu.com/view/55595d0690c69ec3d5bb75ed.html