汽车标定技术--XCP协议如何支持测量功能
01
—
概述
其中关于DTO分为两种:
Slave(ECU)传输给Master(标定上位机)的数据帧:DAQ(Data AcQuisition)
Master传输给Slave的数据帧:STIM(Stimulation)
其数据流如下图所示:
关于DAQ这个比较容易理解,实际上,做过标定的同学下面红框两个动作都非常熟悉:
左边表示与ECU建立连接,右边闪电表示master通知ECU:请开始上传我想要的数据吧!
数据开始传输后,ECU不需要得到Master的响应,可以按照预定义的周期一直发送数据,直到Master关闭闪电:ECU,你不要再传数据了,我不想看了。
至于STIM的功能使用则需要看你处于汽车开发的哪个阶段。一般来说,标定测量会贯穿整个汽车ECU的开发,因此在不同阶段有可能是不同工程师进行标定,台架或者仿真的同学如果家里有条件可能会用到STIM,但常年跑三高的同学就不怎么使用STIM,因为直接上车干了。
那么STIM到底是干什么的?我们留在第下一节进行描述。
02
—
测量方式 -- Poll
03
—
测量方式 -- DAQ
我们首先以一个数据流来具象地体会一下DAQ这种方式,如下图:
那么我们具体来看一下DAQ是如何实现的。
3.1 ODT概念模型
在我们讨论DAQ之前,我们先思考一个问题。
以XCP on CAN为例,如果我们想用DAQ的方式进行数据的测量,那么肯定希望Slave传递尽可能多的数据,比方说一帧标准CAN 报文,数据域8个字节,我恨不得这八个字节全是需要的数据,这样就在最有限的资源下干最多的事情。但实际情况,这是不可能的,假设现在有20个1 byte的观测量要以10ms的周期进行测量,这时候至少需要slave发送3帧报文,如果全是都是数据,master是如何知道哪一帧报文对应哪些数据呢?基于这种情况,XCP就规定DTO帧至少有一个字节是用来表示身份,如下:
Element:观测量的具体值,存放在RAM中
ODT:Object Description Table,一个表格,用于存放ODT Entry
ODT Entry:我习惯说成ODT 条目,描述了Element的具体RAM地址和数据长度
这个时候,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可以容纳3个ODT 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
动态配置流程
1)释放DAQ(D6):
清除之前配置好的DAQ列表、ODT和ODT_Entry等,完成之后在这里会将DAQ配置状态置为FREE2) 分配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指针,往该地址里写相应的测量量的数据;如下
04
—
小结
本篇内容,我们简单把DAQ的基本概念和实现方式做了初步梳理,大家要注意理解DAQ动态分配的数据流,接下来我们讲STIM\Bypassing,以及不同传输协议对应的帧结构区别
往期回顾:
CP AUTOSAR:
汽车网络安全:
汽车标定: