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

这篇具有很好参考价值的文章主要介绍了MODBUS TCP协议实例数据帧详细分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 读线圈状态
0x02 读离散量输入状态
0x03 读保持寄存器
0x04 读输入寄存器
0x05 写单个线圈
0x06 写单个保持寄存器
0x0F 写多个线圈
0x10 写多个保持寄存器

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+(线圈数-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+(离散量输入-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
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L
7字节 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+(线圈数-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 寄存器数据字节长度 寄存器数据
7字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节

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

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

如:在从站0x01中,向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F。文章来源地址https://www.toymoban.com/news/detail-450211.html

  • 请求:
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协议实例数据帧详细分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式通信协议【Modbus】Modbus TCP的帧格式

    Client request:例: 19 B2 00 00 00 06 06 03 00 27 00 02 上面是modbus客户端发出的报文内容,为modbus tcp/ip协议格式,其前面的六个字节为头字节( header handle); 19 B2 00 00 00 06 19 B2  00 00 00 06 两个Client发出的检验信息,Sever端只是需要将这两个字节的内容copy以后再放到response的报文的相应位

    2024年02月05日
    浏览(45)
  • ModBus通讯协议(Java代码实例)

    什么是Modbus Modbus是在1970年末为可编程逻辑控制器通信开发的,Modbus是一种串行通信协议,目的是用于与PLC设备进行串口通讯,在需要对PLC设备进行数据通讯的时候进行使用。 为什么要使用Modbus 为什么要使用Modbus协议,因为Modbus协议是modicon公司于1979年为使用PLC通讯发表的,

    2024年02月09日
    浏览(28)
  • Modbus TCP通信协议详解

    一、Modbus TCP通信概述 MODBUS/TCP是简单的、中立厂商的用于管理和控制自动化设备的MODBUS系列通讯协议的派生产品,显而易见,它覆盖了使用TCP/IP协议的“Intranet”和“Internet”环境中MODBUS报文的用途。协议的最通用用途是为诸如PLC,I/O模块,以及连接其它简单域总线或I/O模块的

    2024年02月08日
    浏览(134)
  • C# Modbus通信从入门到精通(21)——Modbus TCP协议原理

    Modbus TCP是走网口的,也可以在同一时间内有多个从站访问主站,并且通过Modbus事务处理标识来区分同一时刻的不同Modbus事务,这是区别于Modbus ASCII和Modbus RTU的地方。 Modbus客户端通常输入Modbus服务器的IP地址和端口号来建立TCP连接,然后根据从站地址来确定具体访问哪个从站

    2024年02月15日
    浏览(36)
  • Modbus-TCP协议说明

    文章要说明Modbus TCP协议的相关内容。此协议是1996年施耐德公司推出的基于TCP/IP协议的Modbus协议。 此协议与Modbus-RTU协议最大的不同就是,使用了在TCP/IP协议上的专用的报文头识别Modbus应用数据单元。这种报文头被称为MBAP报文头。  报文头的长度是7个字节,分别有: 事务处理

    2024年02月11日
    浏览(44)
  • modbus-tcp-rtu协议图表

    MODBUS TCP 读寄存器 请求 序号 意义 所占字节 字节存放格式 1 事务处理标识 2个字节 高字节在前 2 协议标识 2个字节 高字节在前 3 长度 2个字节 高字节在前 4 单元标识 1个字节 0x00-0xff 5 功能码 1个字节 0x03 6 起始寄存器地址 2个字节 高字节在前 7 寄存器个数 2个字节 高字节在前

    2024年01月23日
    浏览(26)
  • Modbus协议在TCP/IP上的运用

    Modbus规约是典型的一问一答的通信规约,支持多种电气接口,可在各种介质上传输,并且消息帧格式简单、紧凑、易懂,方便形成工业控制网络。 通用的Modbus帧由4个部分组成:地址域、功能码、数据和差错校验。整个帧被称为应用数据单元(ADU),功能码和数据组成协议数

    2024年02月11日
    浏览(41)
  • Modbus TCP 协议详解及C语言示例

    Modbus TCP 是一种应用于以太网的通讯协议,基于Modbus RTU协议。Modbus协议是一种应用于串行数据通信的协议,广泛应用于工业控制系统。Modbus TCP 将传统的 Modbus RTU 消息封装在 TCP/IP 报文中,使其能够在现代的以太网环境中进行通信。本文将详细介绍 Modbus TCP 协议的报文格式、各

    2024年02月16日
    浏览(24)
  • python 与PLC 基于 modbus tcp 协议通讯

    Modbus是一种串行通信协议,是工业领域通信协议的业界标准,是工业电子设备之间常用的连接方式。最近在工作中需要上位机python程序和PLC做通讯,就测试了下使用modbus tcp 通讯。         目前实际测试结果是与西门子PLC/信捷PLC都可以正常通讯使用,但是看到网上说可以传输

    2024年02月17日
    浏览(28)
  • 海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互

    使用 Modbus TCP 通讯协议与视觉通讯,当地址为 0000 的保持型寄存器(4x 寄存器)变为 1 时,触发视觉流程执行一次,同时视觉将地址为 0000 的寄存器复位(也即写为 0),视觉流程执行完成后,将结果数据:特征匹配状态、特征匹配点 X、特征匹配点Y、特征角度分别写入到地址为

    2024年02月04日
    浏览(228)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包