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对三者都支持,但加载入口和后续使用方式不同。

诊断描述文件结构与CANoe加载路径 CDD(.cdd) CANdelaStudio 工程 • 单ECU诊断模型 • 服务 / DID / DTC 集中定义 • 会话、安全、状态机 • 请求/响应字节布局 • 与CANoe同厂,加载最直接 ODX(.odx) ISO 22901-1 开放格式 • DIAG-LAYER 分层组织 • ECU-VARIANT / BASE-VARIANT • 服务、DID、DTC 标准化描述 • 可跨工具、跨厂商交换 • 需配合ODX-C通信参数 PDX(.pdx) ZIP 打包容器 • 内含多个 .odx 文件 • ODX-D 诊断描述 • ODX-F 刷写数据 • ODX-C 通信参数 • index.xml 索引清单 可导出 打包 CANoe 中的加载入口 Diagnostic/ISO TP 加载 CDD 或 ODX / PDX 生成诊断对象树 Diagnostic Console 选择服务 / DID 手动发送与观察 验证描述文件正确性 CAPL / Test Module diagRequest / diagResponse 引用描述文件中的对象 自动化测试执行

二、诊断服务与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名称长度数据类型换算单位
0xF190VIN17字节ASCII无—
0xF187零件号10字节ASCII无—
0x1234冷却液温度2字节无符号0.1×raw−40℃
0x1235电池电压2字节无符号0.001×rawV

三、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/PDX时,务必确认ODX-C中的CAN ID、寻址模式与实车总线一致。常见错误是描述文件用物理寻址0x7E0/0x7E8,而实车使用功能寻址0x7DF,导致诊断请求无响应。

四、实操中的常见问题与判断

第一类问题是“文件加载成功但服务不可用”。这通常不是文件损坏,而是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中重新加载验证。