当前位置: 首页 > news >正文

【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑧】

ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase08

作者:车端域控测试工程师
更新日期:2025年02月17日
关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023

TC11-008测试用例

用例ID测试场景验证要点参考条款预期结果
TC11-008多复位请求冲突处理连续发送3次复位请求§8.4.1仅首次请求生效,后续返回NRC=0x78

以下是为TC11-008设计的增强型CAPL测试用例,包含时序控制与状态跟踪机制,包含执行流程图和工业级异常处理:

/*----------------------------------------------------------
  Title:TC11-008 多复位请求冲突处理验证 
  作者:车端域控测试工程师 
  日期:2025-02-17 
------------------------------------------------------------*/
 
variables {
  // 通信参数 
  const long DiagReqID = 0x732;       // 诊断请求标识符 
  const long DiagResID = 0x733;       // 诊断响应标识符 
  const byte ResetSvc = 0x11;         // 复位服务ID 
  const byte ResetSub = 0x01;         // 硬件复位子功能 
  const byte ExpectedNRC = 0x78;      // 预期否定响应码 
  
  // 测试控制参数 
  msTimer responseTimer;
  int requestCounter = 0;
  byte responseStatus[3];             // 存储三次响应状态 
}
 
testcase TC11_008_MultiResetTest() 
{
  TestModuleTitle("TC11-008 多复位请求冲突验证");
  
  // ███ 阶段1:连续发送三次复位请求 ███ 
  testStep("STEP1 发送三次复位请求(间隔150ms)");
  
  for(requestCounter=0; requestCounter<3; requestCounter++) 
  {
    // 发送复位请求 
    message DiagReqID [CAN] {
      dlc = 2;
      byte(0) = ResetSvc;
      byte(1) = ResetSub;
    }
    output(this);
    
    // 启动响应监测窗口 
    setTimer(responseTimer, 300);
    while(getTimer(responseTimer) < 300) 
    {
      if(TestWaitForMessage(DiagResID, 50)) 
      {
        // 响应解析逻辑 
        if(this.byte(0) == 0x51) {
          responseStatus[requestCounter] = 1;  // 肯定响应 
          testAddLog("请求%d: 收到肯定响应", requestCounter+1);
          break;
        } 
        else if(this.byte(0) == 0x7F && 
                this.byte(1) == ResetSvc && 
                this.byte(2) == ExpectedNRC) 
        {
          responseStatus[requestCounter] = 2;  // 否定响应 
          testAddLog("请求%d: 收到NRC=0x%02X", requestCounter+1, ExpectedNRC);
          break;
        }
      }
    }
    
    // 超时处理 
    if(responseStatus[requestCounter] == 0) {
      responseStatus[requestCounter] = 3;      // 响应超时 
      testAddLog("请求%d: 响应超时", requestCounter+1);
    }
    
    // 请求间隔控制 
    testWait(150);
  }
 
  // ███ 阶段2:结果验证 ███ 
  testStep("STEP2 响应结果验证");
  
  // 首次请求验证 
  if(responseStatus[0] == 1) {
    testStepPass("首次请求成功执行");
  } else {
    testStepFail("首次请求失败(状态码:%d)", responseStatus[0]);
  }
  
  // 后续请求验证 
  for(int i=1; i<3; i++) 
  {
    if(responseStatus[i] == 2) {
      testStepPass("请求%d返回NRC=0x78", i+1);
    } else {
      testStepFail("请求%d异常(状态码:%d)", i+1, responseStatus[i]);
    }
  }
  
  // 综合判定 
  if(responseStatus[0]==1 && responseStatus[1]==2 && responseStatus[2]==2) {
    testCasePass("多复位冲突处理验证通过");
  } else {
    testCaseFail("冲突处理机制异常");
  }
}
 
/*----------------------------------------------------------
  系统状态监控模块(扩展功能)
----------------------------------------------------------*/
on sysvar ECU::ResetStatus 
{
  if(@this::ResetStatus == 1) {
    testAddLog("ECU复位操作已触发");
    testAddCondition("复位持续时间:%dms", sysGetTimer(ECU_RESET_TIMER));
  }
}

流程图解(执行逻辑可视化)

Tester ECU 复位请求 肯定响应(0x51) 复位请求 NRC=0x78 复位请求 NRC=0x78 Tester ECU

关键参数说明表

参数名称示例值工程配置要点
请求间隔150ms需小于ECU复位执行时间
响应超时300ms覆盖ECU最大响应时间
NRC 0x78请求未响应ISO 14229-1标准定义
复位子功能0x01OEM定义的硬件复位类型

响应状态矩阵

请求序号预期状态失败场景示例
1肯定响应(0x51)ECU未执行复位
2NRC=0x78返回其他NRC或超时
3NRC=0x78错误响应或系统崩溃

工业级增强功能

  1. 复位状态跟踪

    // 通过系统变量监控实际复位动作 
    on sysvar ECU::PowerStatus {
      if(@this::PowerStatus == 0x02) {
        testAddLog("ECU进入重启流程");
      }
    }
    
  2. 压力测试扩展

    void ExecuteStressTest() {
      // 可扩展:
      // 1. 连续发送10次复位请求 
      // 2. 随机间隔测试(50-500ms)
      // 3. 混合其他服务请求 
    }
    
  3. 时序校验逻辑

    // 验证响应时序合规性 
    if(getTimer(responseTimer) < 200) {
      testAddCondition("响应时间:%dms", getTimer(responseTimer));
    }
    

专家调试技巧:

  1. Graphics窗口添加观测信号:
    ECU::ResetStatus 
    sysvar::DiagResponseTime 
    
  2. 使用Diagnostic Console设置过滤条件:
    filter.id = 0x733 && (payload[0] == 0x51 || payload[0] == 0x7F)
    
  3. 添加总线监测断点:
    break if (this.id == 0x733 && this.byte(0) == 0x7F)
    

相关文章:

  • 【C++初阶】类和对象③之运算符重载--从日期类推广自定义类型运算的方法奥秘
  • 使用Navicat for MySQL工具连接本地虚拟机上的MySQL
  • mybatis 入门案例
  • 磁电偶极子学习笔记2 60GHz 双极化 二维转换波束 口径耦合 磁电偶极子宽带天线阵列
  • 云平台结合DeepSeek的AI模型优化实践:技术突破与应用革新
  • Redis中的某一热点数据缓存过期了,此时有大量请求访问怎么办
  • 简述mysql主从复制原理及工作过程,配置一主两从并验证
  • 封装红黑树实现map和set
  • 缺陷检测之图片标注工具--labme
  • 【python】You-Get
  • 使用京东AsyncTool实现异步编排
  • 4、IP查找工具-Angry IP Scanner
  • 用deepseek学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理
  • 周雨彤:用角色与生活,诠释审美的艺术
  • 1、cadence从零开始让一个VCO起振——基本设置
  • MATLAB算法实战应用案例精讲-【数模应用】空间插值(附MATLAB、R语言和python代码实现)
  • JavaScript设计模式 -- 迭代器模式
  • 【信息学奥赛一本通 C++题解】1285:最大上升子序列和
  • 同花顺数据爬取并生成K线
  • 【SpringBoot苍穹外卖】debugDay0 打开前端页面
  • 马上评丨上热搜的协和“4+4”模式,如何面对舆论审视
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM
  • 蔡澜回应“入ICU观察”称未至于病危,助理:只是老毛病
  • 五一“拼假”催热超长假期,热门酒店民宿一房难求
  • 金科服务:大股东博裕资本提出无条件强制性现金要约收购,总代价约17.86亿港元
  • 港理大公布多项AI+医工成果,助港建设国际医疗创新枢纽