【UDS诊断(ClearDiagnosticInformation_0x84服务)测试用例CAPL代码全解析②】


ISO 14229-1:2023 UDS诊断【ClearDiagnosticInformation_0x84服务】_TestCase02

作者:车端域控测试工程师
更新日期:2025年03月05日
关键词:UDS诊断协议、清除诊断信息服务、ClearDiagnosticInformation_0x84服务、ISO 14229-1:2023

TC84-002测试用例

用例ID 测试场景 验证要点 参考条款 预期结果
TC84-002 清除指定DTC组(0x84 0x01 0x02) 清除动力总成组(Group=0x000102) §7.5.7.2.2 返回0x44,组内DTC清除

TC8402 UDS 0x84服务指定DTC组清除CAPL代码(工业级实现)
更新时间:2025年3月5日 19:58
协议标准:ISO 14229-1 §7.5.7.2.2


一、代码架构设计

预置DTC
发送指令
响应验证
数据校验
错误处理
变量声明
状态机初始化
状态轮询
注入组内DTC
构造0x84请求
解析NRC
0x19服务验证
复位ECU

二、完整CAPL脚本

/* ================================================================= 
   TC8402 动力总成组DTC清除验证(状态机实现)
   核心特性:
   - 严格遵循ISO 14229状态转换规则 
   - 三阶段DTC验证机制 
   - 工业级容错设计(支持ECU复位/重试)
================================================================== */
variables {
  // 协议参数 
  const dword kTargetGroup = 0x000102;      // 动力总成组标识符 
  const byte kSubFunction = 0x01;           // 组清除子功能 
  const byte kPositiveResp = 0x44;          // 预期肯定响应 
  
  // 运行时状态 
  enum TestStates {
    STATE_PREPARE_DTC,      // 预置组内DTC 
    STATE_SEND_CLEAR,       // 发送清除指令 
    STATE_CHECK_RESP,       // 响应验证 
    STATE_VERIFY_DATA,      // 组数据校验 
    STATE_ERROR_HANDLE      // 错误处理 
  };
  TestStates gCurrentState = STATE_PREPARE_DTC;
  
  msTimer gOperationTimer;                 // 操作超时监控 
  int gRetryCount = 0;                     // 重试计数器 
}
 
//  诊断响应处理 
on diagResponse 0x84::kSubFunction {
  if(this.Request.GroupIdentifier == kTargetGroup) {
    gOperationTimer.Stop();
    
    // 响应码校验 
    if(this.ResponseType == kPositiveResp) {
      write("合规响应捕获:0x%02X @ %t", kPositiveResp, timeNow());
      gCurrentState = STATE_VERIFY_DATA;
    } else {
      testCaseFail("异常响应:NRC=0x%02X", this.ResponseType);
      gCurrentState = STATE_ERROR_HANDLE;
    }
  }
}
 
//  状态处理模块 
void HandlePrepareDTC() {
  // 注入动力总成组DTC(示例:P0171/P0300)
  diagRequest SetDTC1: 0x8C[0x01 0x01 0x71];  // P0171(燃油系统过稀)
  diagRequest SetDTC2: 0x8C[0x03 0x00 0x00];  // P0300(随机失火)
  SetDTC1.SendRequest();
  SetDTC2.SendRequest();
  
  testReportAddNote("已注入组内DTC", "数量:2");
  gCurrentState = STATE_SEND_CLEAR;
  gOperationTimer.Set(3000);  // 等待3秒确保DTC写入 
}
 
void HandleSendClear() {
  if(gOperationTimer == 0) {
    // 构造组清除请求(0x84 0x01 0x000102)
    byte groupBytes[3];
    groupBytes[0] = (kTargetGroup >> 16) & 0xFF;
    groupBytes[1] = (kTargetGroup >> 8) & 0xFF;
    groupBytes[2] = kTargetGroup & 0xFF;
    
    diagRequest ClearReq: 0x84[kSubFunction, groupBytes];
    ClearReq.SendRequest();
    
    testStepPass("清除指令已发送(时间戳:%t)", timeNow());
    gCurrentState = STATE_CHECK_RESP;
    gOperationTimer.Set(5000);  // 5秒响应超时 
  }
}
 
void HandleVerifyData() {
  // 读取组DTC状态(0x19 0x02)
  diagRequest ReadDTC: 0x19[0x02, (kTargetGroup >> 16) & 0xFF, 
                           (kTargetGroup >> 8) & 0xFF, kTargetGroup & 0xFF];
  ReadDTC.SendRequest();
  
  if(ReadDTC.Response.NumberOfDTCs == 0) {
    testStepPass("组内DTC已清零(当前数量:%d)", ReadDTC.Response.NumberOfDTCs);
    testCasePass();
  } else {
    testCaseFail("DTC残留异常(数量:%d)", ReadDTC.Response.NumberOfDTCs);
  }
}
 
//  主测试逻辑 
testcase TC8402_GroupDTCClear() {
  gCurrentState = STATE_PREPARE_DTC;
  gRetryCount = 0;
  
  while(1) {
    switch(gCurrentState) {
      case STATE_PREPARE_DTC:
        HandlePrepareDTC();
        break;
        
      case STATE_SEND_CLEAR:
        HandleSendClear();
        break;
        
      case STATE_CHECK_RESP:
        if(gOperationTimer == 0) {
          testCaseFail("操作超时(未收到响应)");
          gCurrentState = STATE_ERROR_HANDLE;
        }
        break;
        
      case STATE_VERIFY_DATA:
        HandleVerifyData();
        return;
        
      case STATE_ERROR_HANDLE:
        if(gRetryCount++ < 2) {
          testRetry();
          gCurrentState = STATE_PREPARE_DTC;
        } else {
          testCaseAbort();
          return;
        }
        break;
    }
    wait 10;  // 10ms状态轮询间隔 
  }
}

三、关键错误处理机制

TestCase ECU Monitor 发送0x84清除指令 返回0x44 发送0x19验证请求 返回DTC数量=0 返回NRC≠0x44 发送0x11复位请求 复位确认 触发重试机制 alt [正常流程] [异常流程] TestCase ECU Monitor

四、部署验证说明

  1. DTC组配置要求
    在CANoe诊断数据库配置动力总成组:

    <DTCGroup id="0x000102" memorySegment="0x1000-0x1FFF">
      <Description>Powertrain Group (Engine/Transmission)Description>
      <SecurityLevel>2SecurityLevel>
    DTCGroup>
    
  2. 执行监控命令

    canoe -testcase TC8402_GroupDTCClear -report_format=XML -log_level=3 
    
  3. 预期输出示例

    [INFO] 已注入组内DTC 数量:2 
    [PASS] 清除指令已发送(时间戳:19:59:30.500)
    [PASS] 组内DTC已清零(当前数量:0)
    

五、高级调试建议

  1. 存储区校验技术

    // 直接读取ECU内存验证(需配置内存映射)
    diagRequest ReadMemory: 0x23[0x1000, 0x100];
    if(ReadMemory.Response.Data[0x12] != 0x00) {  // DTC存储标志位 
      testCaseAddWarning("存储区残留数据");
    }
    
  2. 时序验证方法

    操作阶段 允许延迟 测量方法
    DTC注入 ≤500ms 报文时间戳差值分析
    清除响应 ≤300ms 服务层时序跟踪
    数据校验 ≤1s 跨服务时间关联

技术注释:

  1. 使用diagGetLastErrorCode()可获取详细错误信息
  2. 推荐启用CANoe的State Transition Coverage分析功能
  3. 对于ASIL-D系统,需增加双通道校验机制(主/备ECU同步验证)

你可能感兴趣的:(测试用例,汽车,学习,经验分享,CANoe)