MODBUS TCP协议实例数据帧详细分析

  • 1.简介
  • 2.ModbusTCP数据帧
    • 2.1.报文头MBAP
    • 2.2.帧结构PDU
  • 3.ADU详细结构
    • 3.1. 0x01:读线圈
    • 3.2. 0x02:读离散量输入
    • 3.3. 0x03:读保持寄存器
    • 3.4. 0x04:读输入寄存器
    • 3.5. 0x05:写单个线圈
    • 3.6. 0x06:写单个保持寄存器
    • 3.7. 0x0F:写多个线圈
    • 3.8. 0x10:写多个保持寄存器

1.简介

Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

2.ModbusTCP数据帧

ModbusTCP的数据帧可分为两部分:MBAP+PDU,如下图所示。

2.1.报文头MBAP

MBAP为报文头,长度为7字节,组成如下:

事务处理标识 协议标识 长度 单元标识符
2字节 2字节 2字节 1字节
内容 含义
事务处理标识 可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文
协议标识符 00 00 表示Modbus TCP协议
长度 表示接下来的数据长度,单位为字节。
单元标识符 可以理解为设备地址

2.2.帧结构PDU

PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。
Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。

对象 含义
线圈 PLC的输出位,开关量,在Modbus中可读可写
离散量 PLC的输入位,开关量,在Modbus中只读
输入寄存器 PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读
保持寄存器 PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写

根据对象的不同,Modbus的功能码有:

功能码 含义
0x01 读线圈
0x02 读离散量输入
0x03 读保持寄存器
0x04 读输入寄存器
0x05 写单个线圈
0x06 写单个保持寄存器
0x0F 写多个线圈
0x10 写多个保持寄存器

说明更详细的表如下表所示

功能码 中文含义解析 英文含义解析 位/字操作 操作数量
0x01 读线圈状态 READ COIL STATUS 位操作 单个或多个
0x02 读离散量输入状态 READ INPUT STATUS 位操作 单个或多个
0x03 读保持寄存器 READ HOLDING REGISTER 字操作 单个或多个
0x04 读输入寄存器 READ INPUT REGISTER 字操作 单个或多个
0x05 写单个线圈 WRITE SINGLE COIL 位操作 单个
0x06 写单个保持寄存器 WRITE SINGLE REGISTER 字操作 单个
0x0F 写多个线圈 WRITE MULTIPLE COIL 位操作 多个
0x10 写多个保持寄存器 WRITE MULTIPLE REGISTER 字操作 多个

3.ADU详细结构

3.1. 0x01:读线圈

在从站中读连续线圈状态,ON=1,OFF=0。

  • 请求:
MBAP 功能码 起始地址H 起始地址L 线圈数量H 线圈数量L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 线圈数据长度 数据
7字节 1字节 1字节 线圈数据长度个字节

注意:线圈数据长度=1+线圈数/8

如:在从站0x01中,读取开始地址为0x0000的线圈数据,读0x0008位。

  • 请求:
MBAP 功能码 起始地址H 起始地址L 线圈数量H 线圈数量L
00 01 00 00 00 06 01 01 00 00 00 08

如:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF。

  • 响应:
MBAP 功能码 线圈数据长度 数据
00 01 00 00 00 04 01 01 01 01

3.2. 0x02:读离散量输入

在从站中读连续离散量输入状态,ON=1,OFF=0。

  • 请求:
MBAP 功能码 起始地址H 起始地址L 离散量输入数量H 离散量输入数量L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 离散量输入数据长度 数据
7字节 1字节 1字节 离散量输入数据长度个字节

注意:离散量输入数据长度=1+离散量输入/8

如:在从站0x01中,读取开始地址为0x0000的线圈数据,读0x0008位。

  • 请求:
MBAP 功能码 起始地址H 起始地址L 离散量输入数量H 离散量输入数量L
00 01 00 00 00 06 01 02 00 00 00 08

如:在从站0x01中,读取开始地址为0x0000的离散量输入数据,读0x008位

  • 响应:
MBAP 功能码 离散量输入数据长度 数据
00 01 00 00 00 04 01 02 01 01

3.3. 0x03:读保持寄存器

在从站中读连续保持寄存器的值

  • 请求:
MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 数据长度 数据
7字节 1字节 1字节 数据长度个字节

注意:保持寄存器数据长度=保持寄存器数*2

如:在从站0x01中,读取开始地址为0x0000的保持寄存器数据,读0x003个

  • 请求:
MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L
00 01 00 00 00 06 01 03 00 00 00 03

如:数据长度为0x06个字节,第1个寄存器的数据为0x21,其余为0x00。

  • 响应:
MBAP 功能码 数据长度 数据
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00

3.4. 0x04:读输入寄存器

在从站中读连续输入寄存器的值

  • 请求:
MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 数据长度 数据
7字节 1字节 1字节 数据长度个字节

注意:输入寄存器数据长度=输入寄存器数*2

如:在从站0x01中,读取开始地址为0x0000的输入寄存器数据,读0x003个

  • 请求:
MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L
00 01 00 00 00 06 01 04 00 00 00 03

如:数据长度为0x06个字节,第1个寄存器的数据为0x21,其余为0x00。

  • 响应:
MBAP 功能码 数据长度 数据
00 01 00 00 00 09 01 04 06 00 21 00 00 00 00

3.5. 0x05:写单个线圈

将从站中的一个线圈输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF

  • 请求:
MBAP 功能码 线圈地址H 线圈地址L 输出值H 输出值L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 线圈地址H 线圈地址L 输出值H 输出值L
7字节 1字节 1字节 1字节 1字节 1字节

如:在从站0x01中,将地址为0x0000的线圈设置为ON

  • 请求:
MBAP 功能码 线圈地址H 线圈地址L 输出值H 输出值L
00 01 00 00 00 06 01 05 00 00 FF 00
  • 响应:
MBAP 功能码 线圈地址H 线圈地址L 输出值H 输出值L
00 01 00 00 00 06 01 05 00 00 FF 00

3.6. 0x06:写单个保持寄存器

将从站中的一个保持寄存器设置

  • 请求:
MBAP 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L
1字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L
1字节 1字节 1字节 1字节 1字节 1字节

如:在从站0x01中,将地址为0x0000的保持寄存器设置为0x000A。

  • 请求:
MBAP 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L
00 01 00 00 00 06 01 06 00 00 00 0A
  • 响应:
MBAP 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L
00 01 00 00 00 06 01 06 00 00 00 0A

3.7. 0x0F:写多个线圈

将从站中的多个线圈输出写成ON或OFF,线圈输出值每1位“1”请求输出为ON,“0”请求输出为OFF

  • 请求:
MBAP 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L 线圈输出字节长度 线圈输出值
7字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节

注意:线圈输出字节长度=1+线圈数/8

  • 响应:
MBAP 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L
7字节 1字节 1字节 1字节 1字节 1字节

如:在从站0x01中,将以地址0x0000开始连续的4个线圈设置为ON

  • 请求:
MBAP 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L 线圈输出字节长度 线圈输出值
00 01 00 00 00 08 01 0F 00 00 00 04 01 0F
  • 响应:
MBAP 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L
00 01 00 00 00 06 01 0F 00 00 00 04

3.8. 0x10:写多个保持寄存器

写从站中的多个连续的寄存器。

  • 请求:
MBAP 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L 寄存器数据字节长度 寄存器数据
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节

注意:寄存器数据字节长度=寄存器数量×2

  • 响应:
MBAP 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L
1字节 1字节 1字节 1字节 1字节 1字节

如:在从站0x01中,向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F。

  • 请求:
MBAP 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L 寄存器数据字节长度 寄存器数据
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
  • 响应:
MBAP 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L
00 01 00 00 00 06 01 10 00 00 00 01

MODBUS TCP协议实例数据帧详细分析相关推荐

  1. ModBus/TCP协议分析

    ModBus/TCP协议分析 一.术语 1 word = 2 byte; 1 byte = 8 bit. 校验码:校验码是由前面的数据通过某种算法得出的,用以检验该组数据的正确性.代码作为数据在向计算 ...

  2. Modbus和Modbus/TCP协议

    Modbus和Modbus/TCP协议 文章目录 Modbus和Modbus/TCP协议 一. 概述 二. 协议规范 (1) Modbus应用协议 (2)通用Modbus帧结构--协议数据单元(PDU ...

  3. 从入门到入土:基于C语言采用TCP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  4. Modbus tcp协议学习总结

    Modbus=报文头(MBAP)+帧结构(PDU) 注意:据说RTU和TCP的差距就是效验码,具体我也没有操作,所以这里介绍的只有TCP相关内容.看这个章节的时候最好下载Modbus Slave(服务 ...

  5. Modbus TCP协议解析

    在之前的文章中,我们介绍了Modbus RTU协议的内容和实现方法.最近在进行网络通讯的时候又用到了Modbus TCP协议,因此这里把自己对Modbus TCP的了解总结一下. 文章目录 一.Mod ...

  6. C# modbus TCP协议应用

    C# modbus TCP协议应用 协议简介 Modbus由MODICON公司(现施耐德公司)于1979年开发,是一种工业现场总线协议标准.主要分为了RTU,ASCII,TCP三种协议类型.本文我们只 ...

  7. 4路DI开关检测计数器, Modbus TCP协议,WiFi模块 WJ160

    产品特点: ●  4路开关量输入,支持NPN和PNP输入 ●  DI每一路都可用作计数器或者频率测量 ● 支持Modbus TCP 通讯协议 ● 可以设置每转脉冲数用于转速测量 ● 内置网页功能,可以 ...

  8. 在ROS上使用ModBus/Tcp协议控制机械手爪

    机械臂的控制原本使用的就是ROS进行的,奈何实验室机械臂上买的机械二指夹爪并不支持ROS平台,及没有对应的模型文件和控制的包,因此控制机械手爪就需要其他办法. 所使用的机械手爪为nGripper90, ...

  9. C#上位机与台达PLC通信,modbus TCP协议

    C#上位机与台达PLC通信,modbus TCP协议. 1.真实使用项目,该程序框架完整,适合在此基础上开发项目. 2.使用VS2019开发. 3.项目还涉及到halcon视觉检测功能. YID:76 ...

最新文章

  1. STL源代码分析(ch 1)组态1
  2. ICCV 2019 COCO Mapillary挑战赛冠军团队技术分享
  3. 英雄联盟诺手又回来了,国服诺手在上单,可谓一夫当关,万夫莫开
  4. 洛谷 - P2756 飞行员配对方案问题(二分图最大匹配+路径打印)
  5. SQL总结(一)基本查询
  6. Linux 下用来查询安装包信息的RPM选项
  7. matlab eval函数_matlab自动给变量命名
  8. 使用TFHpple解析html
  9. 使用redis做缓存,遇到Could not return the resource to the pool异常怎么办呐!
  10. 华为和新华三OSPF单区域配置
  11. 超级简单的纯js 象棋,看一遍你也会写
  12. c语言vs2013下载官方下载,Microsoft Visual C++2013运行库下载
  13. 万网域名怎么做解析教程图解
  14. 贝叶斯估计理论——引子
  15. 算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)
  16. doccano安装与使用(Win10)
  17. PLC实训 —系统电路及设备认识
  18. Casbin-authz-plugin:基于Casbin的Docker权限管理、访问控制插件
  19. selenium 模拟IE浏览器click元素无反应的解决方案 (python3)
  20. 正大国际期货:若想期货交易持续盈利务必牢记333仓位控制法

热门文章

  1. html添加友情链接,WordPress利用css添加“友情链接”功能
  2. 软件生命周期模型及其选择
  3. 论文解读 《Enhancing Underwater Imagery using Generative Adversarial Networks》ICRA2018
  4. 对警报线程池的警报线程_警报引起的辛劳
  5. Uncaught ReferenceError: $ is not defined几种处理方式
  6. 临床医生眼中的五大高压科室,你入选了吗
  7. hadoop-hive1
  8. 一元线性回归方程第二部分——一元线性回归模型
  9. Hello Qt——QMake用户指南
  10. 第七章-mapreduce编程实战实验