4. 诊断描述文件解析
在CANoe中做诊断测试,第一步不是写CAPL,也不是点“发送”,而是把ECU的诊断能力“翻译”成工具能理解的数据模型。这个翻译的载体就是诊断描述文件。没有描述文件,CANoe只知道总线上有报文,却不知道0x22后面跟的两个字节代表什么、返回的4个字节如何换算成电压或温度。本节围绕三种最常见的描述文件——CDD、ODX、PDX——讲清它们的结构差异、诊断服务与DID在其中的组织方式,以及它们在CANoe中的实际加载路径。
一、三种文件的定位与关系
CDD(CANdela Diagnostic Description)是Vector体系内的诊断描述格式,通常由CANdelaStudio编辑,扩展名为.cdd。它把某个ECU的诊断服务、DID、DTC、会话与安全状态、以及请求响应的字节布局集中在一个工程里,CANoe通过诊断配置直接引用它。ODX(Open Diagnostic data eXchange,ISO 22901-1)是跨厂商的开放诊断数据格式,扩展名为.odx,按诊断层(DIAG-LAYER)组织,一个ODX工程可以包含多个ECU、多个变体。PDX(Packaged ODX)本质是一个ZIP容器,扩展名.pdx,把若干ODX文件、对应的ODX-D诊断描述、ODX-F刷写数据、ODX-C通信参数以及索引文件打包在一起,便于整车级分发。
三者的关系可以概括为:CDD是“单ECU、工具内闭环”的描述;ODX是“标准化、可跨工具”的描述;PDX是“ODX的工程打包”。CANoe对三者都支持,但加载入口和后续使用方式不同。
二、诊断服务与DID在文件中的组织
无论CDD还是ODX,描述文件的核心都是“服务—请求—响应—参数”四层结构。以最常用的0x22(ReadDataByIdentifier)为例,在CDD中它表现为一个Diagnostic Service对象,下面挂Request和Response两个PDU,Request里包含一个2字节的DID参数,Response里包含DID回显加数据记录。在ODX中,同样的内容被拆成DIAG-SERVICE、REQUEST、POS-RESPONSE、PARAM等元素,通过ODX-LINK引用DID对象。
DID(Data Identifier)是诊断数据的寻址键,2字节,例如0xF190常被用作VIN,0xF187用于零件号,0xF18C用于ECU序列号。描述文件里DID不只是编号,还携带数据类型、字节序、缩放公式和单位。比如某温度DID返回2字节,定义物理值 = 0.1 × 原始值 − 40,单位℃,那么CANoe在Diagnostic Console里就会直接显示“85.0 ℃”而不是“0x07D0”。这正是描述文件的价值:把原始字节变成工程语义。
下表给出一个简化的DID定义示例,用于说明描述文件中需要填写的关键字段。
| DID | 名称 | 长度 | 数据类型 | 换算 | 单位 |
|---|---|---|---|---|---|
| 0xF190 | VIN | 17字节 | ASCII | 无 | — |
| 0xF187 | 零件号 | 10字节 | ASCII | 无 | — |
| 0x1234 | 冷却液温度 | 2字节 | 无符号 | 0.1×raw−40 | ℃ |
| 0x1235 | 电池电压 | 2字节 | 无符号 | 0.001×raw | V |
三、CANoe中的加载方法
在CANoe中加载描述文件,通常从Configuration → Diagnostic/ISO TP进入。若使用CDD,直接在Diagnostic Description栏选择.cdd文件,CANoe会解析出ECU节点、服务列表和DID树。若使用ODX,需要同时指定ODX-D文件和对应的ODX-C通信参数文件,否则CANoe无法确定寻址方式(物理寻址还是功能寻址)、CAN ID和ISO-TP参数。若拿到的是PDX,CANoe支持直接选择.pdx,内部会自动解包并列出可用的ECU变体,选择目标变体后完成加载。
加载完成后,建议先在Diagnostic Console中做一次“冒烟验证”:选择0x10 0x03进入扩展会话,再发0x22 0xF190读VIN,观察响应是否为0x62 0xF190加17字节ASCII。如果响应为0x7F 0x22 0x31(requestOutOfRange),说明DID在描述文件中存在但ECU不支持,或描述文件与ECU版本不匹配。这一步能快速暴露描述文件与实车不一致的问题,避免把错误带入CAPL脚本。
四、实操中的常见问题与判断
第一类问题是“文件加载成功但服务不可用”。这通常不是文件损坏,而是ODX的DIAG-LAYER没有正确关联到目标ECU变体,或CDD中的会话状态未激活。判断方法是查看CANoe诊断对象树中该服务是否显示为灰色,灰色表示当前会话/安全状态下不可达。
第二类问题是“DID数值显示异常”。例如温度显示为-40℃或6553.5℃,说明原始字节的字节序或缩放公式与描述文件不符。此时应回到描述文件中检查DID的byteOrder和factor/offset,并用Diagnostic Console的原始字节视图对照实车返回数据。
第三类问题是“PDX解包后ECU列表为空”。这多半是PDX内缺少index.xml或ODX文件版本不被当前CANoe支持。可先用解压工具查看PDX内部结构,确认存在index.xml和至少一个.odx-d文件,再检查CANoe版本是否满足ODX版本要求。
掌握这三种文件的定位、结构与加载路径后,后续的诊断服务调用、DID读写和自动化测试才有可靠的数据基础。描述文件不是“配一次就不管”的静态资源,ECU软件升级、DID增删、会话策略调整都会要求同步更新描述文件,并在CANoe中重新加载验证。