Modbus-RTU 数据帧格式 、报文解析

文章目录

    • 报文模型
    • 功能代码
    • 读线圈 (0x01 0x02)
    • 读寄存器 (0x03 0x04)
    • 写单个线圈 (0x05)
    • 写单个寄存器 (0x06 0x41)
    • 写多个线圈(0x0F)
    • 写多个寄存器(0x10 0x43)
    • 错误代码

Modbus协议,首先从字面理解它包括 ModBus两部分,首先它是一种bus,即总线协议,和 I2C、 SPI类似,总线就意味着有主机,有从机,这些设备在同一条总线上。

Modbus支持单主机,多个从机,最多支持247个从机设备。关于Mod,因为这种协议最早被用在PLC控制器中,准确的说是Modicon公司的PLC控制器,这也是Mod-Bus名称的由来。

后来Modicon被施耐德(Schneider)收购,Modbus协议广泛应用在工业控制器、HMI和传感器上,逐渐被其他厂商接受,成为一种主流的通讯协议,用于和外围设备进行通讯。

报文模型

一个报文就是一帧数据:一串完整的指令数据。
Modbus采用 "Big Endian"编码方式,先发送高位字节,然后是低位字节。

设备地址 功能代码 数据 校验
1* 8bit 1* 8bit N * 8bit 2 * 8bit

功能代码

功能码 功能码名称 可操作元件类型 注释
0x01 读线圈 Y、X、M、SM、S、T、C 读一个或多个位
0x02 读离散量输入 X 读一个或多个位
0x03 读寄存器 D、SD、Z、T、C 读一个或多个字
0x05 写单个线圈 Y、M、SM、S、T、C 写一个位
0x06、0x41 写一个寄存器 D、SD、Z、T、C 写一个字
0x0F 写多个线圈 Y、M、SM、S、T、C 写多个位
0x10、0x43 写多个寄存器 D、SD、Z、T、C 写多个字

读线圈 (0x01 0x02)

  1. 请求帧
设备地址 功能码(01H) 起始地址 读取个数 校验码
H L H L
  1. 响应帧
    如果读取的地址不是8的倍数,剩下的位由0填充(由高位开始填充)。
设备地址 功能码(01H) 读取的个数n (字节数) 读取的数据No.1 ...... 读取的数据No.n 校验码
3. 举例
请求 响应
字段名 16进制 字段名 16进制
功能码 01 功能码01
起始地址 Hi 00 字节计数03
起始地址 Lo 13 输出状态27~20CD
输出数量 Hi 00 输出状态35~286B
输出数量 Lo 13 输出状态38~3605

输出27~20的状态表示为十六进制字节值CD,或二进制1100 1101.输出27是这个字节的MSB(最高有效位),输出20是LSB(最低有效位)

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
1 1 0 0 1 1 0 1
27 26 25 24 23 22 21 20

在最后的数据字节中,将输出38~36的状态表示为十六进制字节值05,或二进制 0000 0101。用零填充5个剩余高位。

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
0 0 0 0 0 1 0 1
38 37 36

读寄存器 (0x03 0x04)

  1. 请求帧
设备地址 功能码(03H) 起始地址 读取个数 (N) 校验码
H L H L
  1. 响应帧
设备地址 功能码(03H) 读取的个数2*N 读取的数据No.1 ...... 读取的数据No.n 校验码
H L H L
3. 举例 请求读取寄存器108~110的示例。
请求 响应
字段名 16进制 字段名 16进制
功能码 03 功能码03
起始地址 Hi 00 字节计数06
起始地址 Lo 6B 寄存器值 Hi(108)02
寄存器数量 Hi 00 寄存器值 Lo(108)2B
寄存器数量 Lo 03 寄存器数量 Hi (109) 00
寄存器值 Lo(109)00
寄存器值 Hi(110)00
寄存器值 Lo(110)64

结果为:

寄存器内容值 (十六进制)内容值 (十进制)
寄存器 10802 2B555
寄存器 10900 000
寄存器 11000 64100

写单个线圈 (0x05)

  1. 请求帧
设备地址 功能码(05H) 起始地址 写入的值 校验码
H L H L

注:写入的元件的值为0xFF00(ON,1)或者(0x0000)(OFF,0)。

  1. 响应帧
    响应帧是请求帧的重复。
设备地址 功能码(05H) 起始地址 写入的值 校验码
H L H L
3. 举例
请求 响应
字段名 16进制 字段名 16进制
功能码 05 功能码05
起始地址 Hi 00 起始地址 Hi00
起始地址 Lo AC 起始地址 LoAC
输出值 Hi FF 输出值 HiFF
输出值 Lo 00 输出值 Lo00

写单个寄存器 (0x06 0x41)

  1. 请求帧
设备地址 功能码(06H) 起始地址 写入的值 校验码
H L H L
  1. 响应帧
    响应帧是请求帧的重复。
设备地址 功能码(06H) 起始地址 写入的值 校验码
H L H L
3. 举例 将一个十六进制 00 03写入寄存器2的示例
请求 响应
字段名 16进制 字段名 16进制
功能码 06 功能码06
起始地址 Hi 00 起始地址 Hi00
起始地址 Lo 02 起始地址 Lo02
寄存器值 Hi 00 输出值 Hi00
寄存器值 Lo 03 输出值 Lo03

写多个线圈(0x0F)

  1. 请求帧
设备地址 功能码(0FH) 起始地址 元件个数 字节数 (N) 写入的值No.1 ...... 写入的值No.N 校验码
H L H L
N = 元件个数/8,如果余数不等于0,那么N=N+1。
  1. 响应帧
设备地址 功能码(0FH) 起始地址 元件个数 校验码
H L H L
3. 举例

从线圈20开始写10个线圈的示例。请求的数据内容为2个字节:十六进制CD 01(二进制 1100 1101 0000 0001)。二进制安如下对应于输出。

位:1100110100000001
输出:2726252423222120------------2928
请求 响应
字段名 16进制 字段名 16进制
功能码 0F 功能码0F
起始地址 Hi 00 起始地址 Hi00
起始地址 Lo 13 起始地址 Lo13
输出数量 Hi 00 输出数量 Hi00
输出数量 Lo 0A 输出数量 Lo0A
字节计数 02
输出值 Hi CD
输出值 Lo 01

写多个寄存器(0x10 0x43)

  1. 请求帧
设备地址 功能码(10H) 起始地址 元件个数 (N) 字节数 (2*N) 写入的值No.1 ...... 写入的值No.N 校验码
H L H L H L H L
  1. 响应帧
设备地址 功能码(10H) 起始地址 元件个数 校验码
H L H L
3. 举例

将十六进制00 0A和01 02写入以第2个寄存器开始的两个寄存器的示例。

请求 响应
字段名 16进制 字段名 16进制
功能码 10 功能码10
起始地址 Hi 00 起始地址 Hi00
起始地址 Lo 01 起始地址 Lo01
寄存器数量 Hi 00 寄存器数量 Hi00
寄存器数量 Lo 02 寄存器数量 Lo02
字节计数 04
寄存器值 Hi 00
寄存器值 Lo 0A
寄存器值 Hi 01
寄存器值 Lo 02

错误代码

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP和UDP C#代码实战

网络传输的七层结构: 其中TCP和UDP协议在传输层。 TCP/IP协议 TCP/IP中包含了四层架构中的多个协议,取其中两个进行了命名: TCP TCP的特点 粘包问题处理 TCP一次性接收过多数据必然出现粘包,即不同时发送的数据黏连在一…

vue2项目从0搭建(一):项目搭建

前言: vue2项目可谓十分常见,国内大部分的前端码农应该都是用vue2技术在开发,虽然vue3和react等技术也有很多,但是占据绝大多数的中高级搬砖码农应该干的都是vue2技术的项目,就算现在很多人转战vue3技术了,但是维护原有vue2的项目应该也是很多的。 我本来是不打算写vue2的技术…

Java17新增特性

前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java16新增特…

Clickhouse学习笔记(14)—— Clickhouse监控

ClickHouse 运行时会将一些个自身的运行状态记录到众多系统表中,如下所示: 为了直观方便地监控ck的运行情况,使用Prometheus Grafana 的组合来进行监控 Prometheus 负责收集各类系统的运行指标;Grafana 负责可视化 Prometheus&a…

实体门店创新神器曝光,拓世法宝AI智能直播一体机助力商家快速惊艳逆袭

在这个飞速变革的时代,传统实体门店面临着多重挑战。为了迎接市场的巨大变化,许多实体门店迫切寻求创新的方法来吸引顾客的眼球。数字化手段和新技术的引入成为实体门店应对市场需求的重要选择之一,是应对激烈竞争和不断变化的消费者行为的有…

WGCLOUD的特点整理

做运维工作很多年了,项目中用过不少的运维软件工具,今天整理下WGCLOUD的特点(优点) 首先WGCLOUD是完全免费的 部署使用:部署简单方便,上手容易,几乎没有学习成本,对新手友好 文档…

thinkphp 自定义错误页面

在访问无效的UI 这个效果不好&#xff0c;要改成自定义的 <?php namespace app\controller;class ErrorController {public function __call($method,$args){return error request!;} }之后就是提示

hive更改表结构的时候报错

现象 FAILED: ParseException line 1:48 cannot recognize input near ADD COLUMN compete_company_id in alter table statement 23/11/14 17:59:27 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 1:48 cannot recognize input near ADD COLUMN compe…

upload-labs关卡8(基于黑名单的点绕过)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第八关通关思路1、看源代码2、点绕过3、验证文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测试&am…

计算机毕业设计选题推荐-记录生活微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

跨国企业如何选择安全靠谱的跨国传输文件软件?

随着全球化的不断发展&#xff0c;跨国企业之间的合作变得越来越频繁。而在这种合作中&#xff0c;如何安全、可靠地将文件传输给合作伙伴或客户&#xff0c;成为了跨国企业必须面对的问题。 然而&#xff0c;跨国文件传输并不是一件容易的事情&#xff0c;由于网络物理条件的…

什么是代理模式,用 Python 如何实现 Proxy(代理 或 Surrogate)对象结构型模式?

什么是代理模式&#xff1f; 代理&#xff08;Proxy&#xff09;是一种结构型设计模式&#xff0c;其目的是通过引入一个代理对象来控制对另一个对象的访问。代理对象充当目标对象的接口&#xff0c;这样客户端就可以通过代理对象间接地访问目标对象&#xff0c;从而在访问过程…

【Python图像超分】Real-ESRGAN图像超分模型(超分辨率重建)详细安装和使用教程

1 前言 图像超分是一种图像处理技术&#xff0c;旨在提高图像的分辨率&#xff0c;使其具有更高的清晰度和细节。这一技术通常用于图像重建、图像恢复、图像增强等领域&#xff0c;可以帮助我们更好地理解和利用图像信息。图像超分技术可以通过多种方法实现&#xff0c;包括插值…

CSS 文字溢出省略号显示

1. 单行文本溢出显示省略号 需要满足三个条件&#xff0c;添加对应的代码&#xff1a; &#xff08;1&#xff09;先强制一行内显示文本&#xff1b; &#xff08;2&#xff09;超出的部分隐藏&#xff1b; &#xff08;3&#xff09;文字用省略号来替代省略的部分&#xf…

IDEA 使用Reset Current Branch to Here 进行git 版本控制,图文操作

文章目录 一、总结区别&#xff08;只针对本地仓库操作&#xff09;Soft详细解释文件版本冲突处理 Mixed详细解释Hard详细解释Keep详细解释文件版本冲突处理 二、其他Revert commit 参考文档 一、总结区别&#xff08;只针对本地仓库操作&#xff09; Soft详细解释 Soft操作只…

docker命令大全

1、查看Docker 容器占用的空间 docker ps -s2、查看所有容器 docker ps -a3、启动、关闭、重启一个已存在的容器 docker start <容器ID> docker stop <容器ID> docker restart <容器ID> 4、进入容器&#xff0c;退出终端的时候不会关闭container的ma…

龙讯旷腾PWmat:新的催化反应机理——瞬态相变,对多相电催化剂的设计和多相电催化机理的研究具有重要意义

研究背景 众所周知&#xff0c;材料的性质&#xff0c;包括催化活性都是相敏感的。而材料的相与外界条件有关&#xff0c;电催化反应过程中的外部条件与反应前后的外部条件不同&#xff0c;这自然导致了一个问题&#xff1a;在反应过程中电催化剂的相是否可以与反应前后的相不…

C 语言数组

C 语言数组 在本教程中&#xff0c;您将学习如何使用数组。您将借助示例学习如何声明&#xff0c;初始化和访问数组的元素。 数组是可以存储多个值的变量。例如&#xff0c;如果要存储100个整数&#xff0c;则可以为其创建一个数组。 示例 cint data[100];如何声明数组&…

线程池的使用

线程池的作用 降低线程创建和销毁的开销&#xff1a;线程的创建和销毁是比较昂贵的操作。通过使用线程池&#xff0c;可以避免频繁地创建和销毁线程&#xff0c;而是复用线程池中已经存在的线程&#xff0c;从而降低了开销。 控制并发度&#xff1a;通过控制线程池中线程的数量…

MySQL(14):视图

数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c;程序员通常不应该修改&#xff0c;只…