STM32:Modbus通信协议核心解析:关键通信技术

知识点1【 Modbus通信】

1、Modbus的概述

Modbus是OSI模型第七层的应用层报文传输协议

协议:说明有组包和解包的过程

2、通信机制

Modelbus是一个请求/应答协议

通信机制:主机轮询,从机应答的机制。每个从设备有唯一的地址主设备通过地址指定通信对象

轮询:在通信或控制系统中,由主设备主动发送,周期性地向从设备发起请求并获取数据的机制。

特点

(1)系统中只有一个主机:主机通信

(2)系统中的从机不可以主动向主机发送数据

(3)系统上电后,所有的主从设备都应该处于监听总线的状态,也就是接收状态

(4)如果要发起一次通信,必须从主机的主动发起

通信流程

(1)主机首先切换成发送模式,发送数据包

(2)马上转成接收模式

3、Modbus报文格式

缩略语

报文介绍(重点

地址域:从设备的ID号 1Byte

功能码:执行的具体操作 1Byte

数据域:发送或者接收的有效数据 252Byte

差错校验:判断数据传输是否正确 2Byte

异常响应

这段话,中我们可以看到异常响应,那什么是异常响应,如何区分异常响应和正确响应呢?

异常响应概述

服务器(从设备)客户端(主设备) 返回的错误通知,用于指示请求无法撑场处理

异常响应的辨别

功能码为原功能码 + 0x80(即最高位置1),范围为128-255(十进制)

通信的架构图

(1)正确的响应

(2)错误的相应

知识点2【功能码】

功能码分为三类

1、公共功能码

2、用户定义功能码:

3、保留功能吗:

其中最常用的也就是公共功能码

常用功能码介绍

1、0x01:可读可写 按照bit操作

  • 请求格式

    从站地址 | 0x01 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC

  • 响应格式

    从站地址 | 0x01 | 数据字节数 | 线圈状态(按位打包) | CRC

  • 示例

    读取地址0x0000开始的5个线圈状态,返回值为0x15(二进制00010101,表示线圈0-4的状态为ON、OFF、ON、OFF、ON)。

2、0x02:只读 按照bit操作

  • 请求格式

    从站地址 | 0x02 | 起始地址高位 | 起始地址低位 | 输入数量高位 | 输入数量低位 | CRC

  • 响应格式

    从站地址 | 0x02 | 数据字节数 | 离散输入状态(按位打包) | CRC

  • 示例

    读取地址0x0002开始的3个离散输入,返回0x05(二进制00000101,表示输入2-4的状态为ON、OFF、ON)。

3、0x03:读保持寄存器,按照寄存器读取

  • 请求格式

    从站地址 | 0x03 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC

  • 响应格式

    从站地址 | 0x03 | 数据字节数 | 寄存器值(每寄存器2字节) | CRC

  • 示例

    读取地址0x000A开始的2个保持寄存器,返回值为0x00FF0x1234

4、0x06: 按照寄存器操作

  • 请求格式

    从站地址 | 0x06 | 寄存器地址高位 | 寄存器地址低位 | 写入值高位 | 写入值低位 | CRC

  • 响应格式

    从站地址 | 0x06 | 寄存器地址高位 | 寄存器地址低位 | 写入值高位 | 写入值低位 | CRC(与请求相同,表示操作成功)

  • 示例

    向地址0x0001写入值0xABCD,请求与响应报文一致。

5、0x16:写入多个寄存器

  • 请求格式

    从站地址 | 0x10 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | 字节数 | 寄存器值列表(每值2字节) | CRC

  • 响应格式

    从站地址 | 0x10 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC

  • 示例

    向地址0x0000写入两个寄存器值0x12340x5678,请求中包含字节数0x04和值列表。

注意

请求和响应部分 手册中的图如下,我这里来说一下分析时候的注意事项

无论是请求还是响应都是 PDU部分,即 功能码和数据 部分

并且Modbus是大端存储,我们存数据的时候先存入 高地址

知识点3【Modbus在数据链路层的实现】

1、请求方式

(1)单播模式

(2)广播模式

2、地址的规则

寻址地址共256个

主节点没有地址,每个子节点必须有一个地址

3、传输过程中的注意事项

(1)间隔时间

由于没有起始位和停止位,Modbus使用的是以3.5个字符作为 两个报文 之间的最短间隔时间。

(2)相邻字符最大间隔

同一帧数据中相邻字符间隔时间大于1.5个字符

上面的时间单位都是字符,哪一个字符是多久呢?请看下面介绍

(3)RTU模式每个字节(11位)格式

奇偶校验位 是可以没有的,收发端保持一致即可

是不是很熟悉,和串口一摸一样。

因为Modbus是应用层协议,而串口 是物理层和数据链路层 的标准,因此到达数据链路层,他们的格式都是一样的。

串口是一个广义概念,泛指异步串行通信接口。并不只局限于USART。RS485,RS232也都是串口。

因此这里的一个字符时间就是:

字符时间

以波特率9600为例

总结

  • 帧间空闲时间(Inter-Frame Delay)必须 ≥ 3.5个字符时间,以区分连续的数据帧。
  • 帧内字符间隔(Inter-Character Timeout)必须 ≤ 1.5个字符时间,否则视为帧结束。

4、RS485和Modbus 的关系

通信:硬件层,软件层组成

硬件层:

RS485——解决的是数据的传输问题,也就是如何将一个“0“或”1”传输到另外一端。

软件层:

Modbus——在硬件的基础上,解决数据传输的含义,传的数据代表什么。

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

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

相关文章

LeetCode 3362.零数组变换 III:贪心+优先队列+差分数组——清晰题解

【LetMeFly】3362.零数组变换 III:贪心优先队列差分数组——清晰题解 力扣题目链接:https://leetcode.cn/problems/zero-array-transformation-iii/ 给你一个长度为 n 的整数数组 nums 和一个二维数组 queries ,其中 queries[i] [li, ri] …

ORM++ 封装实战指南:安全高效的 C++ MySQL 数据库操作

ORM 封装实战指南:安全高效的 C MySQL 数据库操作 一、环境准备 1.1 依赖安装 # Ubuntu/Debian sudo apt-get install libmysqlclient-dev # CentOS sudo yum install mysql-devel# 编译时链接库 (-I 指定头文件路径 -L 指定库路径) g main.cpp -stdc17 -I/usr/i…

JESD204B 协议介绍

一、协议概述 JESD204B是由JEDEC(固态技术协会)制定的高速串行接口标准,专为模数转换器(ADC)、数模转换器(DAC)与逻辑器件(如FPGA、ASIC)之间的数据传输设计。其核心目标…

yolov8,c++案例汇总

文章目录 引言多目标追踪案例人体姿态估计算法手势姿态估计算法目标分割算法 引言 以下案例,基于c,ncnn,yolov8既可以在windows10/11上部署, 也可以在安卓端部署, 也可以在嵌入式端部署, 服务器端可支持部署封装为DLL,支持c/c#/java端调用 多目标追踪案例 基于yolov8, ncnn,…

运动规划实战案例 | 图解基于状态晶格(State Lattice)的路径规划(附ROS C++/Python仿真)

目录 1 控制采样 vs 状态采样2 State Lattice路径规划2.1 算法流程2.2 Lattice运动基元生成2.3 几何代价函数2.4 运动学约束启发式 3 算法仿真3.1 ROS C仿真3.2 Python仿真 1 控制采样 vs 状态采样 控制采样的技术路线源自经典的运动学建模思想。这种方法将机器人的控制指令空…

BERT框架:自然语言处理的革命性突破

引言 在自然语言处理(NLP)领域,2018年Google推出的BERT(Bidirectional Encoder Representations from Transformers)框架无疑是一场革命。作为基于Transformer架构的双向编码器表示模型,BERT通过预训练学习…

【Fifty Project - D31】

结束了一个超级消耗周末,满安排之健身梅溪湖游泳做饭喝酒羽毛球赛 完全力竭了,久久不能恢复过来,暂停健身安排了 端午后再继续 今日完成记录 TimePlan完成情况7:30 - 8:10有氧爬坡√9:00 - 11:…

信息学奥赛一本通 1547:【 例 1】区间和

【题目链接】 ybt 1547:【 例 1】区间和 【题目考点】 1. 线段树 2. 树状数组 【解题思路】 本题要求维护区间和,实现单点修改、区间查询。 解法1:线段树 线段树原理,及实现方法见:洛谷 P3374 【模板】树状数组…

力扣面试150题--求根节点到叶节点数字之和

Day 48 题目描述 思路 我们利用sum这个全局变量来保存总和值,递归函数sum来计算每个根到叶子节点路径所代表的数,由于我们需要遍历到每条根到叶子节点的路径,所有我采取了前序遍历,如果不是叶子节点,就计算到该节点代…

DJI上云API官方demo学习

1、websocket,所在位置如下图,调用的可以用//websocket搜索 2、用到的http客户端,axios 3、很多和后端交互都是走的http请求

uniapp开发小程序,如何根据权限动态配置按钮或页面内容

前言 写了好几个项目,发现小程序对权限控制非常麻烦,于是有了这个想法,但是网上找了一圈没有一个比较完善的讲解,因为小程序不支持自定义指令,所以不能像后台那样方便,于是就将几个博主的想法结合。 思路就…

LSTM+Transformer混合模型架构文档

LSTMTransformer混合模型架构文档 模型概述 本项目实现了一个LSTMTransformer混合模型,用于超临界机组协调控制系统的数据驱动建模。该模型结合了LSTM的时序建模能力和Transformer的自注意力机制,能够有效捕捉时间序列数据中的长期依赖关系和变量间的复…

测量尺子:多功能测量工具,科技改变生活

测量尺子是一款专业的测距仪测量万能工具箱类型手机APP,旨在为用户提供最贴心的测量助手。它拥有和现实测量仪器一样的测量标准,更简单便捷且精准的测量方式,最新AR科技测量更是大大拓宽了可以被测量的高度和深度。无论是日常使用、学习还是工…

结课作业01. 用户空间 MPU6050 体感鼠标驱动程序

目录 一. qt界面实现 二. 虚拟设备模拟模拟鼠标实现体感鼠标 2.1 函数声明 2.2 虚拟鼠标实现 2.2.1 虚拟鼠标创建函数 2.2.2 鼠标移动函数 2.2.3 鼠标点击函数 2.3 mpu6050相关函数实现 2.3.1 i2c设备初始化 2.3.2 mpu6050寄存器写入 2.3.3 mpu6050寄存器读取 2.3.…

深入浅出 Python Testcontainers:用容器优雅地编写集成测试

在现代软件开发中,自动化测试已成为敏捷开发与持续集成中的关键环节。单元测试可以快速验证函数或类的行为是否符合预期,而集成测试则确保多个模块协同工作时依然正确。问题是:如何让集成测试可靠、可重复且易于维护? 这时&#…

JVM 的垃圾回收器

新生代回收器 通性 会触发StW,暂停所有应用线程复制算法 Serial 单线程回收适合单线程系统 ParNew 多线程回收优先保证响应速度,降低 STW(STW 越大,执行垃圾回收的时间越长,回收的垃圾越多,减少垃圾回…

【笔记】排查并解决Error in LLM call after 3 attempts: (status code: 502)

#工作记录 一、问题描述 在部署运行部署对冲基金分析工具 ai-hedge-fund 时,不断出现以下报错,导致项目运行异常: Error in LLM call after 3 attempts: (status code: 502) Error in LLM call after 3 attempts: [WinError 10054] 远程主…

GO 语言进阶之 Template 模板使用

更多个人笔记见: github个人笔记仓库 gitee 个人笔记仓库 个人学习,学习过程中还会不断补充~ (后续会更新在github上) 文章目录 Template 模板基本示例语法1. 基本输出语法2. 控制结构3. 空白字符控制4. Must函数 Temp…

origin绘图之【如何将多条重叠、高度重叠的点线图、折线图分开】

在日常的数据可视化工作中,Origin 作为一款功能强大的科研绘图软件,广泛应用于实验数据处理、结果展示与论文图表制作等领域。然而,在处理多组数据、特别是绘制多条曲线的折线图或点线图时,常常会遇到这样一个困扰:多条…

Java基础 Day19

一、泛型(JDK5引入) 1、基本概念 在编译阶段约束操作的数据类型,并进行检查 好处:统一数据类型,将运行期的错误提升到了编译期 泛型的默认类型是 Object 2、泛型类 在创建类的时候写上泛型 在创建具体对象的时候…