Modbus通信协议--RTU
一、RTU介绍
MODBUS协议支持多种功能码,不同的功能码对应不同的操作:
| 0x01 | 读线圈状态 |
| 0x02 | 读离散输入状态 |
| 0x03 | 读保持寄存器 |
| 0x04 | 读输入寄存器 |
| 0x05 | 写单个线圈 |
| 0x06 | 写单个保持寄存器 |
| 0x0F | 写多个线圈 |
| 0x10 | 写多个保持寄存器 |
二、实验
1.0x03功能码读单个保持寄存器

1.1 请求帧格式
| 从站地址 | 功能码 | 起始地址(高位) | 起始地址(低位) | 数量(高位) | 数量(低位) | 校验码(低位) | 校验码(高位) |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x03 | 0x00 | 0x45 | 0x00 | 0x01 | XX | XX |
-
0x01:从地址(Slave Address)。这个值表示这是发送给地址为1的从设备。
-
0x03:功能码(Function Code)。这个值表示这是一个读取保持寄存器(Read Holding Registers)的请求。
-
0x00 0x45:起始地址(Starting Address)。这两个字节一起表示从哪个寄存器地址开始读取。0x0045等于十进制的69。
-
0x00 0x01:寄存器数量(Quantity of Registers)。这两个字节一起表示读取的寄存器数量。0x0001等于十进制的1。
-
XX XX:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。
总结:这个Modbus数据帧请求读取从地址为1的设备从地址69开始的1个保持寄存器。
同理这个Modbus数据帧请求读取从地址为1的设备从地址66开始的1个保持寄存器。
1.2 应答帧格式
| 从站地址 | 功能码 | 字节计数 | 字节一(高位) | 字节一(低位) | 校验码(低位) | 校验码(高位) |
|---|---|---|---|---|---|---|
| 0x01 | 0x03 | 0x02 | 0x00 | 0x00 | YY | YY |
-
0x01:从地址(Slave Address)。这个值表示这是从地址为1的设备发出的响应。
-
0x03:功能码(Function Code)。这个值表示这是一个读取保持寄存器(Read Holding Registers)的响应。
-
0x02:字节数(Byte Count)。这个值表示响应的数据部分包含2个字节。
-
0x00 0x00:数据(Data)。这两个字节表示从指定的寄存器读取到的值。在这个例子中,读取到的值是0x0000,即十进制的0。
-
YY YY:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。
总结:这个数据帧表示从地址为1的设备,从地址69开始响应的数据部分包含2个字节(0x02)。 且从这个指定的寄存器读取到的值是0x0000。
同理从地址69开始响应的数据部分包含2个字节(0x02)。 且从这个指定的寄存器读取到的值是0x0001。
2.0x06功能码写入单个保持寄存器

2.1 请求帧格式
| 从站地址 | 功能码 | 寄存器高 | 寄存器低 | 写入值高 | 写入值低 | 校验码(低位) | 校验码(高位) |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x06 | 0x00 | 0x45 | 0x33 | 0x01 | XX | XX |
-
0x01:从地址(Slave Address)。表示这是发送给地址为1的从设备。
-
0x06:功能码(Function Code)。表示这是一个写单个寄存器的请求。
-
0x00 0x45:寄存器地址(Register Address)。这两个字节表示要写入的寄存器地址。0x0045等于十进制的69。
-
0x33 0x01:寄存器值(Register Value)。这两个字节表示要写入寄存器的值。0x3301可以表示为十进制的13057。
-
XX XX:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。
在写入之后,可以用0x03功能码读取0x45地址的数据查看是否写入成功,可以从图中验证看到,0x3301成功写入0x45地址。
2.2 应答帧格式
原报文返回。
3.0x10功能码写入多个保持寄存器

3.1 请求帧格式
| 从站地址 | 功能码 | 起始地址(高位) | 起始地址(低位) | 数量(高位) | 数量(低位) | 字节数 | 写入数值 | 校验码(低位) | 校验码(高位) |
|---|---|---|---|---|---|---|---|---|---|
| 0x01 | 0x10 | 0x00 | 0x45 | 0x00 | 0x02 | 0x04 | 0x138A 0x1388 | XX | XX |
-
0x01:从地址(Slave Address)。表示这是发送给地址为1的从设备。
-
0x10:功能码(Function Code)。表示这是一个写多个寄存器的请求。
-
0x00 0x45:起始地址(Starting Address)。这两个字节表示要写入的第一个寄存器地址。0x0045等于十进制的69。
-
0x00 0x02:寄存器数量(Quantity of Registers)。这两个字节表示要写入的寄存器数量。0x0002等于十进制的2。
-
0x04:字节计数(Byte Count)。这个值表示接下来要写入的数据字节数。在这个例子中两个寄存器就是是4个字节。
-
0x138A 0x1388:寄存器值(Register Values)。表示要写入寄存器的数据。由于有两个寄存器,每个寄存器占两个字节,所以这里总共4个字节:
- 0x138A
- 0x1388
-
XX XX:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。
在写入之后,可以用0x03功能码读取0x45地址的数据查看是否写入成功,可以从图中验证看到,0x138A,0x1388成功写入从0x45开始往后的两个寄存器地址。
3.2 应答帧格式
| 从站地址 | 功能码 | 起始地址(高位) | 起始地址(低位) | 数量(高位) | 数量(低位) | 校验码(低位) | 校验码(高位) |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x10 | 0x00 | 0x45 | 0x00 | 0x02 | YY | YY |
-
0x01:从地址(Slave Address)。表示这是从地址为1的从设备发出的响应。
-
0x10:功能码(Function Code)。表示这是一个写多个寄存器的响应。
-
0x00 0x45:起始地址(Starting Address)。这两个字节表示写入操作开始的寄存器地址。0x0045等于十进制的69。
-
0x00 0x02:寄存器数量(Quantity of Registers)。这两个字节表示写入的寄存器数量。0x0002等于十进制的2。
-
YY YY:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。
4.0x17功能码写入多个保持寄存器并读

4.1 请求帧格式
- 0x01:从地址(Slave Address)。表示这是发送给地址为1的从设备。
- 0x17:功能码(Function Code)。表示这是一个读取/写入多个寄存器的请求。
- 0x00 0x45:读取起始地址(Read Starting Address)。这两个字节表示要读取的寄存器地址。0x0045等于十进制的69。
- 0x00 0x02:读取寄存器数量(Quantity of Registers to Read)。这两个字节表示要读取的寄存器数量。0x0002等于十进制的2。
- 0x00 0x45:写入起始地址(Write Starting Address)。这两个字节表示要写入的寄存器地址。0x0045等于十进制的69。
- 0x00 0x02:写入寄存器数量(Quantity of Registers to Write)。这两个字节表示要写入的寄存器数量。0x0002等于十进制的2。
- 0x04:写入字节计数(Write Byte Count)。表示接下来要写入的数据字节数。在这个例子中是4个字节。
- 0x11 0x22:第一个寄存器的值。表示要写入的值是0x1122。
- 0x13 0x88:第二个寄存器的值。表示要写入的值是0x1388。
- 0xA6 0x1C:CRC校验码(CRC Checksum)。用于错误检测。
4.2 应答帧格式
- 0x01:从地址(Slave Address)。表示这是从地址为1的从设备发出的响应。
- 0x17:功能码(Function Code)。表示这是一个读/写多个寄存器的响应。
- 0x04:字节计数(Byte Count)。表示接下来的数据字节数。在这个例子中是4个字节。
- 0x11 0x22:读取的第一个寄存器的值。表示从请求中读取的值是0x1122。
- 0x13 0x88:读取的第二个寄存器的值。表示从请求中读取的值是0x1388。
- 0x51 0x47:CRC校验码(CRC Checksum)。用于错误检测。
4.3 写入数据问题总结

从图中可见,我在0x46地址写入0x1313之后,在应答帧中读取显示0x1310,并没有写入成功,这是因为有的寄存器地址存放的数值是动态变化的,写入之后,它又被动态变化的数值给覆盖
相关文章:
Modbus通信协议--RTU
一、RTU介绍 MODBUS协议支持多种功能码,不同的功能码对应不同的操作: 0x01读线圈状态0x02读离散输入状态0x03读保持寄存器0x04读输入寄存器0x05写单个线圈0x06写单个保持寄存器0x0F写多个线圈0x10写多个保持寄存器 二、实验 1.0x03功能码读单个保持寄…...
我是大学生,应该选系统运维方向,还是web开发方向?
选择系统运维方向还是Web开发方向取决于你的兴趣、职业目标和个人技能。以下是对这两个方向的详细对比和建议,帮助你做出更明智的选择 双方比较 🤦♀️系统运维方向 优点: 稳定性:系统运维工作通常比较稳定,许多…...
Qt窗口与对话框
目录 Qt窗口 1.菜单栏 2.工具栏 3.状态栏 4.滑动窗口 QT对话框 1.基础对话框QDiaog 创建新的ui文件 模态对话框与非模态对话框 2.消息对话框 QMessageBox 3.QColorDialog 4.QFileDialog文件对话框 5.QFontDialog 6.QInputDialog Qt窗口 前言:之前以上…...
【笔记】Windows 中 一键部署本地私人专属知识库:MaxKB + Docker + MaxKB docker + Ollama
Docker的部署: Docker下载直接进入链接: https://www.docker.com/ Docker使用需要启动Docker,启动Docker以后,会在桌面右下角看到Docker的一个图标: 只有启动了Docker以后,Docker的各种命令才可以使用。 好像还需要…...
【Vue】scoped解决样式冲突
默认情况下写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 全局样式: 默认组件中的样式会作用到全局,任何一个组件中都会受到此样式的影响 局部样式: 可以给组件加上scoped 属性,可以让样式只作用于当前组件 一、代码示例 BaseOne…...
word模板内容替换
1.pom引入依赖: <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version> </dependency> <dependency><groupId>com.deepoove</groupId><a…...
docker安装和使用
1. docker-ce Docker Community Edition (CE): 功能: 这是 Docker 的主要组件,用于创建、管理和运行容器。它包括 Docker 守护进程 (dockerd),该守护进程负责处理容器的生命周期,包括创建、启动、停止和删除容器。用途: 允许用户在其系统上…...
【AIGC X UML 落地】通过多智能体实现自然语言绘制UML图
前天写了篇博文讲到用PlantUML来绘制C类图和流程图。后台有读者留言,问这步能否自动化生成,不想学习 PlantUML 语法。 我想了下,发现这事可行,确实可以做到通过自然语言的描述就能实现 UML图的绘制,昨天晚上加了个班到…...
C++访问越界
常见场景 访问数组元素越界vector容器访问等 vector<int>;vec<2>;字符串访问越界string str;str[2];array数组访问越界字符串处理,没有添加’\0’字符,导致访问字符串的时候越界了;使用类型强转,让一个大…...
MATLAB format
在MATLAB中,format 是一个函数,用于控制命令窗口中数值的显示格式。这个函数可以设置数值的精度、显示的位数等。以下是一些常用的 format 命令: format long:以默认的长格式显示数值,通常显示15位有效数字。format s…...
Face Forgery Detection by 3D Decomposition
文章目录 Face Forgery Detection by 3D Decomposition研究背景研究目标创新点方法提出问题研究过程技术贡献实验结果未来工作Face Forgery Detection by 3D Decomposition 会议:CVPR2021 作者: 研究背景 面部伪造引发关注传统面部伪造检测主要关注原始RGB图像研究目标 将…...
socket网络编程——多进程、多线程处理并发
如下图所示, 当一个客户端与服务器建立连接以后,服务器端 accept()返回,进而准备循环接收客户端发过来的数据。 如果客户端暂时没发数据,服务端会在 recv()阻塞。此时,其他客户端向服务器发起连接后,由于服务器阻塞了,无法执行 accept()接受连接,也就是其他客户端发送…...
C++---模板进阶(非类型模板参数,模板的特化,模板分离编译)
我们都学习和使用过模板,而这篇文章我们来将一些更深入的知识。在此之前,我们在使用C编程时可以看到模板是随处可见的,它能支持泛型编程。模板包括函数模板和类模板,我们有的人可能会说是模板函数和模板类,但严格讲这样…...
锂电池寿命预测 | Matlab基于SSA-SVR麻雀优化支持向量回归的锂离子电池剩余寿命预测
目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【锂电池剩余寿命RUL预测案例】 锂电池寿命预测 | Matlab基于SSA-SVR麻雀优化支持向量回归的锂离子电池剩余寿命预测(完整源码和数据) 1、提取NASA数据集的电池容量,以历史容量作…...
整理好了!2024年最常见 20 道 Kafka面试题(十)
上一篇地址:整理好了!2024年最常见 20 道 Kafka面试题(九)-CSDN博客 十九、Kafka的消费者如何实现幂等性? 在Kafka中,幂等性指的是消费者处理消息时,即使多次接收到同一条消息,也能…...
Paper Survey——3DGS-SLAM
之前博客对多个3DGS SLAM的工作进行了复现及代码解读 学习笔记之——3DGS-SLAM系列代码解读_gs slam-CSDN博客文章浏览阅读1.9k次,点赞15次,收藏45次。最近对一系列基于3D Gaussian Splatting(3DGS)SLAM的工作的源码进行了测试与…...
搜索与图论:深度优先搜索
搜索与图论:深度优先搜索 题目描述参考代码 题目描述 参考代码 #include <iostream>using namespace std;const int N 10;int n; int path[N]; bool st[N];void dfs(int u) {// u n 搜索到最后一层if (u n){for (int i 0; i < n; i) printf("%d …...
AMD显卡和英伟达显卡哪个好?
显卡是计算机中负责处理图形和视频输出的硬件设备,主要分为两种类型:AMD的A卡和NVIDIA的N卡。那么AMD显卡和英伟达显卡哪个好?怎么选? 答:不能一概而论地说哪个好,因为它们各有优势,选择应基于…...
5.31.8 学习深度特征以实现判别定位
1. 介绍 尽管没有对物体的位置提供监督,但卷积神经网络 (CNN) 各层的卷积单元实际上可以充当物体检测器。尽管卷积层具有这种出色的物体定位能力,但当使用全连接层进行分类时,这种能力就会丧失。最近,一些流行的全卷积神经网络,如 Network in Network (NIN) [13] 和 Goog…...
uniapp小程序多线程 Worker 实战【2024】
需求 最近遇到个小程序异步解码的需求,采用了WebAssembly,涉及大量的计算。由于小程序的双线程模型只有一个线程处理数据,因此智能寻求其它的解决方案。查看小程序的文档,发现小程序还提供一个异步线程的Worker方案,可…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
