当前位置: 首页 > ds >正文

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.xdnf.cn/news/9240.html

相关文章:

  • 【大模型面试每日一题】Day 29:简单介绍一下混合精度训练的技术要点及潜在风险
  • Kubernetes Service 类型与实例详解
  • Mybatis中的两个动态SQL标签
  • (先发再改)测试流程标准文档
  • 【面试题】如何测试即时通信功能:A给B发送一条了信息:hello
  • ‌加密 vs 电子签名:公钥私钥的奇妙冒险
  • 大数据学习(121)-sql重点问题
  • IP2366调试问题总结
  • 第12次07 :邮箱的验证
  • 57、【OS】【Nuttx】编码规范解读(五)
  • ET CircularBuffer 类
  • Cadence学习笔记之---PCB过孔替换、封装更新,DRC检查和状态查看
  • 动态贴纸的实时渲染原理:美颜SDK中的特效引擎开发实录
  • 化工厂电动机保护升级记:当Profinet遇上DeviceNet
  • 【数字图像处理】_笔记
  • Webpack 5 模块联邦(Module Federation)详解与实战
  • 多头注意力 vs 单头注意力:计算量与参数量区别
  • MySQL日志文件有哪些?
  • 一、docker安装以及配置加速
  • [免费]SpringBoot+Vue在线教育(在线学习)系统(高级版)【论文+源码+SQL脚本】
  • Python打卡训练营Day37
  • 《仿盒马》app开发技术分享-- 新增地址(端云一体)
  • AI算力网络光模块市场发展分析
  • 第二章 1.1 数据采集安全风险概述
  • 程序编码规范,软件设计规范
  • 【产品经理】产品经理知识体系
  • Mysql性能优化方案
  • 洛谷题目:P2785 物理1(phsic1)- 磁通量 题解 (本题较难)
  • Arduino+LCD1602,并口版 LCD1602和IIC版LCD1602
  • w~自动驾驶~合集2~激光毫米波雷达