3. UDS诊断服务0x11 ECU复位脚本

UDS诊断服务0x11 ECU复位脚本 学习卡片

任务目标

在CANoe中编写CAPL脚本,分别通过物理寻址(Physical Addressing)和功能寻址(Functional Addressing)向ECU发送诊断请求(如读取VIN码),并观察两种寻址方式下响应报文的差异。物理寻址点对点通信,仅目标ECU响应;功能寻址广播通信,总线上所有支持该服务的ECU均会响应。

前置条件

  • CANoe安装有Diagnostics/ISO TP相关配置(本文使用CANoe 15+,基于ISO 15765-2协议栈)
  • 已创建诊断仿真工程,至少包含一个ECU仿真节点(本文以地址0x01为例)和一个测试节点
  • 诊断数据库(CDD/ODX)已配置,或使用原始TP层报文验证(本文采用后者,便于观察寻址差异)

实现原理

诊断请求通过ISO TP层发送时,CAN ID的高位决定寻址类型:

  • 物理寻址:CAN ID = 0x7E0(请求)/ 0x7E8(响应),N_AI中的TA(目标地址)为具体ECU地址(如0x01)
  • 功能寻址:CAN ID = 0x7DF(请求),N_AI中的TA为功能地址0x00(表示广播);响应仍使用物理寻址返回

CAPL中通过DiagSetTarget或直接构造ISO TP报文实现两种寻址。本文采用直接构造TP报文的方式,不依赖诊断数据库,便于观察底层寻址差异。

完整CAPL代码

/* 测试节点TestNode的CAPL脚本 */
variables
{
  // 诊断请求报文(ISO TP单帧)
  diagRequest req;
  char vin[20];
}

on start
{
  // 1. 物理寻址:发送读取VIN请求(服务0x22,DID 0xF190)
  DiagSetTarget(req, 0x01);  // 目标ECU地址
  DiagSendRequest(req, 0x22, 0xF1, 0x90);
  write("物理寻址请求已发送 (CAN ID 0x7E0)");
  Timer t1[2000];  // 等待2秒观察响应
  setTimer(t1, 2000);
}

on timer t1
{
  // 2. 功能寻址:发送相同请求
  DiagSetTarget(req, 0x00);  // 功能地址(广播)
  DiagSendRequest(req, 0x22, 0xF1, 0x90);
  write("功能寻址请求已发送 (CAN ID 0x7DF)");
  Timer t2[2000];
  setTimer(t2, 2000);
}

on timer t2
{
  write("测试完成,请检查Trace窗口中的响应报文");
}

// 物理寻址响应回调(ECU地址0x01)
on diagResponse ECU1::0x01
{
  long len;
  byte data[100];
  len = DiagGetRespData(this, data, elcount(data));
  if (len > 0 && data[0] == 0x62)  // 肯定响应SID
  {
    // 提取VIN(假设从第4字节开始,ASCII码)
    int i;
    for (i = 0; i < len-4 && i < 17; i++)
      vin[i] = data[i+4];
    vin[i] = '\0';
    write("物理寻址响应: VIN = %s", vin);
  }
  else
    write("物理寻址响应异常,长度=%d", len);
}

// 功能寻址响应回调(所有ECU都会触发,此处仅演示一个)
on diagResponse ECU1::0x01
{
  long len;
  byte data[100];
  len = DiagGetRespData(this, data, elcount(data));
  if (len > 0 && data[0] == 0x62)
  {
    int i;
    for (i = 0; i < len-4 && i < 17; i++)
      vin[i] = data[i+4];
    vin[i] = '\0';
    write("功能寻址响应 (来自ECU1): VIN = %s", vin);
  }
}

运行与验证

  1. 在CANoe中加载工程,将上述代码添加到测试节点(TestNode)的CAPL脚本中
  2. 确保ECU仿真节点(地址0x01)已配置并支持0x22服务读取VIN
  3. 启动仿真(按F5或点击Start),观察Write窗口和Trace窗口

通过判定标准:

  • 物理寻址阶段:Trace中仅出现1条请求(ID 0x7E0)和1条响应(ID 0x7E8),Write窗口显示VIN码
  • 功能寻址阶段:Trace中出现1条广播请求(ID 0x7DF),但若总线上有多个ECU,会看到多条响应(ID 0x7E8、0x7E9等);本案例仅1个ECU,因此仍为1条响应,但请求ID不同
  • 若ECU不支持功能寻址,则功能寻址请求后无响应,Write窗口无输出——这本身也是验证差异的一种结果

关键差异说明

对比项物理寻址功能寻址
请求CAN ID0x7E0(或0x7E0+ECU地址偏移)0x7DF(固定广播ID)
目标地址(TA)具体ECU地址(如0x01)0x00(功能地址)
响应行为仅目标ECU响应所有支持该服务的ECU均响应
典型用途读取/写入特定ECU数据同时唤醒/获取多个ECU信息(如VIN广播)

注:若需观察多ECU响应差异,可在工程中再添加一个地址为0x02的ECU仿真节点,功能寻址时两个ECU都会返回响应。