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

Modbus协议详解3:数据帧格式 - RTU帧 ASCII帧的区别

Modbus既然是一种通信协议,那它就应该有规定的通信格式用于在设备之间的指令接收与识别。

本文就着重讲讲Modbus协议的RTU帧和ASCII帧。

Modbus帧在串行链路上的格式如下:

在上图的格式中:

1地址域:指代的是子节点地址。合法的子节点地址为 0 – 247。 每个子设备被赋予 1 – 247 范围中的地址。主节点通过将子节点的地址放到报文的地址域对子节点寻址。当子节点返回应答时, 它将自己的地

址放到应答报文的地址域以让主节点知道哪个子节点在回答。

2)功能码:指明服务器要执行的动作。

3)数据域:功能码后面有表示含有请求和响应参数的数据。

4错误检验是对报文内容执行 "冗余校验" 的计算结果。根据不同的传输模式 (RTU or ASCII)使用两种不同的计算方法。

上面说明了Modbus的帧格式,是一种规定的数据打包的规约。

Modbus中有两种串行传输模式: RTU 模式 和 ASCII 模式。它定义了报文域的位内容在线路上串行的传送。它确定了信息如何打包为报文和解码。

所有设备必须现 必须实现 RTU 模式ASCII 模式是选项。

1、Modbus RTU帧模式

RTU帧指的是什么呢?简单而言就是报文中的每个字节都是用十六进制表示的。

RTU帧中的每个字节数据的格式定义如下:

每个字节为8bit
报文中每个 8 位字节含有两个 4 位十六进制字符(0–9, A–F)Bits per Byte: 
1 起始位
8 数据位首先发送最低有效位
1 位作为奇偶校验
1 停止位注 : 使用无校验要求 2 个停止位。

字符的传送流是LSB先发送,最后才是MSB,如下:

有奇偶校验的:

无奇偶校验的:

重点来了,RTU的报文帧格式:       

Modbus RTU帧的最大长度为256个字节。

2、Modbus ASCII帧模式

Modbus ASCII帧中规定报文的每个字节数据以两个ASCII字符进行发送。

怎么理解呢?

 例 : 有一个数据字节为 0X5B,它会被编码为两个字符 : 0x35 和 0x42 (ASCII 编码 0x35 ="5", 0x42 ="B" )。

ASCII 模式节每个字节 (10 位 )  为的格式为 : 

报文中每个 ASCII 字符含有 1 个十六进制字符
Bits per Byte: 
1 起始位
7 数据位, 首先发送最低有效位
1 位作为奇偶校验
1 停止位注 : 使用无校验要求 2 个停止位。

字符是如何串行传送的: 

有奇偶校验的:

无奇偶校验的:

Modbus ASCII的报文帧格式:

ASCII报文帧与RTU报文帧有很大的不同,ASCII报文帧中是带有开头和结束标识符的,这对设备接收报文帧很方便。设备可以很方便的知道一个新报文帧的开头,并且知道报文什么时候结束了。

RTU报文帧中并没有这样的标识符,所以在接收报文帧的时候就需要做些处理,方能判断报文是否完成了一帧数据的接收。

ASCII报文帧中用冒号(:)(ASCII的十六进制为0x3A)作为起始,用回车换行(CR LF)(ASCII的十六进制为0x0D 0x0A)作为结束。

由于ASCII模式下每个字符字节需要用两个字符编码,所以为了确保 ASCII 模式 和 RTU 模式在 Modbus 应用级兼容,ASCII数据域最大数据长度为 (2x252) 是 RTU 数据域 (252) 的两倍。因此ModbusASCII 帧的最大尺寸为 513 个字符。

3、RTU帧与ASCII帧的传输区别

前面已经分析了RTU报文帧和ASCII报文帧的区别,RTU报文帧是不带开始和结束标识符的,而ASCII报文帧中带有开始和结束标识符。所以在设备接收RTU帧和ASCII帧的时候处理方式就会有所不同。

(1)RTU帧的报文传输

现在思考一个问题:RTU帧中因为没有开始和结束的标识符,设备要怎么知道已经接收完成了一帧报文了呢?

为了能够确认报文被完整接收,不至于接收到不完整的报文就进行报文解析和处理,所以必须要想办法去确认一帧报文已经完成接收,然后再去处理。

在RTU模式中,为了标识不同的报文帧,在报文帧之间插入一个空闲时间间隔,在两帧报文之间用至少3.5个字符的空闲时间来区分不同的帧,同时标识一帧是否已经完成接收。这个时间也称为t3.5时间间隔。

这样的操作方式看下图进行理解:

如果前面开始了一次报文帧的传输,接收设备从空闲状态中被唤起,就需要多接收进行一个超时计时机制,用以确认报文帧是否已经接收完成。就如上图中的帧1和帧2之间如果间隔的时间等于或者超过了t3.5所设定的空闲等待时间,就可以认为前面的帧1已经接收完成,后面再过来的数据就属于帧2的数据。

在RTU帧中还有一个讲究的地方:因为报文帧本质是用字符流进行发送的,所谓为了区分不同的报文帧就需要用到t3.5的字符间隔。但是报文帧中的每个字符要怎么确认是连续的呢?

所以为了确认字符流的发送连续,就要使用到t1.5字符时间。看下图理解:

从上图中可以清晰看到:如果两个字符之间的空闲间隔大于 1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。小于或者等于1.5个字符的时间则认为正常。

上面说的t1.5和t3.5这两个时间,其实并不是一定应用的。为什么呢?

因为时间项目应用中,很多时候多报文帧的接收都会涉及到中断,特别是在通信速率很高的情况下,会频繁的快速中断,对cpu的负担是很重的,这个时候这t1.5和t3.5的时间就会变得很短暂,并不是很好处理。

所以,t1.5和t3.5这两个时间一般是在通信速率在19200Bps或以下的时候才需要去严格约定。

(2)ASCII帧的报文传输

由于ASCII报文帧与RTU报文帧有着很大的不同,ASCII报文帧是有起始和结束标识符的,而RTU帧没有这样的标识。所以ASCII报文帧的接收就简单方便多了,也不需要什么t3.5的帧间隔时间。

但是呢,为了保证接收的报文帧连续,还是可以约定字符间的传输时间的。一般认为,报文中的字符时间间隔可以达到一秒,如果超过了这个时间间隔,就认为发生了错误,要废弃掉这一帧报文数据,重新开始接收。

4、RTU帧和ASCII帧的传输状态分析

(1)RTU帧的传输状态:

上面状态图可以获取的信息:

1)从 "初始" 态到 “空闲” 态转换需要 t 3.5 定时超时,用以保证帧间延迟。

2)“空闲” 态是没有发送和接收报文要处理的正常状态。

3)在 RTU 模式, 当没有活动的传输的时间间隔达 3.5 个字符长时,通信链路被认为在 “空闲”态。

4)当链路空闲时, 在链路上检测到的任何传输的字符被识别为 帧起始。 链路变为 "活动" 状态。然后, 当链路上没有字符传输的时间间个达到 t3.5 后,被识别为 帧结束。

5)检测到帧结束后,完成 CRC 计算和检验。然后,分析地址域以确定帧是否发往此设备,如果不是,则丢弃此帧。 为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧结束。这样,CRC 计算只需要在帧寻址到该节点 (包括广播帧) 时进行。

(2)ASCII帧的传输状态

上面状态图可以得到的信息:

1)“空闲” 态是没有发送和接收报文要处理的正常状态。

2)每次接收到 ":" 字符表示新的报文的开始。如果在一个报文的接收过程中收到该字符,则当前地报文被认为不完整并被丢弃。而一个新的接收缓冲区被重新分配。

3)检测到帧结束后,完成 LRC 计算和检验。然后,分析地址域以确定帧是否发往此设备,如果不是,则丢弃此帧。 为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧结束。

相关文章:

Modbus协议详解3:数据帧格式 - RTU帧 ASCII帧的区别

Modbus既然是一种通信协议,那它就应该有规定的通信格式用于在设备之间的指令接收与识别。 本文就着重讲讲Modbus协议的RTU帧和ASCII帧。 Modbus帧在串行链路上的格式如下: 在上图的格式中: 1)地址域:指代的是子节点地址…...

认识数据分析

文章目录 1. 认识数据分析1.1 数据自身的三大属性1.2 建数仓 数据分析的工程技术1.3 数据分析解决问题的原理1.4 数据分析的具体流程1.5 数据的中心化和智能化1.6 数据分析的四种类型和六个方向 1. 认识数据分析 1.1 数据自身的三大属性 客观:用数字衡量和表现一件…...

Learn Prompt-ChatGPT 精选案例:写作博客

在 ChatGPT 的帮助下,文本内容的产出,尤其是撰写博客文章的过程得到了进一步的简化。你可以让 ChatGPT 激发你的灵感,也可以让它美化你的文章内容。 这里我们希望能通过prompt写出一篇以“ChatGPT对社会各行各业的影响”为主题的博客。 本页…...

《确保安全:PostgreSQL安全配置与最佳实践》

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: &#x1f4da…...

Unity中Shader抓取屏幕并实现扭曲效果

文章目录 前言一、屏幕抓取,在上一篇文章已经写了二、实现抓取后的屏幕扭曲实现思路:1、屏幕扭曲要借助传入 UV 贴图进行扭曲2、传入贴图后在顶点着色器的输入参数处,传入一个 float2 uv : TEXCOORD,用于之后对扭曲贴图进行采样3、…...

深浅拷贝详解

深浅拷贝 经典真题 深拷贝和浅拷贝的区别?如何实现 深拷贝和浅拷贝概念 首先,我们需要明确深拷贝和浅拷贝的概念。 浅拷贝:只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷…...

@Scheduled 定时任务

Scheduled(cron"30 * * * * ?") 1.cron表达式格式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 2.cron表达式各占位符解释: {秒数}{分钟} > 允许值范围: 0~59 ,不允许为空值,若值不合法,调度器将…...

丙烯酸共聚聚氯乙烯树脂

声明 本文是学习GB-T 42790-2023 丙烯酸共聚聚氯乙烯树脂. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了丙烯酸共聚聚氯乙烯树脂的外观、物化性能等技术要求,描述了相应的采样、试验方 法、检验规则、标志、包装、…...

Navicat导入Excel数据顺序变了

项目场景: Navicat导入Excel数据 问题描述 从Excel表格中导入数据到数据库中。但是,在导入的过程中,我们常会发现数据顺序出现了问题,导致数据错位,给数据的处理带来了极大的麻烦。 原因分析: 这个问题的…...

uni-app的生命周期

uni-app的生命周期包括应用生命周期和页面生命周期。 应用生命周期涵盖了整个uni-app应用的启动、运行和销毁过程,主要包括以下几个生命周期函数: onLaunch:应用初始化时触发,只触发一次。onShow:应用启动或从后台进…...

Vulnhub实战-DC9

前言 本次的实验靶场是Vulnhub上面的DC-9,其中的渗透测试过程比较多,最终的目的是要找到其中的flag。 一、信息收集 对目标网络进行扫描 arp-scan -l 对目标进行端口扫描 nmap -sC -sV -oA dc-9 192.168.1.131 扫描出目标开放了22和80两个端口&a…...

软件设计模式系列之七——原型模式

1 模式的定义 原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新…...

PMP考试注意事项有哪些?

1. PMI明确规定:不允许考生使用自带文具,包括自带的笔、削笔刀、橡皮、笔袋、计算器和草稿纸等。 2. 本次考试考场内为每位考生配备2B铅笔、橡皮、计算器(若有需要)和草稿纸。如文具有缺损或考试过程中如需更换铅芯等,请向监考老师举手示意。…...

chartgpt+midjourney

chatGPT程序化生成故事 英文版脚本步骤 步骤一:在chatgpt中输入以下脚本,,标红为可变的文字,输入你想要的,目前是科幻,即科幻故事,你可以改为 fairy-tale,则写的是童话故事&#x…...

【SpringMVC】自定义注解

【SpringMVC】自定义注解 前言1. 什么是注解?2. 注解的用处3. 注解的原理1.1. Override1.2. SuppressWarnings 2. JDK元注解2.1. Retention2.2. Target2.3. Inherited2.4. Documented 3. 自定义注解3.1. 自定义注解的分类注解类 结语 自定义注解及其应用 前言 在J…...

【李沐深度学习笔记】数据操作实现

课程地址 数据操作实现p2 数据操作 首先导入PyTorch包(import torch),虽然叫PyTorch,但实际上要导入torch。 import torch张量 张量表示的是一个数值组成的数组,这个数组可以有很多个维度。 # 生成0-11的顺序序列构成的一维…...

【深度学习-注意力机制attention 在seq2seq中应用】

注意力机制 为什么需要注意力机制attention机制的架构总体设计一、attention本身实现评分函数 attention在网络模型的应用-Bahdanau 注意力加性注意力代码实现 为什么需要注意力机制 这是一个普通的seq2seq结构,用以实现机器对话,Encoder需要把一个输入的…...

详解混合类型文件(Polyglot文件)的应用生成与检测

1. 引入 混合类型文件(Polyglot文件),是指一个文件,既可以是合法的A类型,也可以是合法的B类型。 比如参考3中的文件,是一个html文件,可以用浏览器正常打开;它也是一个一个.jar文件&…...

QT之QTableView的简介

QT之QTableView的简介 QTableView 是 Qt 框架中的一个类,用于显示和编辑表格数据。它提供了一个灵活的模型/视图架构,允许用户以不同的方式显示和编辑数据。 以下是 QTableView 的一些常用函数及其用法: 1)QTableView(QWidget *pa…...

学习记忆——宫殿篇——记忆宫殿——记忆桩——知识讲解

类比 假设这些桩子好比不同的交通工具,每一种交通工具都可以助我们到达目的地,那举现在就根据你的时间以及现实情况,选择最合适自己的交通工具即可,重点在于你要熟悉每种交通工具的用途不区别。桩子也是如此,把所有的桩…...

Python lambda匿名函数

视频版教程 Python3零基础7天入门实战视频教程 前面我们所学的函数定义,都是有函数名的。 我们现在学的lambda函数是没有名称的,也就是匿名函数。 我们在只需要一次性使用的函数的时候,就可以用lambda匿名函数,简单方便快捷。 …...

成绩统计(蓝桥杯)

成绩统计 题目描述 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。 请计算及格率和优秀率,用百分数…...

ETL与ELT理解

ETL ETL( Extract-Transform-Load),用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL模式适用于小数据量集。如果在转换过程…...

IntelliJ IDEA 2023 年下载、安装教程、好用插件推荐

文章目录 下载与安装IDEA常用插件推荐Alibaba Java Coding Guidelines(阿里巴巴Java开发规约)Key Promoter X(IDEA快捷键提示)Translation(翻译插件)Save Actions(优化保存插件)Codo…...

下载HTMLTestRunner并修改

目录 一. 下载HTMLTestRunner 二. 修改HTMLTestRunner 1. 修改内容 2. 修改原因 一. 下载HTMLTestRunner 下载报告模板地址:http://tungwaiyip.info/software/HTMLTestRunner.html 下载模块: 二. 修改HTMLTestRunner 将修改后的模块放到python安装目录下的..…...

C#回调函数学习1

回调函数(Callback Function)是一种函数指针,它指向的是由用户自己定义的回调函数。我们将这个回调函数的指针作为参数传递给另外一个函数,在这个函数工作完成后,它将通过这个回调函数的指针来回调通知调用者处理结果。…...

leetcode 232 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头…...

element UI表单验证,自定义验证规则

validator 可以为指定字段自定义验证函数——这就相当于把前边配置的东西用js按照以前的方式编写验证逻辑了。虽然麻烦点&#xff0c;但是能实现比较复杂的业务逻辑判断。 <el-form-itemlabel"中奖概率"prop"rate":rules"[{ required: true, mes…...

redis 主存复制

1. 前言 Redis的持久化机制&#xff0c;它很好的解决了单台Redis服务器由于意外情况导致Redis服务器进程退出或者Redis服务器宕机而造成的数据丢失问题。 在一定程度上保证了数据的安全性&#xff0c;即便是服务器宕机的情况下&#xff0c;也可以保证数据的丢失非常少。 通常…...

Unity Shader顶点数据疑问

1&#xff09;Unity Shader顶点数据疑问 2&#xff09;Unity 2018发布在iOS 16.3偶尔出现画面不动的问题 3&#xff09;安卓游戏启动后提示“应用程序异常” 这是第352篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社区帖子等技术知…...

根据链接获取网站名称/搜索图片

名称&#xff1a;Action-Email 默认接收人&#xff1a;故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障! 默认信息&#xff1a; 告警主机:{HOSTNAME1} 告警时间:{EVENT.DATE} {EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息: {TRIGGER.NAME} 告警…...

java和web前端哪个好找工作/深圳网站营销seo费用

元素设置disabled属性后便无法向后台传值转载于:https://www.cnblogs.com/lxcmyf/p/5904160.html...

有服务器和域名怎么做网站/百度网址大全设为主页

在自动驾驶进入新一轮疯狂的“硬件堆砌”阶段&#xff0c;更大的隐患也在出现。 4月19日&#xff0c;滴滴自动驾驶在上海车展发布全新硬件平台 “滴滴双子星”。相较上一代&#xff0c;硬件平台在传感器数量级和种类&#xff0c;以及性能算力方面都大幅提升。 其中&#xff0…...

佰牛深圳网站建设/seo快速优化软件网站

“ POI 工具类,Excel的快速导入导出,Excel模板导出,Word模板导出,可以仅仅5行代码就可以完成Excel的导入导出,修改导出格式简单粗暴,快速有效,easypoi值得你尝试”目前来说&#xff0c;Easypoi确实方便&#xff0c;官网也提供了三种不同的版本&#xff0c;它在开源中国还&#…...

电商网站首页设计/淘宝推广怎么推

关系数据库的几种设计范式介绍: 第一范式:确保每列的原子性(强调的是列的原子性&#xff0c;即列不能够再分成其他几列).如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式.例如:顾客表(姓名、编号、地址、……)其中"地址"列还…...

建设一个自己的网站首页/网络营销推广工具

由于国内Android市场众多渠道&#xff0c;为了统计每个渠道的下载及其它数据统计&#xff0c;就需要我们针对每个渠道单独打包&#xff0c;如果让你打几十个市场的包岂不烦死了&#xff0c;不过有了Gradle&#xff0c;这再也不是事了。 友盟多渠道打包 废话不多说&#xff0c…...