2. 诊断协议基础与CANoe映射

在CANoe中做诊断测试,第一步不是打开诊断控制台,而是把“协议栈”想清楚。ECU诊断通信并不是一条报文直接问、一条报文直接答,而是由三层协议叠加完成:应用层的UDS定义“问什么、答什么”,传输层的ISO-TP或DoIP定义“怎么把长报文搬过去”,网络层/链路层则决定“走CAN还是走以太网”。CANoe的诊断配置本质上就是把这套协议栈映射到具体的通道、寻址方式和参数上。理解这三层的关系,后续的CDD/ODX导入、诊断请求发送、响应解析才有依据。

UDS:诊断服务的语义层

UDS(Unified Diagnostic Services,ISO 14229)规定了诊断仪与ECU之间的服务语义。每个请求由SID(Service Identifier,1字节)加子功能或数据参数组成,正响应通常为SID+0x40,负响应固定为0x7F加原SID再加NRC(Negative Response Code)。例如读取故障码用0x19,写入数据用0x2E,安全访问用0x27,例程控制用0x31。诊断测试中真正需要记住的不是服务列表,而是“请求—响应—否定”的对应关系:发0x22读数据,正常回0x62加DID和数据;若ECU未解锁,则回7F 22 33(securityAccessDenied)。

UDS还定义了会话与安全状态:默认会话、编程会话、扩展会话,以及通过0x27种子—密钥解锁的安全等级。这些状态决定了哪些服务在当前条件下被允许。CANoe的诊断描述文件(CDD或ODX)会把这些服务、DID、例程、NRC都结构化,测试时通过诊断面板或CAPL函数调用,而不是手工拼字节。

ISO-TP:CAN上的长报文搬运

经典CAN一帧只有8字节数据,而UDS请求往往超过8字节,因此需要ISO 15765-2(ISO-TP)做分段与重组。它定义了四种帧类型:单帧(SF)、首帧(FF)、连续帧(CF)、流控帧(FC)。发送方先发FF声明总长度,接收方回FC给出块大小BS和最小间隔STmin,发送方再按BS连续发CF。诊断测试中常见的“多帧响应超时”“流控帧未收到”都属于ISO-TP层问题,而不是UDS服务本身错误。

在CANoe中,ISO-TP参数通常体现在诊断描述文件的传输层设置里:功能寻址与物理寻址的请求/响应ID、STmin、BS、N_As/N_Ar/N_Bs/N_Br/N_Cs/N_Cr等超时。这些参数必须与ECU实际实现一致,否则会出现请求发出但收不到完整响应的情况。

DoIP:以太网诊断的传输层

当诊断走以太网时,传输层由DoIP(Diagnostic over IP,ISO 13400)承担。DoIP不负责分段重组UDS,而是把完整的UDS报文封装进DoIP消息,通过TCP或UDP传输。典型流程是:诊断仪先通过UDP向车辆发现端口(默认13400)发车辆识别请求,获得逻辑地址与IP;再建立TCP连接,发送路由激活请求,激活成功后才能发送诊断消息。DoIP报文头包含协议版本、载荷类型、载荷长度等字段,诊断消息的载荷类型为0x8001。

DoIP的关键参数包括:诊断仪逻辑地址、ECU逻辑地址、TCP端口、路由激活类型。CANoe的DoIP配置需要指定这些地址与端口,并选择TCP或UDP承载。与ISO-TP不同,DoIP本身不设流控帧,可靠性由TCP保证,因此超时和重传策略更多依赖TCP栈与DoIP层的心跳/激活状态。

CANoe诊断协议栈映射:UDS / ISO-TP / DoIP CANoe 诊断测试端 诊断面板 / CAPL Diag::SendRequest() CDD / ODX 描述文件 服务·DID·NRC 传输层配置 ISO-TP / DoIP 通道映射 CAN1 / Eth1 硬件接口 VN / Ethernet 协议栈分层 UDS(ISO 14229) SID · 子功能 · DID · NRC · 会话/安全 ISO-TP(ISO 15765-2) SF · FF · CF · FC · BS · STmin DoIP(ISO 13400) 车辆识别 · 路由激活 · TCP/UDP · 逻辑地址 链路层 CAN 帧 / Ethernet 帧 目标 ECU 诊断服务处理 0x22 / 0x2E / 0x27 传输层实现 ISO-TP / DoIP 会话与安全状态 默认/扩展/编程 响应组包 正响应 / 7F NRC 物理接口 CAN 收发器 / PHY 请求方向:CANoe → 协议栈 → ECU;响应方向相反。ISO-TP 与 DoIP 互斥,取决于通道类型。

CANoe中的协议参数与通道映射

把上述三层落到CANoe工程里,核心是“诊断描述文件 + 传输层设置 + 通道绑定”三件事。以CAN诊断为例,在Diagnostics配置中导入CDD后,需要为每个诊断目标指定请求ID和响应ID。物理寻址通常请求ID为0x7xx、响应ID为0x7xx+8;功能寻址请求ID为0x7DF,用于广播式请求(如0x10 03进入扩展会话)。ISO-TP参数中,STmin决定连续帧之间的最小间隔,BS决定一次流控允许发多少帧。若ECU返回的响应较长而BS设置过小,会出现频繁流控往返,测试脚本中表现为响应时间变长。

DoIP场景下,通道映射的对象从CAN ID变成逻辑地址与IP端口。CANoe的DoIP配置需要填写诊断仪逻辑地址(如0x0E00)、目标ECU逻辑地址(如0x0001)、车辆识别端口13400、诊断TCP端口(常见13400或自定义)。路由激活成功后,诊断请求才被ECU接受。若跳过路由激活直接发UDS,ECU通常不响应或返回DoIP层错误。

判断问题出在哪一层,可以看响应形态:完全无响应,优先查通道映射与物理连接;收到流控帧但后续连续帧缺失,查ISO-TP的BS/STmin;收到7F负响应,说明传输层已通,问题在UDS服务条件(会话、安全、DID权限)。

一个可复用的诊断配置检查清单

检查项CAN诊断DoIP诊断
寻址方式物理ID 0x7xx / 功能ID 0x7DF诊断仪逻辑地址 / ECU逻辑地址
传输层参数BS、STmin、N_Bs/N_Cr超时TCP端口、路由激活类型、心跳
通道绑定CAN1 / CAN2 通道号Eth1 网卡与VLAN
描述文件CDD 或 ODX 导入CDD/ODX + DoIP 参数
典型失败现象多帧超时、流控丢失路由激活失败、TCP连接拒绝

实际配置时,建议先用一条最简单的0x22读DID请求打通链路,确认能收到0x62正响应,再逐步加入0x27安全访问和0x2E写数据。这样一旦失败,可以快速定位是传输层没通,还是UDS服务条件不满足。CANoe的Trace窗口能同时看到原始CAN帧或DoIP报文与解析后的UDS服务,是分层排查最直接的工具。