XCP协议基础
文章目录
- XCP协议基础
- 一、引言
- 1.1 什么是标定
- 1.2 什么时候进行标定
- 1.3 标定的意义
- 二、XCP协议简介
- 2.1 xcp简介
- 2.2 XCP如何加快开发过程?
- 2.3 XCP的主要作用
- 三、XCP工作过程
- 3.1 工作过程
- 3.2 通讯模型
- 3.3 测量与标定
- 四、XCP报文解析
- 4.1 数据包报文格式
- 4.1.1 PID标识域
- 4.1.2 计数器域
- 4.1.3 时间戳域
- 4.1.4 数据域
- 4.2 CTO 与 DTO报文
- 4.2.1 CTO包
- 4.2.2 DTO包
- 4.2.3 常见命令
- 4.2.3.1 标准命令
- 4.2.3.2 标定命令
- 4.2.3.3 页切换命令
- 4.2.3.4 周期性数据交换命令
- 4.2.3.5 FLASH编程命令
- 4.2.3.6 时钟同步命令
- 4.2.3.7 ASAM连接标准命令
- 4.3 数据传输方式
- 4.3.1 标准传输模式
- 4.3.2 Master块传输模式
- 4.3.3 Slave块传输模式
- 4.3.4 交错传输模式
- 五、测量与标定
- 5.1 测量
- 5.1.1 Poling模式
- 5.1.1.1 SHORT_UPLOAD命令
- 5.1.1.2 SHORT_UPLOAD应答
- 5.1.1.3 Poling模式缺点
- 5.1.2 DAQ模式
- 5.1.2.1 ODT映射过程
- 5.1.2.2 预定义DAQList
- 5.1.2.3 静态DAQList
- 5.1.2.4 动态DAQList
- 5.1.2.5 动态DAQ配置过程
- 5.2 激励与旁路(STIM && By Passing)
- 5.2.1 STIM
- 5.2.2 By Passing
- 5.3 标定
- 5.4 地址映射
- 5.4.1 硬件方式(Overlay)
- 5.4.2 软件方式(Offset偏移)
- 5.5 A2L文件
- 5.5.1 A2L文件概述
- 5.5.2 A2L文件结构
- 5.5.3 A2L预定义类型
- 六、标定数据怎么保存
- 6.1 将参数保存在ECU中
- 6.2 将参数以文件的形式保存在计算机上
- 参考文献
标定是传统汽车行业很重要的工作,往往需要大量人员从事标定工作,ECU中的程序由软件工程师进行设计,而工程师不可能总是一开始就把这些参数设置成最合理的值,因为这些值需要在实验中根据汽车数学模型进行设置,即便一开始写入了一个看似合理的值,后期也会因为很多不可控的因素导致的误差,这时候最初设置的那个值就变得不再可靠。而如何确定算法中的关键参数?这时候就需要进行标定:在标定过程中,通过一次又一次的改变参数,然后观测实际运行状况,进而将这个过程中得出的能使运行状况最符合预期的值确定下来。XCP就提供了这种标定的方式。
XCP提供了一种对ECU中某些值进行读取、写入操作的一种协议,一般是把支持XCP的软件与汽车的CAN总线相连,目前XCP主要使用的工具有Vector公司的CANape ITAS的INCA,Value CAN等工具。
一、引言
1.1 什么是标定
假定现在需要对车上的一台电机进行控制,软件工程师通过说明书了解了这台电机的相关额定参数,随后写好了一套算法控制程序,用于完成对电机的控制。之后测试过程中发现基于这套算法无法使电机达到最佳运行状态,而电机的相关参数不可更改已成既定事实,所以,为了使这台电机达到最好的运行状态,需要调整之前写好的这套算法控制程序。
已知电机转速y和电压x之间存在如下关系:y=ax+b,我们的算法控制程序也是这样设计的。在这套算法中,X是某一档位下的电压,是既定事实,我们不能更改,所以为了使电机转速y达到最佳,需要进行不断的测试:通过更改系数a或者常量b,然后观察y的值,循环往复,将观察到的数据进行记录,然后总结出能够使电机运行状况达到最优工况下的a和b的值,并更改算法控制程序。整个过程就是一次标定的过程。
再比如已知油门踏板开度x与喷油量y之间存在如下关系:y=ax+b,如果要做标定,我们需要修改什么值?首先,肯定不可能是x,因为油门踏板开度是驾驶员用脚踩出来的,我们没办法要求别人;其次,也不可能是y,因为这是输出,根据x来的。那么就只剩下a或者b了。对于某些动力车型,它想要50%的踏板开度就能有很强的动力(y很大),这时候我们就应该去修改常数a和b。标定在这个例子中的意义就是修改某些特征值以满足不同车型的要求。一旦标定工程师认为这些值达到效果了,就通过flash刷写的方式将这些数写进Flash中,再通过技术手段告诉ECU以后就到Flash去取a,b的值,这就完成了汽车量产前的标定工作。
真实的标定过程远比上述示例复杂,甚至还有冬标与夏标之分,因为一些标定实现,通常需要在特定温度下反复调整系统参数,以满足车辆舒适性要求,但是在自然环境下,无法保证时刻都有合适的实验条件,且自然环境多变,常常无法准确确定参数,因此需要反复调整,从而导致标定周期过长。例如:
- 轮胎气压:夏标和冬标轮胎的气压要求不同。夏季气温高,轮胎气压会稍微降低,以减少轮胎的热胀冷缩,提高行驶的安全性和舒适性。冬季气温低,轮胎气压则需要适当增加,以提高轮胎的抓地力和操控性能。
- 机油黏度:夏标和冬标机油的黏度也有所不同。夏季气温高,机油黏度需要适当降低,以保证机油的流动性和润滑性能。冬季气温低,机油黏度则需要适当增加,以保证机油在低温下的流动性和润滑性能。
标定:根据ECU的性能要求或者整车的性能要求,修改调整或者优化ECU内部参数的过程。
1.2 什么时候进行标定
- 零部件更换后
- 软件升级后
- 车辆碰撞或维修后
- 日常定期维护
1.3 标定的意义
标定可确保不同的车辆系统协调高效地运行。正确的标定可以优化油耗、最大限度地提高性能、减少排放并增强安全性能。如果没有定期标定,车辆可能无法发挥预期性能,从而导致效率低下和潜在的安全风险。
汽车行业的标定工作在确保汽车以最佳性能和安全性运行方面发挥着举足轻重的作用。
二、XCP协议简介
2.1 xcp简介
CCP: CAN Calibration Protocol ,基于CAN总线的标定协议;
XCP: Universal Calibration Protocol ,通用标定协议;
XCP是继CCP之后的协议升级版,基于CAN的部分基本没有改变。XCP的开发旨在通过不同的传输媒介来实现此功能,其中“X”代表任意的传输层(如CAN、CANFD、FlexRay、Ethernet…),即协议层的内容不用改变,而传输层支持多种传输协议。
XCP是实现对嵌入式系统内部存储器的读写访问的标准协议,作为一种通用的测量协议已经建立了多年,并允许在运行时对嵌入式系统中的算法进行参数化。
2.2 XCP如何加快开发过程?
在传统开发过程中,代码开发完成后,对于一个算法:y=ax+b,在标定过程中,由于要反复观察改变系数a,常量b之后,最终结果y的实际数值,因此要一遍又一遍的修改代码,而修改代码就意味着要重新编译,链接,集成,然后再测量…这个过程会一直重复,直到标定过程结束,总结成流程图就是:
引入XCP之后,最关键的一处变化就是:待标定的参数可以在运行时被更改,不需要再更改任何代码,而是利用标定工具直接更改相应的内存单元中的值:
可以看到,引入XCP标定之后,省去了代码的重新编译链接,刷写集成的过程,通过直接更改内存单元中的参数的值加快了整个标定过程。
2.3 XCP的主要作用
- 标定
- 测量(反馈一些变量的值供上位机或测试系统查看,如转速等)
- 编程和刷新(例如更新一部分地址的数据值,甚至重编程等)
- 对ECU功能进行旁路,简单来说就是模拟ECU的数据
其中主要用标定和测量两点,其他两点用的比较少。
三、XCP工作过程
XCP是一种基于主从节点标定协议,标定时可以有1个主节点,多个从节点。主节点通常由CANape,INCA等标定工具担当,从节点则是一个个真实的ECU或者仿真ECU。
3.1 工作过程
- 将Master和Slave通过设备连接起来,通过发命令的方式建立连接;
- 通过上位机工具观测之前定义好的一些变量,例如速度,转矩,电压等参数;
- 可进行在线标定,一般是先在一个存储区(RAM)定义的变量找出一个比较好的参数,然后将这个比较好的参数固化下来,擦除原来的数据写入到另外一个映射好的存储区(flash);
- 通过将标定完成的软件烧录到ECU中,使用其编程的功能。
3.2 通讯模型
相关术语解释
缩写 | 全称 | 含义 |
CMD | Command | 上位机下发给下位机的一些命令,比如连接命令FF,解锁,获取状态等一些和下位机交互的命令 |
RES | Response | 命令回复:肯定回答 |
ERR | Error | 命令回复:否定回答 |
EV | Event | 事件,指下位机发生某事件时通知上位机 |
SERV | Service | 服务,指下位机在某些情况下,需要上位机执行一些动作,可理解为请求上位机服务。 |
DAQ | Data AcQuisition | 下位机发送周期性测量数据给上位机 |
STIM | Stimulation | 可以理解为一种上位机向下位机大量发数据的一种方式,相当于反向的DAQ;用于数据标定时,上位机向下位机修改参数 |
DBG | Debugging | 对从机进行调试 |
PGM | Programming | 将新程序或数据状态刷写到控制单元中 |
CAL | Calibration | 更改参数或切换校准页面 |
XCP的数据帧分为两类:CTO(Command Transfer Object)与DTO(Data Transfer Object),顾名思义,CTO数据帧传输命令,DTO数据帧传输数据。
上述通讯模型中,如果按照数据的流动方向划分:
由Master向Slave传输的数据包的形式有CMD和STIM,这里的CMD即为CTO,STIM即为DTO;
由Slave向Master传输的数据包的形式有RES,ERR,EV,SERV和DAQ,同理,这里的RES,ERR,EV,SERV即CTO,DAQ即DTO。(关于DAQ与STIM暂时可以只当做传输批量数据的一种形式,只是方向相反:DAQ是从机主动向主机发送数据,STIM是主机向从机发送模拟数据)
3.3 测量与标定
- ASAM MCD 1MC : ECU与标定测量系统接口;
- ASAM MCD 2MC : 即A2L文件,是控制器内部信息描述文件规范;
- ASAM MCD 3MC : 此接口用于自动化标定工具与上位机中的标定测量系统通信;
首先,在ECU中安装XCP驱动程序,生成一个A2L文件(A2L文件对ECU的相关信息做了描述,包含前期阶段识别出来的待标定量与测量量的地址和长度,相当于ECU的数据库文件),然后将这个生成的A2L文件导入上位机,装有XCP驱动程序的标定工具按照一定格式对这个文件进行解析,最后与ECU建立通讯,便可实时进行测量和标定。
四、XCP报文解析
4.1 数据包报文格式
上图是一个完整的XCP数据帧的格式,包含帧头(Header)、帧尾(Tail)和XCP数据包三部分。其中帧头(Header)、帧尾(Tail)依赖不同的传输层协议,传输时,XCP帧支持的传输层可将这三个帧元素映射到相应的传输帧格式。所以真正要关心的是XCP数据包部分:
XCP数据包由一个标识域(Identification)、一个可选的计数器域(Counter Field)、可选的时间戳域(Timestamp Field)和一个数据域(Data Field)组成。
PID: 交换数据包时,主设备和从设备都必须能够识别对方发送的信息。这个过程是在标识字段的帮助下完成的。因此,每个数据包都以数据包标识符(PID)开始。从主设备到从设备的命令使用从0xC0到0xFF的PID。XCP从设备用0xFC到0xFF的PID响应或通知主设备。这意味着在每种情况下都有一个唯一的PID分配给发送的CTO。
TIMESTAMP: DTO报文提供时间戳。BYTE、WORD和DWORD可用作时间戳的数据类型。CTO数据包是在没有时间戳的情况下发送的。在通过DAQ传输测量数据的情况下,XCP从机将测量时间写入时间戳字段。由于DAQ列表中的所有测量变量都是同时获取的,因此每个DAQ周期只传输一次时间戳。
DATA: 实际数据在数据字段中传输。在CTO数据包的情况下,数据字段由不同命令的特定参数组成。DTO数据包包含来自从设备的测量值,在发送STIM数据的情况下,包含来自主设备的值。
下面进行详细说明。
4.1.1 PID标识域
传输数据包时,主节点和从节点都必须能够识别对方发送的信息。这个过程是在PID的帮助下完成的。因此,每个数据包都以数据包标识符(PID)开始。
在3.2章节中曾说:数据包有CTO和DTO之分,而由Master向Slave传输的数据包的形式有CMD和STIM,这里的CMD即为CTO,STIM即为DTO;由Slave向Master传输的数据包的形式有RES,ERR,EV,SERV和DAQ,同理,这里的RES,ERR,EV,SERV即为CTO,DAQ即为DTO。
对应的PID为:
4.1.2 计数器域
DTO包可以选择性地包含计数器字段。如果存在,计数器字段直接位于标识字段之后,并且具有BYTE大小。如果在传输DAQ数据包时使用计数器字段,则XCP从设备在DAQlist的第一个ODT数据包中插入计数器。插入的计数器是为此DAQlist配置的事件的属性。
4.1.3 时间戳域
DTO包可以选择性地包含计数器字段。在通过DAQ传输测量数据的情况下,从机将测量时间写入时间戳字段。由于DAQlist中的所有测量变量都是同时获取的,因此每个DAQ周期只传输一次时间戳。在从主设备到从设备的STIM数据传输过程中,XCP主设备向时间戳字段写入一个值。
4.1.4 数据域
实际数据在数据字段中传输。在CTO数据包的情况下,数据字段由不同命令的特定参数组成。DTO分组包含来自从设备的测量值,并且在发送STIM数据的情况下包含来自主设备的值。
4.2 CTO 与 DTO报文
4.2.1 CTO包
主节点通过CMD向从节点发送一个通用请求。PID字段包含命令的标识号。附加的特定参数在数据字段中传输。然后,主节点等待来自从节点的响应(RES或ERR)。XCP在其实现中具有很强的可扩展性,因此并非每个命令都必须实现。在A2L文件中,在所谓的XCP IF_DATA中列出了可用的CMD。如果A2L文件中的定义与从节点中的实现之间存在差异,则主节点可以从从节点的反应中识别出从节点不支持该命令。如果主节点发送的命令尚未在从设备中实现,则从节点必须使用ERR_CMD_UNKNOWN进行确认,并且在从节点中不会触发进一步的活动。
4.2.2 DTO包
DTO可用于DAQ和STIM。
通过DAQ,数据与内部事件同步地从从设备发送到主设备。此通信分为两个阶段:在初始化阶段,主设备通知从设备在不同的事件中应该发送哪些数据。在该阶段之后,主设备触发从设备处的测量,并且测量阶段开始。从这一点开始,从设备向主设备发送所需的数据,主设备只“监听”,直到向从设备发送“测量停止”。测量数据采集和发送的触发通过控制单元中的事件来完成。
通过STIM,主设备向从设备发送数据。此通信还包括两个阶段:在初始化阶段,主设备告诉从设备将向从设备发送哪些数据。在该阶段之后,主设备将数据发送到从设备,STIM处理器存储数据。一旦在从设备中触发相应的STIM事件,数据就会传输到应用程序的内存中。
4.2.3 常见命令
4.2.3.1 标准命令
4.2.3.2 标定命令
4.2.3.3 页切换命令
4.2.3.4 周期性数据交换命令
基础命令:
静态配置:
动态配置:
4.2.3.5 FLASH编程命令
4.2.3.6 时钟同步命令
4.2.3.7 ASAM连接标准命令
标准中描述了可选命令:ASAM AE MCD-1 XCP AS SW-DBG-over-XCP and ASAM AE MCD-1 POD BS
4.3 数据传输方式
4.3.1 标准传输模式
在标准通信模型中,对从机的每个请求都有一个响应(一问一答)。主设备发送一个请求,并在发送另一个命令之前等待从设备的响应。
4.3.2 Master块传输模式
主设备可以连续向从设备发送多个命令,而无需等待从设备对每个命令的单独响应。块传输模式是可选的,可以加快大数据传输的进程。但是,必须考虑该模式在从机方向上的性能。这包括两个命令之间的最小时间间隔MIN_ST和没有响应MAX_BS的最大命令数。可选地,这些通信设置可以由主设备通过GET_COMM_MODE_INFO从从节点读出。
比如使用download命令传输大数据给ECU,就会用到这种模式。
4.3.3 Slave块传输模式
比如Upload指令,获取ECu内部的数据状态;一般指定download完之后,会紧跟着一个upload检查是否写进了目标ram地址。
4.3.4 交错传输模式
在标准通信中,主设备和从设备相互等待。交织通信模式可用于加速数据传输。在这里,主机可以连续发送几个请求。它必须考虑从端接收缓冲区的大小。从设备可以连续向主设备发送多个响应。从方不必考虑主方的任何限制。交织模式不得与块模式同时使用。该模式是可选的,并且与块传输模式相比没有实际意义。
交错模式也是出于性能原因而提供的,在典型通讯模式中,主机在收到上一条指令的回复前不会发送下一条指令,为提高通讯的效率,交错通讯模型可以不等待回复直接再发送下一条指令。它在实践中没有相关性。比较少见。
五、测量与标定
5.1 测量
参数测量本质上是作为主设备对从设备的请求而实现的:“读取存储位置0x1234的值”。按测量方式可分为异步测量与同步测量。
5.1.1 Poling模式
轮询,即Poling模式,最简单的测量方法,它不是基于DTO,而是基于CTO。对需要采集的变量进行挨个轮询。对于要通过轮询测量的每个值,必须传输两个帧:从主设备到从设备的请求和从设备到主设备的响应。这就可能造成总线的负载率。
主节点可以使用SHORT_UPLOAD命令从从节点请求测量参数的值。这称为轮询。这是最简单的测量情况:在已接收并执行SHORT_UPLOAD命令时发送测量参数的测量值。
异步测量是使用主节点发送的命令,通过指定的XCP地址来提取从节点的ECU内部的数据,并通过从节点的应答将该数据传送给主节点,如此循环往复来实现的。
为了取出数据,使用PID为“0xF4”的命令“SHORT_UPLOAD”。这个命令和应答的格式如下所述。
5.1.1.1 SHORT_UPLOAD命令
0字节 指定为PID“0xF4”
1字节 指定为取出字节数。最大为MAX_CTO -1字节
2字节 保留字段
3字节 指定为要读出的8位扩展地址
4-7字节 指定为要读出的32位地址
5.1.1.2 SHORT_UPLOAD应答
0字节,指定为PID“0xFF”
1~MAX_CTO字节位置,指定为取出的数据。
5.1.1.3 Poling模式缺点
- 此模式基于CTO,也就意味着Poling模式下的时间戳机制不能使用,也就意味着无法获悉数据实际上是哪一时刻的数据;
- 一问一答,包含2条报文(上位机请求和Slave响应),影响总线负载率;
- 异步测量,无法保证数据的相关性(标定过程中,标定人员其实更关心数据的相关性,简单来说就是X变了之后,Y会怎么变,而不是只关心某个具体值会怎么变化,但是Polling模式是异步测量,使用这种模式,标定人员根本无法获知X变了之后,Y是在哪个计算周期内变的,这种变化是不是X引起的);
举例:
while(true){x = computX(...);...//假如在这个时刻收到了polling的CTO数据包:请给我X的值...//随后,又在这个时刻收到了polling的CTO数据包:请给我Y的值y = computY(X,...);//y的计算依赖于X...
}
//由于取Y的时候,Y的计算周期实际上并没有走完,因此给的值实际上是上一次Y的值,但是这个时刻的X值已经是最新的X,这就造成了这一时刻的X和Y实际上是没有任何关联性的!
5.1.2 DAQ模式
为了使测量与ECU的控制相匹配,有必要由ECU确定测量时机,并在数据取出来后由从节点主动发送到主节点。这是DAQ模式的核心思想,这种数据通信方式是基于DTO来完成的。
主节点在进行同步测量之前,通过命令指定要取出的数据的地址,从节点在等到同步测量开始命令后,使用DTO发送到主节点。因此,在同步测量的情况下,不是通过命令和应答的组合,而是通过测量周期或事件,由从节点发送DTO报文到主节点。
DAQ模式解决了Poling的两个问题:
-
通过将测量值与控制单元中的事件相关联来实现测量数据的相关性。这个测量值仅在事件发生时记录和传输。这样可以确保所有数据相互匹配。
-
为了减少总线负载,测量过程分为两个阶段:
-
在配置阶段,主设备通知从设备它感兴趣的值;
-
在第二阶段,只将从设备的测量数据传输到主设备。在传输期间,测量数据被尽可能紧凑地汇总在分组中。
-
举例:
while(true){x = computX(...);......y = computY(X,...);//y的计算依赖于X...event(COMPUTER_OVER);//这里通过设置event driver,让原先的主机主动获取值,变成了现在的从机在计算周期结束之后主动上报值,从而确保这一时刻的所有待测量基于同一计算周期,具备数据相关性。
}
那么问题又来了:从机是怎么知道主机将来都要测量哪些变量的?
答案:只需事先让ECU的event与待测参数之间产生关联,为某个event配置DAQList。
1个Event --> 1个daqList --> n个ODT --> n条数据帧
具有三个ODT的DAQList
ODT:同步数据传输对象与从机内存之间的映射关系(Object Descriptor Table)
DAQList: 位于从机的数据元素通过数据传输对象,传输到主机,决定了在一个同步测量的周期或者事件触发时要测量的内存数量。
1个Event对应1个DAQList,一个DAQList包括多个ODT,一个ODT里可以包括多个变量。
5.1.2.1 ODT映射过程
让我们从控制器中的存储器结构的视角,侧面来看这个问题:用户已经选择了某些值并想要测量它们。为了不必使用完整的帧来发送信号值,从机将尽可能多的值打包到一个帧中。但从机不会自己创建组成的定义,否则主机在接收帧时将无法解释这些数据。因此,主设备向从设备发送如何将值分配到帧的指令。
该分配是通过所谓的对象描述表(ODT)进行的。为了明确地识别测量变量,地址和对象长度非常重要。因此,用ODT接收从机到总线上的帧结构的RAM内容的分配。根据通信模型,传输时作为DAQ DTO(数据传输对象)来完成。
将RAM地址分配给ODT
更准确地说,ODT列表中的条目通过对象的地址和长度引用RAM中的存储区域。
在接收到测量开始命令之后,在与测量相关联的某个点处到达事件。从节点记录这些值,并通过总线进行传输。主机从总线上读取信息。由于它定义了将值分配给数据包本身,因此数据的解释很简单。
数据包中可传输的最大有效载荷字节数取决于传输协议。在CAN的情况下,这是七个字节。如果要测量更多的数据,一个ODT是不够的。如果测量数据的传输必须使用两个或多个ODT,则从设备必须将数据复制到正确的ODT中,并且主设备必须能够唯一地识别接收到的ODT。如果使用控制单元的多个event,ODT和event之间的连接也必须是可明确分配的。
例如,如果用户使用两个event,也会使用两个DAQList。每个使用的event都需要一个DAQlist。每个DAQlist都包含与ODT有关的条目,每个ODT都包含对RAM单元中值的引用。
可选地,存在从节点也传输时间戳信息的可能性。DAQList表示属于特定事件的值。当这些值被记录在从设备中时,ECU的有效时间值被记录,并在第一个ODT内传输。此DAQ列表的其他ODT不包含时间戳。时间戳是以递增计数器的形式实现的。该值以固定的时间间隔递增。执行递增的时间间隔被存储在A2L中。
带有时间戳的1-10号信号传输
DAQlist有三种不同形式:预定义、静态以及动态。
5.1.2.2 预定义DAQList
主机一次性配置好所有要读取的变量,并关联ECU端的不同事件channel,一旦ECU对应的事件发生(例如每隔100ms),主动上传数据给主机。
5.1.2.3 静态DAQList
如果DAQList和ODT是在ECU中永久定义的,则称为静态DAQ列表。
这里没有定义ODT列表中有哪些测量变量。静态DAQ列表定义了可以填充的帧(与此相反,如果事先定义了有哪些测量变量,则为预定义的DAQlist)。
对于静态DAQlist,定义在ECU代码中,并在A2L中描述。下图是A2L的一部分,其中定义了静态DAQ清单:
在上图中,有一个数字为0的DAQ列表,它与10ms event相关联,最多可以携带五个ODT。编号为1的DAQ列表有三个ODT,并且与1ms event相关联。
随着应用程序加载到ECU中,在配置静态DAQList的情况下,DAQList和其中包含的相应ODT数量是固定的。如果用户现在试图用一个event测量比分配的DAQList更多的信号,则ECU中的从节点将无法满足要求,配置尝试将因错误而中止,但此时另一个DAQList仍然可用。
5.1.2.4 动态DAQList
静态DAQ测量中通过增加DAQList中的ODT的数量,可以增加待测量量的数量。而且通过维持与要测量的事件通道数量一样多的DAQList,可以对ECU的所有测量时机进行测量。
但是这些数量的增加会增大ECU中的管理缓冲区,因此会消耗ECU的内存,而且如果ECU具有10ms和20ms的控制周期,有场景下10ms的控制周期中测量的测量点的数量很大,有场景下20ms的控制周期中测量的测量点的数量也很大,即根据测量的场景不同,测量点的数量需求会有不同。对于这样的应用程序,有一种称为“动态DAQ”的功能,可以允许从节点动态更改每次测量的DAQList、ODT和ODT条目的数量。相反的,如果在集成XCP驱动程序时,这些数量是预先确定的,则称为“静态DAQ”。
即同样ECU内存情况下,可以通过减少10ms的DAQ来增加20ms的DAQ数量,在总的内存范围中动态调整。
5.1.2.5 动态DAQ配置过程
动态DAQ列表配置使用FREE_DAQ、ALLOC_DAQ、ALLOC_ODT和ALLOC_ODT_ENTRY命令完成。这些命令允许在上述限制范围内动态分配多个DAQList、多个ODT到DAQList以及多个ODT list到ODT。如果没有足够的内存来分配请求的对象,这些命令会得到一个ERR_MEMORY_溢出作为负响应。如果发生错误内存溢出,则完整的DAQ列表配置无效。
在动态DAQList配置序列开始时,主机首先必须发送一个FREE_DAQ。其次,对于ALLOC_DAQ,主机必须分配可配置DAQ列表的数量。然后,主机必须使用ALLOC_ODT命令将所有ODT分配给所有DAQ列表。最后,主机必须使用ALLOC_ODT_ENTRY命令将所有ODT条目分配给所有DAQ列表的所有ODT。
配置测量变量后,用户开始测量。XCP主控器在所谓的DAQ列表中总结所需的测量变量。测量信号被分配给选定的事件。该配置信息在实际开始测量之前被发送到从设备。然后,从设备知道它应该读取哪些地址,并在到达哪个事件时进行传输。即DAQ模式将测量划分为配置和测量阶段。这解决了轮询过程中出现的两个问题:由于主机在测量过程中不再需要单独请求每个值,因此带宽的优化使用,以及测量数据的相关性。
5.2 激励与旁路(STIM && By Passing)
5.2.1 STIM
STIM(Stimulus)是指一种用于发送信号或模拟输入到电子控制单元(ECU)的功能。
STIM允许开发人员模拟不同的输入条件,以测试和评估ECU的响应。通过发送特定的信号或值到ECU,可以模拟各种工作条件,例如传感器数据、用户输入或环境变化。这样,开发人员可以验证ECU在不同输入条件下的行为和性能。
举例来说,假设我们正在开发一款车辆的引擎控制系统,并需要测试不同的驾驶场景对引擎性能的影响。使用STIM功能,我们可以模拟不同的驾驶情况,如高速行驶、加速、急刹车等。通过发送相应的信号值到引擎控制系统,我们可以观察ECU如何调整燃油喷射、点火时机等参数来适应不同的驾驶需求。
另一个例子是在汽车安全系统的开发过程中,可以使用STIM来模拟各种传感器数据,如雷达、摄像头或激光扫描仪。通过发送模拟的传感器输入到ECU,可以评估安全系统在各种道路和交通条件下的响应和决策能力。
STIM功能提供了一种灵活的方式,使开发人员能够模拟各种输入条件,以测试和验证ECU的性能、稳定性和适应性。它在开发、优化和调试汽车电子系统中起着重要的作用,帮助确保车辆在不同工作条件下的可靠性和安全性。
5.2.2 By Passing
By Passing,即旁路,通过DAQ与STIM实现的一种“快速原型设计”解决方案。例如在一个系统中,如果我们在标定时期需要摒弃现有的算法,验证另外一套算法的实际工作表现,就可以利用旁路功能:
看起来也很形象,在计算开始前,ECU将输入数据通过DAQ模式传输给主机,由主机中实现设置好的另一套算法计算,并将输出结果通过STIM模式发送给从机,“绕”过了原有算法实现了“旁路”,从而达到快速验证的目的。
5.3 标定
对从机的参数标定(写访问)可简单理解为:“将地址0x1234的值设置为5”。
在理解标定之前需要对参考页、工作页与激活页有所了解:
参考页(Reference Page):可以理解为定义的逻辑地址对应Flash上的一块地址,参考页的属性在标定过程可读不可写;
工作页(Working Page):可以理解为定义的逻辑地址对应RAM上的一块地址,工作页的属性是可读可写。
激活页(Activiting Page):就是指选择激活的一个页,比如激活工作页或者激活参考页等。
标定过程:激活参考页(仅可读),读取当前的参数,比如PID中的比例因子 P,然后切换激活页,激活工作页(可读可写),可以在工作页在线修改参数,来获得较好标定值,最后,需要将优化后的P参数写入到原来参考页上,这样就完成了一个参数的标定。
5.4 地址映射
5.4.1 硬件方式(Overlay)
有些芯片是支持硬件地址映射的,比如英飞凌TC系列,其工作方式比较简单,就是在切换激活的工作页时,通过操作寄存器完成地址映射。
如当寄存器Reg1 = 0时,激活页是参考页,逻辑地址0x000~0x200 对应的Flash中的0x1000x300;切换激活页为工作页时,寄存器Reg1=1,对应逻辑地址0x0000x200对应Ram中的0x000~0x200;
5.4.2 软件方式(Offset偏移)
通过加入一个offset偏移量来实现,还是以上面的例子为例:
激活页->参考页 逻辑地址 0x000~0x200 -> Offset=0x100 Flash地址0x100~0x300 =(逻辑地址+Offset)
激活页->工作页 逻辑地址 0x000~0x200 -> Offset=0x000 Flash地址0x000~0x200 =(逻辑地址+Offset)
5.5 A2L文件
【参考资料:】https://blog.csdn.net/sinat_40003796/article/details/126426704
5.5.1 A2L文件概述
A2L文件是基于ASAP2标准,采用ASAP2指定的一套类XML语言的描述性语言(采用开标签和关标签来描述信息)书写,描述ECU的通信等相关的参数,以及标定,观测变量的地址以及物理值计算公式等等的文本格式文件。它用来指导上位机和ECU的通讯交互过程,让他们对交互的信息有一致的认识,从而是上位机工具准确且友好的将ECU中的信息展现给用户。
5.5.2 A2L文件结构
/begin PROJECT /*表示一整个项目,一个文件一个项目*//begin HEADER /*描述项目信息,包括项目编号,项目版本等信息*/ /end HEADER/begin MODLUE/*描述ECU需要的所有信息,一个ECU对应一个MODULE块*//begin A2ML/*描述接口数据格式,包括传输命令,DAQ及传输层的定义*//end A2ML /begin MOD_PAR /*管理ECU的数据,CPU 客户 编号等等,最重要的是内存的分段分页管理,类似DSP中的CMD文件*//end MOD_PAR /begin MOD_COMMON/*一般性描述信息,比如数据的对齐方式*//end MOD_COMMON/begin IF_DATA/*接口数据具体的参数*//end IF_DATA/begin FUNCTION/*【非必须】FUNCTION这个在Vcetor提供的SIP包中会对XcpAppl的版本进行引用*//end FUNCTION/begin CHARACTERISTIC/*定义标定变量,包含被标定的变量的名字,地址,长度,计算公式,精度,最大最小值等信息*//end CHARACTERISTIC /*可定义多个*//begin AXIS_PTS /*该块用来定义数组或查表变量对应的轴的类型,它将被标定变量【二维表(CURVE)、三维图(MAP)】等块来引用,一个ECU里边可以有很多种不同的轴类型,用于实现查表和插值*//end AXIS_PTS/begin MEASUREMENT/*定义测量变量,包含了被测量的变量的名字,地址,长度,计算公式,精度(分辨率Resolution和准确度Accuracy),最大最小值等信息*//end MEASUREMENT/*可定义多个*//begin COMPU_METHOD/*定义计算公式,及原始值和物理值之前的转换关系 如phy = ax+b*//end COMPU_METHOD/begin COMPU_VTAB /*定义原始值和物理值的映射关系 一般是枚举变量*//end COMPU_VTAB/begin RECORD_LAYOUT/*定义标定变量的物理存储结构(一维,二维表,三维图等)*//end RECORD_LAYOUT/begin MERGED UNIT /*【非必须】MERGED UNIT部分会对单位进行定义,如将“Seconds”定义为“s”等*//end MERGED UNIT /end MODLUE/end PROJECT
PROJECT:一个A2L文件只能有一个PROJECT,而PROJECT中至少要有一个Module,A2L文件的注释和C语言的注释方式是一样的,支持 /* 和 // 两种方式。
HEADER:该块里边包含了项目信息,包括项目编号,项目版本等信息
MODULE:该块里边包含了在标定测量层面来描述ECU需要的所有信息,一个ECU对应一个MODULE块,MODULE由许多子块来组成
MOD_PAR:这个块里包含了用于管理ECU的数据,例如客户名,编号,CPU类型,ECU的内存分配等,其中最重要的就是ECU的内存分配,开发人员需要根据ECU内存分段情况定义MEMORY SEGMENT和SEGMENT里边的PAGE,这里的SEGMENT/PAGE的概念和在线标定中的概念是一致的,一个MODULE里边只能出现一次。
MOD_COMMON:该块用来指定ECU的一些标准的一般性描述信息,比如大小端,数据的对齐方式,FLOAT变量的处理方式等,一个MODULE里也只能出现一次。
RECORD_LAYOUT:内存布局,描述数据的存放方式(单个变量,二维表,三维表等)。
CHARACTERISTIC:该块用来定义标定变量,里边包含了可以被标定的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以出现很多次这样的块,也就是说一个ECU可以有很多的标定变量。
/begin CHARACTERISTIC/* Name */ unique identifier/* Long Identifier */ "comment, description"/* Type */ 见A2L文件预定义类型[Type类型]/* Memory Address */ 内存地址/* Record Layout */ 见RECORD_LAYOUT/* Maximum Difference */ table value最大浮动/* Conversion Method */ 见COMPU_METHOD/* Lower Limit */ table values范围/* Upper Limit */ table values范围
/end CHARACTERISTIC
MEASUREMENT:该块用来定义测量变量,里边包含了可以被测量的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以出现很多次这样的块,也就是说一个ECU可以有很多的测量变量。
/begin MEASUREMENT/* Name */ unique identifier/* Long Identifier */ "comment, description"/* Data Type */ 见A2L文件预定义类型[datatype类型]/* Conversion Method */ 见COMPU_METHOD/* Resolution */ smallest possible change in bits/* Accuracy */ possible variation from exact value in %/* Lower Limit */ table values范围/* Upper Limit */ table values范围ECU_ADDRESS Addess in the memory
/end MEASUREMENT
COMPU_METHOD:该块用于定义计算公式,及原始值和物理值之前的转换关系,这些公式可以被标定变量和测量变量来引用,从而将原始值转换成便于用户阅读和使用的物理值。具体有6种转换方法。
/begin COMPU_METHOD/* Name */ unique identifier/* Long Identifier */ "comment, description"/* ConversionType */ 见A2L文件预定义类型[ConversionType类型]/* Format */ "%[总长].[小数点位数]"/* Unit */ "物理单位"/* Lower Limit */ table values范围/* Upper Limit */ table values范围COMPU_TAB_REF 见COMPU_VTAB /*ConversionType选择TAB_VERB时需要*/COEFFS a b c d e f /*ConversionType选择RAT_FUNC时需要*/
/end COMPU_METHOD
COMPU_VTAB:该块用来定义原始值和物理值的映射关系,是一种特殊的转换关系,它一般应用于枚举变量。
/begin COMPU_VTAB/* Name */ VTAB_FOR_COMPU_METHOD_0/* Long Identifier */ "comment, description"/* Conversion Type */ 只能选择TAB_VERB/* Num of Elements */ number of value pairs/* Table Element */ float "string"
/end COMPU_VTAB
FUNCTION:这个块不是必须。
GROUPS:该块是把标定变量和测量变量按照一定的逻辑(比如功能模块)组织起来,在上位机中形成一个下拉菜单,使得用于可以从中选择变量,这块是可选的。
5.5.3 A2L预定义类型
六、标定数据怎么保存
整个标定过程持续时间可能很长,而进行标定时程序是运行于RAM中的,下电之后所有的数据就消失了,那么,如何永久保存更改后的参数化呢?基本上有两种选择:
6.1 将参数保存在ECU中
当控制单元关闭时,RAM中改变的数据可以自动地或由用户手动地保存在ECU中的EEPROM中。前提条件是数据可以存储在从节点的非易失性存储器中。在ECU的情况下,这通常是EEPROM或Flash。然而,具有数千个参数的ECU很少有这么多未使用的EEPROM内存空间,因此很少使用此过程。
另一种可能性是将RAM大小写回到控制单元的闪存中。这个过程相对复杂。闪存必须先擦除,然后才能重写。这反过来只能一块一块地完成。因此,不可能写回单个字节。
6.2 将参数以文件的形式保存在计算机上
更常见的是将参数存储在计算机上。所有参数都以文件的形式存储。数据在标定完成之后可以保存到上位机中,保存成一个parameter set file,这样在下次标定之前,通过这个文件将上次标定的最终结果通过DOWNLOAD命令重新刷回RAM中。
参考文献
[1]. XCP_ReferenceBook_V3.0_EN.pdf
[2].ASAM MCD-1 XCP v 1.1
[3].【XCP学习】CCP/XCP标定协议解析
[4].如何使用CANape实现XCP/CCP“Measurement测量”和“Calibration标定”变量
[5].XCP协议-协议篇
[6].A2L文件内容详细解析
[7].基于can总线的A2L文件解析(1)
[8].XCP协议-命令代码篇
[9].面向初学者的XCP——XCP协议的通信的构造和功能
[10].【XCP学习】测量/校准协议XCP入门-1
[11].【XCP学习】XCP协议的通信的构造和功能-2
[12].【XCP学习】XCP的趋势和应用实例-3