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

2023-11-14

1.简介

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

2.ModbusTCP数据帧

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

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MODBUS TCP协议实例数据帧详细分析 的相关文章

  • CH3___Debugging C++ Programs

    3 1 Syntax and semantic errors Modern compilers have been getting better at detecting certain types of common semantic e
  • Linux下yum命令及软件的安装

    yum命令 1 yum install softwarename 安装 2 yum remove softwarename 卸载 安装dhcp及卸载 mkdir iso 建立目录 mv home kiosk Desktop iso iso
  • tcp 是一个安全的网络协议

    1 tcp 是一个安全的网络协议 确定双方的收发能力之后 才会真正传输数据 2 tcp 建立起一个连接 比较消耗成本 所以比较平稳 安全 3 3次握手 发起连接 双方确认 确认双方的收发能力 客户端告诉服务器i我要创建连接i 一次 服务器告
  • 出栈的合法性检测

    对于一个给定的入栈顺序 可能的出栈顺序会有很多 但是肯定都要遵循栈 后进先出 的特点 那么怎么进行合法性检测呢 算法思想如下 定义变量InIndex标记入栈序列的当前位置 定义OutIndex标记出栈序列的当前位置 对InIndex和Out

随机推荐

  • 利用纯净语音和噪声合成不同信噪比的训练数据

    如题 这应该算是我前往语音这座大山的第一步 在此做出记录 一 工作背景 由于需要进行单通道降噪的实验 但是现在只有纯净语音和噪声数据 而在阅读文章的过程中 大家并没有将这个细小的内容写道论文中 的确也不应该 做出来之后确实感觉蛮简单的 所以
  • python爬虫ip被封怎么办?

    用python写的爬虫 设置了headers 包括host和useragent 设置了cookies 访问的结果是 访问过于频繁 请输入验证码 但是用浏览器访问怎么刷新都没有问题 这个时候大致可以判定你被反爬虫锁定 那怎样解决 你可能不太了
  • Python无法识别csv文件

    我的报错 utf 8 codec can t decode byte 0xc9 in position 84 invalid continuation byte 大概意思是utf 8无法识别文件里的一些信息 后面将encoding里面改成下
  • 【Java编程】图书管理系统

    图书管理系统 我们用一个列表存放书籍信息 private static List
  • paxos算法_共识算法(8) —— PBFT 算法详解

    本文翻译自 伊利诺伊大学厄巴纳 香槟分校助理教授 Ling Ren 开设的讨论课 CS598 Consensus Algorithm 参考论文 PBFT 原论文 1999 pmg csail mit edu 前言 上一节中我们介绍了经典的P
  • IDEA项目初次上传到git(超简单)

    IDEA上传到git 1 右键项目 打开 终端 2 在打开的终端输入 git init 3 右键项目 选择 git gt 添加 add 4 右键项目 选择 git gt 提交 commit 输入 init 点击 提交并推送 commit a
  • Ehoney开源欺骗防御系统

    一 特点 支持丰富的蜜罐类型 通用蜜罐 SSH 蜜罐 Http蜜罐 Redis蜜罐 Telnet蜜罐 Mysql蜜罐 RDP 蜜罐 IOT蜜罐 RTSP 蜜罐 工控蜜罐 ModBus 蜜罐 基于云原生技术 基于k3s打造saas平台欺骗防御
  • 创建一们计算机语言_建立自己的计算机语言

    创建一们计算机语言 只需编码 如果您想构建自己的计算机语言 但又不知道该如何开始 或者您认为自己没有时间和技能来做到这一点 那么请看鲍勃 尼斯特罗姆 Bob Nystrom 的 技巧翻译 一书 即从刮 从一开始到成熟的面向对象的东西就是这样
  • JDBC工具类——JdbcUtils

    JdbcUtils 一 JDBC的工具类 二 JdbcUtils工具类的组成 1 类加载时加载驱动 2 连接池 db properties 3 ThreadLocal控制事务 4 dbcp连接池提高资源利用率 三 JDBC工具类的实例演变
  • Ubuntu opencv的搭建

    打开终端 apt install cmake 依次输入以下的命令 sudo apt get install cmake git libgtk2 0 dev pkg config libavcodec dev libavformat dev
  • Linux字符集的查看及修改

    一 查看字符集 字符集在系统中体现形式是一个环境变量 以CentOS6 5为例 其查看当前终端使用字符集的方式可以有以下几种方式 第一种 root Testa www tmp echo LANG zh CN UTF 8 第二种 root T
  • Nvidia显卡硬件编解码能力表 官方链接

    记录用 便于快速查找 从表中得知 1070支持 H265 10bit 硬件编码 似乎不错 官方链接 https developer nvidia com video encode and decode gpu support matrix
  • C++虚函数表地址偏移

    include
  • 架构图以及vue的简介

    架构图 前后端分离总架构图 前端架构设计图 MVVM 架构模式 MVVM 的简介 MVVM 由 Model View ViewModel 三部分构成 Model 层代表数据模型 也可以在Model中定义数据修改和操作的业务逻辑 View 代
  • 公务员和事业单位的差别有多大?

    公务员和事业单位是两种不同的就业形式和组织类型 它们在以下几个方面存在一些差别 1 归属关系 公务员属于政府部门的编制人员 直接依附于政府机构 而事业单位是独立法人实体 独立承担法人责任 不隶属于政府机构 2 支付方式 公务员工资由政府财政
  • 算法训练 P0505

    标题 include
  • 基于GBDT+LR模型的深度学习推荐算法

    GBDT LR算法最早是由Facebook在2014年提出的一个推荐算法 该算法分两部分构成 第一部分是GBDT 另一部分是LR 下面先介绍GBDT算法 然后介绍如何将GBDT和LR算法融合 1 1 GBDT算法 GBDT的全称是 Grad
  • flutter GridView和Wrap

    GridView有2种gridDelegate 记录小嵌套冲突的问题 SingleChildScrollView ListView GrilView嵌套问题解决 子布局添加属性 physics NeverScrollableScrollPh
  • Windows 10 Office文件图标异常处理(Word

    1 我们经常会遇到office重新安装完成后 或者换了版本后 前期做好的excel ppt word文件可以正常打开 但图标显示为白色或者异常 备注 如果不能正常打开 则是office程序没有关联到 只需要选中需打开文件 右键 更改 里面找
  • MODBUS TCP协议实例数据帧详细分析

    MODBUS TCP协议实例数据帧详细分析 1 简介 2 ModbusTCP数据帧 2 1 报文头MBAP 2 2 帧结构PDU 3 ADU详细结构 3 1 0x01 读线圈 3 2 0x02 读离散量输入 3 3 0x03 读保持寄存器