汽车标定技术(一):XCP概述

news2024/11/24 1:53:21

目录

1.汽车标定概述

2.XCP协议由来及版本介绍

3.XCP技术通览

3.1 XCP上下机通信模型

3.2 XCP指令集

3.2.1 XCP帧结构定义

3.2.2 标准指令集

3.2.3 标定指令集

3.2.4 页切换指令集

3.2.5 数据采集指令集

3.2.6 刷写指令集

3.3 ECU描述文件(A2L)概述

3.3.1 标定上位机的标定、测量

3.3.2 A2L文件格式

4.小结 


1.汽车标定概述

       汽车的标定技术,最初是源自对发动机的特征值、曲线Map和图表参数的一个动态优化调整以适配不同发动机、不同车型对动力的需求。

       它的基本思路是将发动机各种控制算法固化在MCU的Flash中,但是这些算法所需要用的参数通过技术手段抽象出来并在ram中运行,标定人员可以通过修改这些参数来观察算法的输出是否满足要求。注意哈,虽然说我们知道这个参数是可以修改的,但对于CPU或者控制算法来说,这些参数其实是常量,只有控制算法的输出才是变量。

        下图是一个比较经典的标定测量流程示例图:

        标定(Calibration)就是调整和优化ECU中的对于发动机控制算法的各种特征变量;

        测量(Measurement)就是观察不同标定常量作为输入是如何影响控制算法的输出。

        再举个简单一点的例子,比说说现在油门踏板开度与喷油量之间存在这样的关系

y = ax+b

        y--喷油量,x--油门踏板开度,a和b分别为常量

        那么要做标定,我们应该修改的是什么值?

        首先,肯定不可能是x,因为这个开度是驾驶员用脚踩出来的,我们是没办法去要求别人;其次不可能是y,这是输出啊,根据x来的,那么只能是a或者b了;我们假设x此时为50%,表示油门踏板开度为50%,对应的a、b固定,那么喷油量y就是固定了;

        但对于某些动力车型,它想要50%的踏板就有很强动力(y很大),这时候我们就应该去修改常数a、b(此时是运行在ram中)。标定就是修改这些特征值来满足不同车型的要求,当我们根据车型的不同将上述a、b修改成不同值后,一旦标定工程师认为这些值达到效果了,就通过flash刷写的方式将这些数写进Flash中,再通过技术手段告诉ECU以后就到Flash去取a、b的值吧。这就完成了汽车量产前的标定工作。

        那么要完成标定这项工作,需要具备哪些条件呢?

        首先要有一个好的修改标定常量的工具,其次要有一个好的观测方式(要么肉眼,要么通过PC端),最后还要有一个好的人机交互界面。

        这时候,一个名叫ASAM的组织就冒了出来,它将刚才我谈到的这些内容进行一个标准化,即ASAM-MCD(Standardization of Automation and Measurement systems, with the work groups:
Measurement, Calibration and Diagnosis)。

        借用Vector对于一个完整标定系统的描述:

  • ASAM-MCD-1MC:ECU和标定测量系统接口
  • ASAM-MCD-2MC:即A2L文件,是控制器内部信息描述文件规范
  • ASAM-MCD-3MC:此接口用于将另一个系统连接到标定测量系统,例如用于试验台自动化

2.XCP协议由来及版本介绍

       有了上述基本概念,我们知道标定测量系统和ECU之间的桥梁就是ASAM-MCD-1MC,最初就是大家都比较熟的CCP(基于CAN的标定协议,于1995年提出,当前为2.01,1999定版),但是由于CAN的速率特性,对测量数据的时间戳不够精确;再加上目前ADAS等高测量速率要求,CCP逐渐不能满足要求;因此将该协议从CCP中抽象出来是非常有必要的,这时候就出现了XCP(Universal Measurement and Calibration Protocol),“X”表示的是可变的传输层协议,具体如下:

        截止到目前为止,XCP协议已经迭代到了1.5版本 ,每个版本更新如下:

版本发布时间变更点
1.02003

1.传输层支持CAN、ETH(UDP和TCP/IP、SPI、USB)

2.发布标定测量、

1.120081.增加传输层支持FlexRay
1.220131.增加A2L-IF_DATA描述,用于预估ECU资源消耗
1.320151.增加了feature:ECU状态,Bypassing错误处理和时间参数相关
1.420171.新增DAQ模式:减少时间戳数据传输的压缩DAQ等
1.520171.新增“Software Debugging over XCP”标准

3.XCP技术通览

        本质上,XCP协议是为使用者提供了对ECU内部memory的读写机制。读访问保证标定系统可以从RAM中读取观测量,即测量(measurement);写访问保证了标定系统可以对RAM中的标定量进行数值修改,即标定(calibration)。

        因此,XCP的实现就采用了经典的master-slave问答形式。

3.1 XCP上下机通信模型

         XCP基于Master-slave原则;标定系统作为Master,ECU通常作为Slave,Master与Slave之间通过标定工具(硬件例如ETAS的ES582、Vector的VX1000等)了解,使用XCP协议规定的指令进行交互;所以在Master和Slave的系统里均需集成XCP标准协议栈,就和诊断栈一样。

        Master与Slave的命令交互帧叫做CTO(Command Transfer Objects);

        Master与Slave的测量数据交互帧叫做DTO(Data Transfer Objects);

        其通信模型如下:

图片来源:Vector官网 

CTO缩写全称描述
CMDCommand PacketMaster给Slave发送的指令
RESCommand Response PacketSlave返回给Master的命令正响应
ERR Error Packet        Slave返回给Master的命令负响应
EVEvent PacketSlave发给Master的异步事件帧
SERVService Request PacketSlave发给Master的服务请求帧
DTO缩写全称描述
DAQData AcquisitionSalve周期给Master发送测量数据
STIMStimulationMaster周期发送Slave的激励数据(Bypass常见)

        XCP提供了如下几种数据传输方式:

  • 一问一答模式

  • Master块传输模式

         比如说使用download传输大数据给ECU,就会用到这种通讯模式

  • Slave块传输

         Upload指令,获取ECU内部的数据状态;一般标定download完之后,会紧跟着一个upload检查是否写进了目标ram地址。

  • 多问答模式

        这种比较少见,如有用到的可以在后面留言哦。 


3.2 XCP指令集

        有了上位机通信模型之后,我们接下来就要了解XCP协议具体定义了哪些指令。

        在这之前,要先来看XCP协议定义的帧结构。

3.2.1 XCP帧结构定义

            XCP帧包含三部分:Header+Packet+Tail

         其中,帧头(Header)、帧尾(Tail)依赖不同传输层,真正要讨论的深色部分,这部分内容与传输层无关了,即XCP协议栈真正要处理的数据内容,它主要包含三部分内容 ID 域、时间戳域和数据域。

  • ID域

        ID域中最重要的就是PID(Packet identifier),这个值实际上就是Master\Slave的命令ID。如下:

         DAQ主要是测量时根据DAQ list和ODT类型来定位数据的,以后有文章着重描述测量这块。

        CTR可选,也是用于DAQ。

  • 时间戳域

        时间戳通常时DTO帧使用,因为同一个DAQ list里的观测量是同一时间采集,所以一个DAQ周期只会传输一个时间戳

  • 数据域

        Master和Slave真正交互的实际数据,每个指令都有不同的Date参数放在这个域里。

  • 连接命令问答示例

        我们以FF连接命令为例,详细看下PID+DATA是如何交互的,如下:

        根据标准定义,我们来分析上述报文的具体含义。

        根据协议可以看到回复含义如下:

15:CAL/PAG、DAQ、STIM、PGM资源处于保护状态;

C0:  开启slave block mode,inter byte order,AG为1;

08:MAX CTO;

08:MAX DTO;

01 01 :XCP协议版本 1.1

        有了这个基本概念,我们来看看XCP协议到底提供了哪些指令。        

3.2.2 标准指令集

        所谓标准指令集,就是提供最基础的功能,包括Master和Slave的连接建立、断开,ECU身份识别,解锁受保护资源,获取当前会话状态等等。根据XCP1.5版本,标准指令集如下:

        其中前四条指令必选,我们常见的标定上位机的连接按钮,一点击就是这个四条指令的组合拳。 余下指令除了最后两条,基本也是要选的,UPLOAD可以与DOWNLOAD搭配使用,SEED\UNLOCK也是组合。

3.2.3 标定指令集

        标定指令集就是执行标定动作或者在开始标定之前将离线标定的数据批量写进calibration ram中。

        其通讯流程如下:

        首先是SET_MTA(0xF6) 设置即将要传输的memory地址等;

        然后调用DOWNLOAD(0xF0)通知Slave即将要使用的传输模式,结合DOWNLOAD_NEXT进行大数据传输,或者使用问答方式进行小数据标定。

3.2.4 页切换指令集

        页切换,可以用于所谓的工作页和参考页的切换,本质上就是memory地址的切换,WP和RP具体可参考之前关于标定的简单描述汽车ECU的标定

        页切换指令集包含如下内容:

        但在实际使用中,页切换不是所有ECU都支持的,通常是带overlay功能的CPU可以支持。因此要做页切换的目的就是想要CPU很快速滴访问WP或者RP去取算法所需的参数,但做这个切换没有overlay是比较难实现的,具体可参考overlay机制英飞凌TC3xx-Overlay-CSDN博客 。

3.2.5 数据采集指令集

        数采指令集,就是大家常见的DAQ指令集,如下:

        DAQ可以分为动态和静态DAQ;而根据ASAM_XCP_PART5的示例,DAQ的响应时序如下:

        1.获取从机DAQ列表信息

        由于首先就要获取DAQ列表信息,因此在XCP初始化时就要对DAQ进行初始化。

        该步骤所要用到的指令:DA、D9、D7、D5、D8,

        2.准备DAQ列表

                1)静态DAQ配置:常用指令E3

                2)动态DAQ配置

                首先要释放DAQ(D6),然后分配DAQ(D4),最后分配ODT入口(D3)。

        3.配置DAQ列表

                这一步骤用到的指令有:SET_DAQ_PTR(E2),WRITE_DAQ(E1)

        4.开始传输数据

        用到的指令有:SET_DAQ_LIST_MODE(E0)、START_STOP_DAQ_LIST(DE)、GET_DAQ_CLOCK(DC)、START_STOP_SYNCH(DD)

3.2.6 刷写指令集

1.声明刷写开始

        用到的指令PROGRAM_START(D2)

2.擦除FLASH

        用到的指令有 SET_MTA(F6)、PROGRAM_CLEAR(D1)。

3.开始刷写数据

        PROGRAM(D0)

4.结束刷写

        PROGRAM_VERIFY(C8)、PROGRAM_RESET(CF)

        但在实际使用,通常不怎么用这个,都是标号导出hex,通过诊断刷进去。

        因为以前如果是INCA,就得开发ProF文件,其次刷写的效率真的很低。


3.3 ECU描述文件(A2L)概述

        在讲A2L文件之前,我们先来思考几个问题。

  1. 既然标定测量的本质是对ECU内部memory进行读写访问,那么Master是通过什么途径知道存放在ECU内部的标定量、观测量的地址的?
  2. 既然Master和Slave之间是通过CAN\ETH\FlexRay等通讯,它们之间的通信速率、采样点是如何同步的?

        带着这样的问题,我们进入A2L概述之旅

3.3.1 标定上位机的标定、测量

        当我们使用INCA或者CANape时,标定窗口和测量窗口通常长这样:

        这些数据从哪里来的呢?如下图

        我们可以看到,这个数据集里有很多个观测量以及2个标定量,我们选取其中的test_calib1和measrued_Var1进行标定和测量,我们截取master的通信报文如下:

Package Type

Xcp Package

Parameters

SET_MTA

F6 xx xx 00 60 00 00 00

Address extension = 0x00

Address = 0x00000060

RES

FF

DOWNLOAD

F0 04 00 00 80 3F

Number of data elements = 0x04

Data elements = 0x00 0x00 0x80 0x3F

RES

FF

         很明显,这个0x00000060就是test_calib1的地址,那么这个标定工具INCA是怎么知道的呢?

        还记得我们ASAM-MCD-2MC吗?即A2L文件,它就是用来告诉标定工具ECU里面各种详细信息的,包括指令支持类型、通讯方式、观测量、标定量在Flash和RAM的那个具体地址以及实际数据和算法物理数据转换公式等信息。

3.3.2 A2L文件格式

        A2L文件是一种ASCII格式可读文件,记事本都可以打开,它包含了如下具体内容:

  • AML部分:描述了XCP协议的相关信息,关键字/begin A2ML  ... /end A2ML
  • ECU通用部分:描述了ECU的部分信息,比如ECU byte order,对齐方式,标定Flash\RAM等,关键字 /begin MOD_COMMON ... /end MOD_COMMON;/begin MOD_PAR ... /end MOD_PAR等
  • IF_DATA:描述了通讯接口,传输层相关信息,这个INCA要求特点严格,增加在CAN的波特率描述上调bug调了大概半个月,就是因为采样点的原因。
  • A2L对象:包含了标定量、观测量的具体地址、转换公式等,关键词 /begin CHARACTERISTIC ... /end CHARACTERISTIC

       通常我习惯把绿色部分叫做A2L header部分(与/begin HEADER关键词区分),在最开始没接触vector的ASAP2 editor时,都是根据标准描述一行一行手撸,后来掌握到关键点后,用脚本做一个基于excel的配置工具也勉强能用;

        红色部分,一般情况就是用模型生成的A2L文件,如下图:

        最开始生成的A2L文件,标定观测量没有地址的,也没有相应的header,需要集成编译后拿到map或者elf文件进行地址替换,如果没有ASAP2 editor或者CANape,那就只能用matlab自带脚本,如果想再自定义A2L格式,还得熟悉m语言,以后会专门将这块内容。 

        最后以一个A2L文档结构来描述一下:

4.小结 

        前三节内容,基本上把XCP大体框架讲的七七八八,后面会详细聊聊标定在ECU里面的具体概念、DAQ和ODT list的详解、INCA走XCP刷写必备ProF文件、基于模型如何开发标定测量以及生成完美的A2L文件,MPC5748的ovelay概念以及在集成XCP协议栈遇到的各种奇奇怪怪的问题。

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

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

相关文章

无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

目前,ChatGPT、Llama 2、文心一言等主流大语言模型,因技术架构的问题上下文输入一直受到限制,即便是Claude 最多只支持10万token输入,这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题,加州伯克利…

物联网AI MicroPython传感器学习 之 QMC5883指南针罗盘传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 QMC5883是一款表面贴装的集成了信号处理电路的三轴磁性传感器,应用场景主要包括罗盘、导航、无人机、机器人和手持设备等一些高精度的场合。 引脚定义 VCC:3V3&#…

【Java 进阶篇】Java ServletContext详解:获取MIME类型

MIME(Multipurpose Internet Mail Extensions)类型是一种标识文件类型的文本标签,通常用于指示浏览器如何处理Web服务器返回的文件。在Java Web应用程序中,ServletContext对象提供了一种方便的方法来获取文件的MIME类型。本篇博客…

【实战Flask API项目指南】之五 RESTful API设计

实战Flask API项目指南之 RESTful API设计 本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧! 前言 当小菜踏入Flask后端开发的世界时…

Redis-命令操作Redis

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 ,越幸运。 1.Redis简介 1.1.什么是Redis Redis是一个开源(BSD许可),内存存储的数据…

费用预算管理系统

费用预算管理系统 1. 模块概述 《费用管理》以企业费用管理为核心,围绕费用支出审批流程,从费用发生前的事前申请,报销单据审批、付款单据审批,再到出纳付款、会计记账等所有工作流程都在系统中全员、协同完成;并且能…

el-table中的el-input标签修改值,但界面未更新,解决方法

el-table中的el-input标签修改值,界面未更新 在el-table中的el-input里面写的change事件根本不触发,都不打印,试了网络上各种方法都没用 然后换成input事件,input事件会触发,但界面也未更新。我在触发事件的时候&…

微信小程序之开发工具介绍

一、微信小程序开发工具下载 微信小程序开发工具下载可以参考这篇博客《微信小程序开发者工具下载-CSDN博客》 二、开发工具组成部分 如下图所示,开发者工具主要由菜单栏、工具栏、模拟器、编辑器和调试器 5 个部分组成。。 1、菜单栏 菜单栏中主要包括项目、文…

听GPT 讲Rust源代码--library/std(13)

题图来自 Decoding Rust: Everything You Need to Know About the Programming Language[1] File: rust/library/std/src/os/horizon/raw.rs 在Rust源代码中,rust/library/std/src/os/horizon/raw.rs这个文件的作用是为Rust的标准库提供与Horizon操作系统相关的原始…

STM32HAL-完全解耦面向对象思维的架构-时间轮片法使用(timeslice)

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、代码解释 六、总结 概述 timeslice是一个时间片轮询框架,完全解耦的时间片轮询框架,非常适合裸机单片机引用。接下来将该框架移植到stm32单片机运行,单片机…

王道计算机网络

一、计算机网络概述 (一)计算机网络基本概念 计算机网络的定义、组成与功能 定义:以能够相互共享资源的方式互连起来的自治计算机系统的集合。 目的:资源共享, 组成单元:自治、互不影响的计算机 网络协议 从不同角度计算机网络…

【Python入门二】安装第三方库(包)

安装第三方库/包 1 使用pip安装2 使用PyCharm软件安装3 离线安装,使用whl文件安装参考 在Python中,有多种安装第三方库的方法,下面是一些常用的方法: 1 使用pip安装 pip是Python中最常用的包管理工具,也是最常用的在线…

PASCAL VOC 格式

文章目录 ImageSets 文件夹Main 文件夹:Segmentation 文件夹:Layout 文件夹:Action 文件夹: Annotations 文件夹主要标签:物体标签: SegmentationClass 文件夹SegmentationObject 文件夹 PASCAL VOC(Visual Object Classes)是一个…

计算流体动力学(CFD)软件

CFD,英语全称 (Computational Fluid Dynamics),即计算流体动力学。CFD 是近代流体力学,数值数学和计算机科学结合的产物,是一门具有强大生命力的交叉科学。它是将流体力学的控制方程中积分、微分项近似地表示为离散的代…

ardupilot开发 --- 代码解析 篇

0. 前言 根据SITL的断点调试和自己阅读代码的一些理解,写一点自己的注释,有什么不恰当的地方请各位读者不吝赐教。 1. GCS::update_send 线程 主动向MavLink system发送消息包。 1.1 不断向地面站发送飞机状态数据 msg_attitude: msg_location: n…

MYSQL 多表联查详解

目录 一、一个案例引发的多表连接 二、笛卡尔积的错误和与正确的多表查询 2.1、笛卡尔积错误展示 2.2、笛卡尔积解决方法 2.3、练习 三、多表查询分类 3.1、等值连接 vs 非等值连接 3.2、自连接 vs 非自连接 3.3、内连接 vs 外连接 内连接(inner join&…

基于FPGA的图像RGB转CMYK实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、RGB转CMYK的原理 4.2、基于FPGA的实现方法 5.算法完整程序工程 1.算法运行效果图预览 将仿真结果导入到matlab中,得到如下对比结果: 2.算法运行软件版本 matl…

C++虚函数产生的多态

C虚函数产生的多态 1、先看下面代码&#xff0c;参考施雷老师课堂笔记 #include<iostream> #include<vector> #include <algorithm> #include <functional> using namespace std;/* 虚函数&#xff0c;静态绑定和动态绑定覆盖&#xff1a; 基类和派生…

Vue3 实现 clipboard 复制功能

一个很小的交互功能&#xff0c;网上搜了一下有一个 vue3-clipboard 直接支持vue3&#xff0c;到github仓库看了下&#xff0c;原作者已经不维护这个项目了&#xff1a; 推荐使用 vueuse 自带的 useclipboard 功能&#xff0c;由 vue 团队维护&#xff0c;稳定性基本没问题 官…

UDP服务端和客户端通信代码开发流程

一、UDP通信 TCP&#xff1a;传输控制协议&#xff0c;面向连接的&#xff0c;稳定的&#xff0c;可靠的&#xff0c;安全的数据集流传递 稳定和可靠:丢包重传 数据有序:序号和确认序号 流量控制:稳定窗口 UDP&#xff1a;用户数据报协议 面向无连接的,不稳定的,不可靠,不安…