4. 诊断配置与数据库
在基于CANoe的UDS诊断测试中,诊断配置与数据库的搭建是整个测试工程的地基。如果数据库文件(DBC/CDD)与ECU实际诊断规范不一致,后续所有测试脚本、仿真节点和结果分析都将失去准确性。本章将系统讲解从原始ECU诊断规范到CANoe可用的诊断数据库的完整转换链路,涵盖DBC文件创建、CDD诊断描述配置、诊断服务与参数定义,以及规范导入的标准化流程。
4.1 DBC文件创建:从网络拓扑到报文信号
核心原理:DBC(CAN Database)文件是CANoe中描述CAN网络通信层的核心数据库,它定义了网络节点、报文ID、报文周期、信号布局、字节序和值域等物理层信息。对于UDS诊断而言,DBC文件主要承载两类关键内容:一是诊断仪(Tester)与ECU之间的物理寻址/功能寻址报文(如0x7DF、0x7E0、0x7E8等),二是诊断请求/响应报文中数据场的长度和格式定义。DBC并不直接描述诊断服务的语义(如0x22读数据、0x2E写数据),但它为诊断数据的传输提供了底层通道。
操作流程:在CANoe中创建DBC文件通常使用内置的CANdb++工具,推荐按以下步骤执行:
- 新建数据库:打开CANdb++,选择File→New Database,设置网络类型为CAN,波特率按实际总线配置(如500kbps)。
- 定义节点:在Network Nodes中创建Tester和ECU节点,分别命名为“DiagTester”和“ECU_Demo”,并设置节点地址(如Tester=0xF1,ECU=0x10)。
- 创建报文:在Messages中新建诊断请求报文(如ID=0x7E0,DLC=8)和诊断响应报文(ID=0x7E8,DLC=8),同时创建功能寻址报文(ID=0x7DF)。
- 定义信号:为每个报文添加信号,例如将8字节数据场拆分为“Data[0]”至“Data[7]”共8个无符号整型信号,字节序选择Intel或Motorola格式(UDS通常使用Motorola大端格式)。
- 关联节点与报文:将请求报文关联到Tester节点的发送方向和ECU节点的接收方向,响应报文反之。
- 保存并编译:保存为.dbc文件,在CANoe的Simulation Setup中加载该DBC,确认无编译错误。
| 配置项 | 标准帧(11位ID) | 扩展帧(29位ID) | UDS诊断推荐 |
|---|---|---|---|
| 物理请求ID | 0x7E0 | 0x18DA10F1 | 按OEM规范选择 |
| 物理响应ID | 0x7E8 | 0x18DAF110 | 按OEM规范选择 |
| 功能请求ID | 0x7DF | 0x18DB33F1 | 按OEM规范选择 |
| DLC | 8字节 | 8字节 | 通常为8 |
| 字节序 | Intel/ Motorola | Motorola | UDS默认Motorola |
4.2 配置诊断描述(CDD):构建诊断语义层
核心原理:CDD(CANdela Diagnostic Description)是Vector公司推出的诊断描述文件格式,它完整描述了ECU的诊断能力,包括支持的诊断服务、子功能、DID(数据标识符)、DTC(故障码)、会话类型、安全等级、时序参数等。CDD文件是CANoe诊断测试的核心配置,它决定了诊断控制台(Diagnostic Console)和CAPL脚本能够调用哪些诊断服务,以及如何解析响应数据。与DBC相比,CDD更关注“诊断业务逻辑”而非“通信物理层”。
配置流程:在CANoe中配置CDD文件通常有两种方式:一是使用Vector CANdela Studio创建,二是直接导入OEM提供的CDD文件。若需手动创建,推荐以下步骤:
- 新建诊断描述:在CANoe的Diagnostics→Diagnostic Description中新建CDD,选择协议为UDS(ISO 14229)。
- 定义ECU信息:设置ECU名称、诊断协议版本、是否支持扩展寻址等基础属性。
- 配置诊断服务:在Services目录下添加UDS服务,如0x10(DiagnosticSessionControl)、0x22(ReadDataByIdentifier)、0x2E(WriteDataByIdentifier)、0x19(ReadDTCInformation)等。
- 定义子功能与参数:为每个服务添加子功能(如0x10服务的子功能01=默认会话、02=编程会话、03=扩展会话),并定义请求/响应中的参数格式(如DID值、数据长度、数据类型)。
- 配置DID与DTC:在Data Identifiers中定义DID编号(如0xF190表示VIN码),在DTCs中定义故障码(如0x123456表示发动机失火)。
- 设置时序参数:配置P2(服务器响应时间)和P2*(增强响应时间)的默认值,以及S3(会话超时时间)。
4.3 定义诊断服务与参数:从规范到可执行配置
核心原理:诊断服务与参数的定义是CDD配置中最核心的环节。UDS协议定义了服务ID(SID)、子功能、请求/响应格式,但具体每个服务支持哪些DID、DTC范围、数据格式,完全由ECU的诊断规范决定。在CANoe中,这些定义直接影响测试脚本的编写——CAPL脚本通过diagSetParameter()、diagGetParameter()等函数访问CDD中定义的参数,因此参数定义必须与ECU实际实现完全一致。
定义方法:以0x22服务(ReadDataByIdentifier)为例,在CDD中定义参数时需完成以下配置:
- 服务基本信息:设置SID=0x22,服务名称“ReadDataByIdentifier”,支持子功能抑制位(通常UDS服务不强制使用子功能)。
- 请求参数:定义DID参数为“Unsigned Short”类型(2字节),并设置允许的DID值范围(如0xF190~0xF1FF)。
- 响应参数:定义数据长度可变(1~255字节),数据类型根据DID动态变化。可在CDD中为每个DID单独定义响应格式。
- NRC处理:配置可能返回的负响应码(如0x11=服务不支持、0x12=子功能不支持、0x31=请求超出范围)。
// CAPL脚本中访问CDD参数的示例
DiagRequest ReadDataByIdentifier req;
char vin[18];
req.SetDID(0xF190); // 设置要读取的DID
diagSendRequest(req); // 发送诊断请求
// 等待响应后解析VIN码
if (diagGetLastResponseCode() == 0) {
diagGetParameter(req, "VIN", vin, 17);
write("VIN: %s", vin);
}
| 服务ID | 服务名称 | 关键参数 | 典型NRC |
|---|---|---|---|
| 0x10 | DiagnosticSessionControl | 子功能(01/02/03) | 0x12, 0x22 |
| 0x22 | ReadDataByIdentifier | DID(2字节) | 0x11, 0x31 |
| 0x2E | WriteDataByIdentifier | DID + 数据 | 0x13, 0x31 |
| 0x19 | ReadDTCInformation | 子功能 + DTC状态掩码 | 0x12, 0x31 |
| 0x27 | SecurityAccess | 子功能(01/02)+ 密钥 | 0x12, 0x35, 0x36 |
4.4 导入ECU诊断规范:自动化与校验
核心原理:实际项目中,OEM或Tier1供应商通常提供ODX(Open Diagnostic data eXchange)格式的诊断规范文件,或提供Excel/PDF格式的诊断参数表。手动在CDD中逐条录入效率低且易出错,因此CANoe支持直接导入ODX文件,或通过脚本将Excel参数表自动转换为CDD配置。导入过程不仅是数据搬运,还需要进行一致性校验,确保诊断服务、DID、DTC等定义与规范完全一致。
导入流程:
- ODX导入:在CANoe的Diagnostics→Import中直接选择ODX文件(.odx或.odx-c),CANoe会自动解析并生成CDD配置。导入后需检查诊断服务列表、DID定义、DTC分类是否完整。
- Excel导入:使用Vector提供的Diagnostic Parameter Importer工具,将Excel中的DID表、DTC表、服务表映射到CDD模板中。需提前定义Excel列与CDD属性的映射关系。
- 校验与验证:导入完成后,使用CANoe的Diagnostic Console手动发送几个典型服务(如0x10 01、0x22 0xF190),对比ECU实际响应与CDD定义是否一致。同时检查DTC状态位、快照数据等是否解析正确。
总结复盘:诊断配置与数据库的构建是CANoe诊断测试的基石。DBC负责解决“数据怎么传”的问题,CDD负责解决“数据代表什么”的问题,两者缺一不可。在实际项目中,建议优先使用ODX等标准格式导入诊断规范,减少手动录入错误;同时建立配置版本管理机制,确保测试环境与ECU实际实现同步。在配置完成后,务必通过诊断控制台进行冒烟测试,验证关键服务(如0x10、0x22、0x19)的请求/响应是否符合预期,为后续自动化测试脚本开发奠定可靠基础。