XCP 标定-DAQ原理及报文解析

DAQ测量模式报文分析

什么是DAQ测量:

DAQ 是标定协议中一种高效的数据上传模式。它只需要进行一次DAQ配置后就可以脱离主节点自主的按照周期向主设备上传数据。
直接举例说明DAQ是怎么分配的
如果我们需从ECU中按照3个不同的周期上传数据就需要分配3个DAQ列表分别是DAQ List#1=10ms,DAQ List#2=50ms,DAQ List#3=100ms,DAQ List#0中有n个ODT列表,这些列表里存放的是具体要上传的变量的信息,里面包含变量的地址和长度,每个ODT可以最多存放7个单字节变量的信息,意思就是如果是Word类型的变量占两个字节的话一个ODT中只能存放3个变量的信息,为了保持数据的完整性,当然剩余一个字节的空间要看标定工具的处理方法,有的工具就让它空着,有的工具会进行分割或寻找一个单字节的变量进行组合,前提是同周期测量变量组中有这么一个变量。
每个ODT对应的就是一条ECU返回的DAQ 数据信息了,它会转成DTO的形式进行发送,每个ODT都有一个唯一的绝对编号来对应一个DTO,通过PID号标识。如果DAQ List#1有2个ODT,那这三个ODT的绝对编号为继DAQ list #0 的三个ODT 编号的PID=4,PID=5。
DAQ通讯前,主节点需要对DAQ列表及ODT列表进行配置具体通过这几个指令完成:FREE_DAQ(0xD6)、ALLOC_DAQ(0xD5)、ALLOC_ODT(0xD4)和ALLOC_ODT_ENTRY(0xD3)。

FREE_DAQ(0xD6):清除所有的DAQ列表,释放所有动态分配的DAQ列表。
ALLOC_DAQ(0xD5):获取ECU内要实现的DAQ列表数目,根据数据上传的周期决定。
ALLOC_ODT(0xD4):将ODT分配到DAQ列表中。
ALLOC_ODT_ENTRY(0xD3):该命令分配若干ODT到ODT表项,将它们分配给具体的DAQ列表中指定的ODT表项。
SET_DAQ_PTR(0xE2:):设置DAQ指针为后续读写DAQ作准备。
WRITE_DA

### 基于 RH850 的 XCP 标定代码示例 对于基于 RH850 芯片的 XCP (Universal Measurement and Calibration Protocol) 实现,通常涉及多个组件之间的交互。RH850 是瑞萨电子推出的一款高性能微控制器系列,广泛应用于汽车控制系统中。 #### 初始化配置 为了使 XCP 协议栈正常工作,在初始化阶段需设置通信参数以及内存映射关系: ```c #include "Xcp.h" void Init_Xcp(void){ /* 配置传输层参数 */ Xcp_ConfigType config; config.MaxCto = 8; // 设置最大CTO长度 config.MaxDto = 64; // 设置最大DTO长度 config.ProtocolLayerRef = &CanIf_PduInfo; // 绑定底层协议 /* 注册回调函数指针 */ Xcp_SetCallback(&config, OnConnect, OnDisconnect); /* 启动服务 */ Xcp_Init(&config); } ``` 此部分定义了 XCP 所需的基础属性并注册连接状态变化通知接口[^1]。 #### 数据交换处理逻辑 当接收到上位机发送来的请求帧时,通过解析命令字节来决定具体操作行为: ```c uint8_t ProcessRequest(uint8_t* reqDataPtr,uint16_t length){ uint8_t resCode=ERR_CMD_UNKNOWN; switch(reqDataPtr[0]){ case CMD_GET_COMM_MODE_INFO: GetCommModeInfo(); break; case CMD_SET_DAQ_PTR: SetDaqPointer((DAQ_addr_type*)&reqDataPtr[1]); break; default : ;//未知指令默认不做任何动作 } return resCode; } ``` 上述片段展示了如何依据不同类型的控制报文执行相应的业务流程[^2]。 #### 测量变量读取写入支持 针对特定测量点的数据访问功能是标定工具的重要特性之一。下面给出了一种简易方式用于获取内部寄存器值或修改其设定: ```c typedef struct{ volatile float *paramAddr; }ParamDescrType; static ParamDescrType paramTable[]={&VarA,&VarB,...}; float ReadParameter(uint16_t index){ if(index<sizeof(paramTable)/sizeof(*paramTable)){ return *(paramTable[index].paramAddr); }else{return NAN;} } void WriteParameter(uint16_t index,float newValue){ if(index<sizeof(paramTable)/sizeof(*paramTable)){ *(paramTable[index].paramAddr)=newValue; } } ``` 这里采用数组形式管理待测对象列表,并提供索引查找机制方便外部调用者定位目标位置[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值