汽车标定技术(三)--XCP协议如何支持测量功能

目录

1. 概述

2. 测量方式 -- Poll

3. 测量方式 -- DAQ

3.1 ODT概念模型

3.2 DAQ List概念

3.3 ODT 绝对编号和相对编号

3.4 静态DAQ和动态DAQ模式

(1)静态DAQ

(2)动态DAQ

4.小结 


1. 概述

       在该系列的首篇文章汽车标定技术(一):XCP概述-CSDN博客,我们知道标定系统中Master与Slave的命令交互帧叫做CTO(Command Transfer Objects);Master与Slave的测量数据交互帧叫做DTO(Data Transfer Objects)。

       其中关于DTO分为两种:

  • Slave(ECU)传输给Master(标定上位机)的数据帧:DAQ(Data AcQuisition)
  • Master传输给Slave的数据帧:STIM(Stimulation)

        其数据流如下图所示:

         关于DAQ这个比较容易理解,实际上,做过标定的同学下面红框两个动作都非常熟悉:

        左边表示与ECU建立连接,右边闪电表示master通知ECU:请开始上传我想要的数据吧! 

        数据开始传输后,ECU不需要得到Master的响应,可以按照预定义的周期一直发送数据,直到Master关闭闪电:ECU,你不要再传数据了,我不想看了。

        至于STIM的功能使用则需要看你处于汽车开发的哪个阶段。一般来说,标定测量会贯穿整个汽车ECU的开发,因此在不同阶段有可能是不同工程师进行标定,台架或者仿真的同学如果家里有条件可能会用到STIM,但常年跑三高的同学就不怎么使用STIM,因为直接上车干了。

        那么STIM到底是干什么的?我们留在第4节进行描述。

2. 测量方式 -- Poll

        在概述中,我们看到master可以选择不使用闪电进行测量,那除了这种方式还有没有其他方式进行测量呢?答案肯定是有的。

        Master问:"我要看观测量A的值,A的地址在0x00000001“,Slave答:”这个地址存的数据是2,主人“。这种一问一答的方式我们把它叫做轮询(Poll),很明显,这种方式就是用的CTO,而不是DTO了。如下图:

        在XCP协议里提供了一条指令SHORT_UPLOAD(0xF4),具体如下:

        以下图为例,对观测量Triangle选择Poll的方式进行测量,上位机就会使用F4指令,并把目标地址下发给ECU。

         我们来看具体的数据流:

        可以看到,ECU根据上位机下发的地址去获取数据,并返回给上位机。但是各位发现没有,这种测量方式一问一答只能针对一个特定的变量;如果我想在10ms同时获取5个观测量的值,这种方式肯定是不可能的。

        所以,为了解决这种并发的情况,同时减少这种不必要的问答帧对总线的负荷,DAQ应运而生。        

3. 测量方式 -- DAQ

        我们首先以一个数据流来具象地体会一下DAQ这种方式,如下图:

        可以看到,当上位机Master下发CMD通知ECU开始进行测量时,ECU首先答复:”我要开始咯“ ,然后就开始通过DTO-DAQ的方式不同的传输数据。这种方式只需要上位机提前通知ECU,我想要以什么样的速率获取哪些观测量的数据,ECU就会自动上传数据,而不再需要轮询这种问答制的低效率测量方式。

        那么我们具体来看一下DAQ是如何实现的。

3.1 ODT概念模型

        在我们讨论DAQ之前,我们先思考一个问题。

        以XCP on CAN为例,如果我们想用DAQ的方式进行数据的测量,那么肯定希望Slave传递尽可能多的数据,比方说一帧标准CAN 报文,数据域8个字节,我恨不得这八个字节全是需要的数据,这样就在最有限的资源下干最多的事情。但实际情况,这是不可能的,假设现在有20个1 byte的观测量要以10ms的周期进行测量,这时候至少需要slave发送3帧报文,如果全是都是数据,master是如何直到哪一帧报文对应哪些数据呢?基于这种情况,XCP就规定DTO帧至少有一个字节是用来表示身份,如下:

         因此,我们可以看到,在DTO的Identification Field至少有一个PID的身份信息。其余的FILL、DAQ的含义我们后面再讲。

        接着我们来看,XCP对于要测量的数据是如何进行抽象的。首先祭出一张大家都看过的图:

        这张图的知识点比较密集,但属于会者不难。

        在XCP协议中,有几个概念需要理解,分别是Element、ODT、ODT Entry

  • Element:观测量的具体值,存放在RAM中
  • ODT:Object Description Table,一个表格,用于存放ODT Entry
  • ODT Entry:我习惯说成ODT 条目,描述了Element的具体RAM地址和数据长度

        Slave根据ODT中的描述,把目标观测量数取出组成一个标准CAN帧(一个ODT一帧报文),从上图我们可以看到,ODT里面总共有7个条目,意味着Slave要根据这个ODT来获取7个观测量的数据组成一个CAN报文,但实际上一帧标准CAN只有8个字节,PID占据一个字节,那只有7个字节可以用了,是不是就意味着上图中描述的每个Element的数据长度均为1;

        如果上面所有7个观测量都变成了2个Byte,那么总共要传输的数据长度就变成了14个,此时需要CAN 报文2帧,填充方式如下:

        这个时候,ODT#0中就有4个ODT enrty,ODT#1中也有4个ODT entry;因此我们可以直到,ODT entry不一定描述的完整观测量地址和长度,它只需要告诉slave在什么地方拿多长的数据即可,具体解析和拼接由master完成。总结下来,一个ODT中可以包含1~7个ODT Entry。如果参数占用1byte,则一个ODT可以容纳7个ODT Entry;如果参数占用2byte,则一个ODT可以容纳3ODT Entry;如果参数占用4byte,则一个ODT可以容纳1个ODT Entry;如果参数有3个2byte和1个1byte,则一个ODT可以容纳4个ODT Entry。

3.2 DAQ List概念

        多个ODT组成一个DAQ List,如下:

        DAQ List可以有多个,对应不同的测量周期,例如 10ms对应DAQ list0、100ms对应DAQ list1。因此就引出了ODT的编号问题,比如说两个DAQ 的ODT#0怎么分别;接着往下看。

3.3 ODT 绝对编号和相对编号

        ODT绝对编号是指每个ODT编号在所有的DAQ List中是唯一的。比如:有2个DAQ List(DAQ0和DAQ1),每个DAQ中都有7个ODT,则DAQ0中的ODT编号是0~6,则DAQ1中的ODT编号是7~13。

        相对ODT编号是指每个DAQ List中的ODT编号都是从0开始编号。如比如:有两个DAQ List(DAQ0和DAQ1),每个DAQ都有7个ODT。对于DAQ0来说,ODT编号是0~6,对于DAQ1来说,ODT编号也是0~6。

        除此之外,XCP使用了AG(ADDRESS_GRANULARITY)规定了element的对齐方式, 可以取值1、2、4。在配置中多使用1字节对齐。基于CAN的传输,一帧只能传输8个字节。假如标识区采用如下形式,AG=1,则对齐的方式就是1字节对齐,即不管参数是1、2、4字节都可以向该CAN帧中填。

        如果AG=2,对于1byte的参数1和参数2,及2byte的参数3排列如下所示,参数1和参数2都是1byte,为保证AG=2,其后使用填充位AA补齐。

3.4 静态DAQ和动态DAQ模式

       数据采集提供了DAQ静态采集和动态采集的模式,具体如下: 

        DAQ配置信息可通过指令GET_DAQ_PROCESSOR_INFO(0xDA)获取

(1)静态DAQ

        可以看到,静态配置下,DAQlist数量、ODT入口数量都是固定的,但是每个DAQ列表中的ODT个数可以不一样。

(2)动态DAQ

        从上图可以看出,动态DAQ中,DAQlist数量是由配置的DAQ(可以为0,1,2,。。。。)+配置好的DAQ(DAQ_COUNT)决定,非固定的;ODT数量由ODT_COUNT决定;而ODT入口长度也可以灵活配置。

        在配置动态DAQ列表时,需要严格遵守以下时序:FREE_DAQ, ALLOC_DAQ, ALLOC_ODT  ALLOC_ODT_ENTRY,首先,主机发送FREE_DAQ指令来清空DAQ;然后发送ALLOC_DAQ分配DAQ列表数量;接着,发送ALLOC_ODT将所有的ODT分配给DAQ列表;最后发送ALLOC_ODT_ENTRY将所有的ODT入口分配给ODT。具体如下:

动态配置流程

1)释放DAQ(D6):清除之前配置好的DAQ列表、ODT和ODT_Entry等,完成之后在这里会将DAQ配置状态置为FREE

2)分配DAQ(D5):上位机会根据命令(DA)中的DAQlist数量发送命令;

完成之后将DAQ配置状态置为DAQ状态

3)分配ODT(D4):这里的ODTcount推测是根据在上位机中拖取观测量的数量,如果拉出9个观测量,每个观测量大小为4个字节,每一帧可上传7个字节,因此ODTcount就为(4*9)/7=5.1,因此至少需要6个ODT. 完成之后将DAQ配置状态置为ODT状态

4)分配ODT ENTRY(D3):

        这里就是给每一帧数据分配几个数据,还是接着上面的,第一帧可上传7个字节的数据,那么如果每个数据的大小均为4个字节,就只能上传1个数据加上下一个数据的前三个字节,因此ODTENTRY为2;那么第二帧接着上面的就可以上传第一帧未传完的剩余一个字节(1byte)、第三个数据(4byte)以及第四个数据的前两个字节(2byte),所以第二帧的ODTENTRY为3;以此类推。

两个DAQ list配置数据流如下:

        当有两个daqlist的时候,CANape在动态配置时顺序如下:AllocDAQ(分配2个daqlist)、AllocOdt(给两个daqlist分配好odt)、AllocOdtEntry(给2个daqlist的odt分配好entry),并不是之前我理解的每一个daqlist分配好odt和entry之后再处理另一个daq,具体看如下log截图:

分配完毕之后再设置daq指针,往该地址里写相应的测量量的数据;如下

4.小结 

        本篇内容,我们简单把DAQ的基本概念和实现方式做了初步梳理,大家要注意理解DAQ动态分配的数据流,接下来我们讲STIM\Bypassing,以及不同传输协议对应的帧结构区别

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轻量封装WebGPU渲染系统示例<19>- 使用GPU Compute材质多pass实现元胞自动机之生命游戏(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifeMultiMaterialPass.ts 系统特性: 1. 用户态与系统态隔离。 细节请见:引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调…

苍穹外卖-day06

苍穹外卖-day06 课程内容 HttpClient微信小程序开发微信登录导入商品浏览功能代码 功能实现:微信登录、商品浏览 微信登录效果图: 商品浏览效果图: 1. HttpClient 1.1 介绍 HttpClient 是Apache Jakarta Common 下的子项目,…

Busco-真核生物为主基因组质量评估

文章目录 简介Install必须参数谱系数据集输出结果自动谱系选择结果解读完整片段化缺失 自动选择:多domain和污染匹配注意BUSCO报告常用脚本真核Ref 简介 Busco评估基因组质量的核心原理在于通过计算基因组的通用单拷贝标记基因的比例来估计基因组的完整性。其中两个…

SOLIDWORKS 2024新产品发布会暨SOLIDWORKS 创新日活动-硕迪科技

“达索系统SOLIDWORKS 2024新产品发布会暨SOLIDWORKS创新日” 线下发布会即将登场!硕迪科技与达索系统携手为您奉上一场“云享未来,智协未来”的创新年度盛会,欢迎莅临! SOLIDWORKS 2024 以更加强大的姿态亮相,帮助您…

下载git步骤

文章目录 导文1.软件下载2.git安装3.测试git 导文 下载git的详细步骤 1.软件下载 可以自己去网上下载,根据自己电脑的系统类型是多少位的,去下载对应的安装包。 下载地址:Git - Downloads 根据自己的 操作系统进行选择,按需选择…

学习Nginx配置

1.下载地址 官网地址:NGINX - 免费试用、软件下载、产品定价 (nginx-cn.net) 我这边选择NGINX 开源版 nginx: download 2.nginx的基本配置 配置文件语法 配置文件组成:注释行,指令块配置项和一系列指令配置项组成。 单个指令组成&#x…

计算机丢失mfc100.dll如何恢复,详细解析mfc100.dll文件丢失解决方法

在计算机使用过程中,我们可能会遇到一些错误提示,比如“mfc100.dll丢失”。这是因为动态链接库(DLL)文件是Windows操作系统的重要组成部分,它们包含了许多程序运行所需的函数和数据。当这些DLL文件丢失或损坏时&#x…

可持久化01Trie

例题: 解释: 首先这里要求连续异或,所以存储前缀异或和数组。首先的话,我们只考虑前r个版本的Trie,所以以root[r]为根节点的Trie就是1到r位置数。但是,还有一个l左端点,所以我们对于每一个节点…

竞赛选题 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 🔥 优质竞赛项目系列,今天要分…

OpenCV 输出文本

PutText() 输出文本 OpenCV5 将支持中文字符的输出, 当前版本OpenCV4原生不支持, 可以使用Contrib包FreeType方式实现, 不过比较麻烦.为了省事, 也可以通过将Mat转成bitmap,然后使用GDI方式输出中文字符. 示例代码 /// <summary>/// OpenCV暂时不能支持中文字符输出,显示…

Python爬虫入门教程之快速理解HTTP协议

文章目录 前言一、HTTP协议是什么&#xff1f;二、HTTP 请求三、请求行四、请求首部五、请求体六、HTTP 响应七、响应行八、响应首部九、响应体总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①…

计算机基础知识49

三板斧的使用(views.py) 三个方法&#xff1a;HttpResponse: 返回的是字符串render : 返回html文件redirect : 返回加载HTML页面的 def html(request):print(from html)# return HttpResponse(request) # 它返回的是字符串return render(request,html.html) # 返回html# ret…

跟着森老师学React Hooks(1)——使用Vite构建React项目

Vite是一款构建工具&#xff0c;对ts有很好的支持&#xff0c;最近也是在前端越来越流行。 以往的React项目的初始化方式大多是通过脚手架create-react-app(本质是webpack)&#xff0c;其实比起Vite来构建&#xff0c;启动会慢一些。 所以这次跟着B站的一个教程&#xff0c;使用…

对称二叉树(C++解法)

题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false C代码 #include <iostrea…

Blender做一个小凳子学习笔记

文章目录 创建椅座椅子腿靠背渲染 本文是这个B站视频的学习笔记&#xff1a;【Blender】爆肝两个月&#xff01;拜托三连了&#xff01;这绝对是全B站最用心的&#xff08;没有之一&#xff09;Blender 3D建模零基础入门 创建椅座 首先&#xff0c;需要了解其左上角和右上角的…

【教3妹学编程-算法题】 在树上执行操作以后得到的最大分数

3妹&#xff1a;2哥&#xff0c;今日都立冬了&#xff0c; 可是天气一点都不冷。 2哥 : 立冬了&#xff0c;晚上要不要一起出去吃饺子&#xff1f;&#x1f95f; 3妹&#xff1a;好呀好呀&#xff0c;2哥请吃饺子喽 2哥 : 歪歪&#xff0c;我说的是一起出去吃&#xff0c;没说我…

【Linux】了解文件的inode元信息,以及日志分析

目录 一、inode表结构&#xff0c;以及元信息 1、了解inode信息有哪些 2、关于inode表的说明 Linux中访问文件的过程&#xff1a; 3、硬连接与软连接的区别&#xff0c;&#xff08;请看前面&#xff0c;写过的&#xff09; 二、文件系统的备份与恢复 三、几种常见的日志…

node插件MongoDB(三)—— 库mongoose 的使用

前言 提示&#xff1a;使用mongoose 的前提是你安装了node和 MongoDB。 mongoose 官网文档&#xff1a;http://mongoosejs.net/docs/index.html 文章目录 前言一、安装二、基本使用1. 打开bin目录的mongod.exe文件2. 基本使用的代码&#xff08;连接mongodb 服务&#xff09;3.…

理解MySQL的日志 Redo、Undo

理解MySQL的Redo日志和Undo日志 1、MySQL 日志文件解决的问题2、redo 日志2.1、redo log 的组成2.2、redo log 刷盘策略2.3、MySQL 的 redo log解决了哪些问题 3、undo 日志3.1、undo 日志作用3.2、undo log 的类型3.3、undo log 的生命周期3.4、事务回滚相关的几个隐藏字段 1、…

JAVA安全之Log4j-Jndi注入原理以及利用方式

什么是JNDI&#xff1f; JDNI&#xff08;Java Naming and Directory Interface&#xff09;是Java命名和目录接口&#xff0c;它提供了统一的访问命名和目录服务的API。 JDNI主要通过JNDI SPI&#xff08;Service Provider Interface&#xff09;规范来实现&#xff0c;该规…