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

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

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

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

TC11-004测试用例

用例ID测试场景验证要点参考条款预期结果
TC11-004无效子功能码检测发送0x11 0xFF(保留值)§7.1.2返回NRC=0x12(子功能不支持)
/*----------------------------------------------------------------*/
/* 测试用例ID      : TC11-004                                     */
/* 测试项名称      : 无效子功能码检测                             */
/* 测试依据        : §7.1.2                                       */
/* 验证目标        : 返回NRC=0x12(子功能不支持)                 */
/* 作者            : 车端域控测试工程师                           */
/* 创建日期        : 2025-02-17                                   */
/* 版本历史        : V1.0 - 初始版本                              */
/*----------------------------------------------------------------*/
 
variables 
{
  // 诊断协议参数 
  const long DiagReqID = 0x732;    // 诊断请求ID 
  const long DiagResID = 0x733;    // 诊断响应ID 
  const byte InvalidSubFuncReq[2] = {0x11, 0xFF};  // 无效子功能请求 
  const byte ExpectedNRC = 0x12;   // 预期否定响应码 
  
  // 状态监控 
  msTimer responseTimer;
  int serviceValidationPassed = 0;
}
 
testcase TC11_004_InvalidSubfunctionCheck()
{
  TestModuleTitle("TC11-004 无效子功能码检测");
  
  // 阶段1:发送无效子功能请求 
  testStep("发送0x11服务+0xFF子功能");
  message DiagReqID [CAN] {
    dlc = 2;
    byte(0) = InvalidSubFuncReq[0];  // 服务ID 
    byte(1) = InvalidSubFuncReq[1];  // 子功能码 
  }
  output(this);
  
  // 阶段2:响应验证 
  testWaitForTimeout(500);  // 总测试窗口500ms 
  setTimer(responseTimer, 200);  // 设置响应超时 
 
  while(1) 
  {
    if(TestWaitForMessage(DiagResID, 50)) 
    {
      // 否定响应基础验证 
      if(this.byte(0) == 0x7F && 
         this.byte(1) == InvalidSubFuncReq[0]) 
      {
        // NRC专项验证 
        if(this.byte(2) == ExpectedNRC) {
          testStepPass("收到预期NRC=0x%02X", ExpectedNRC);
          serviceValidationPassed = 1;
          break;
        }
        else {
          testStepFail("收到错误NRC=0x%02X", this.byte(2));
        }
      }
      // 意外肯定响应处理 
      else if(this.byte(0) == 0x51) {
        testStepFail("检测到非法服务支持");
      }
    }
    
    // 超时处理 
    if(getTimer(responseTimer) >= 200) {
      testStepFail("响应超时未收到");
      break;
    }
  }
 
  // 最终判定 
  if(serviceValidationPassed) {
    testCasePass("无效子功能码验证成功");
  }
}
 
/*--------------------------------------------------------------
  增强型响应跟踪模块 
--------------------------------------------------------------*/
on message DiagResID 
{
  // 实时记录所有诊断响应 
  if(this.byte(0) == 0x7F) {
    testAddLog("收到否定响应 - SID:0x%02X NRC:0x%02X", 
              this.byte(1), this.byte(2));
  }
}
 
on timer responseTimer 
{
  testAddCondition("响应等待时间:%dms", getTimer(responseTimer));
}

测试架构深度解析

  1. 三阶段验证流程
否定响应
肯定响应
匹配
不匹配
异常请求触发
响应类型判断
NRC码验证
异常标记
测试通过
失败分析
超时监控
终止流程
  1. 关键技术实现

  2. 精准服务识别:

    if(this.byte(0) == 0x7F && this.byte(1) == InvalidSubFuncReq[0])
    
  3. 动态超时控制:

    setTimer(responseTimer, 200);  // 200ms严格响应窗口 
    while(getTimer(responseTimer) < 200) { ... }
    
  4. 多重防护机制:

    // 同时检测:
    // 1. 响应报文结构 
    // 2. 服务ID匹配 
    // 3. 特定NRC码 
    
  5. 异常处理矩阵
    | 异常类型 | 检测方式 | 处理措施 |
    |----------------|---------------------------|----------------------------|
    | 无效NRC码 | 字节偏移量验证 | 记录具体错误码 |
    | 非法服务支持 | 0x51肯定响应检测 | 标记协议违规 |
    | 总线静默 | 200ms超时机制 | 终止测试流程 |
    | 数据长度异常 | DLC值校验 | 触发格式错误警报 |

  6. 扩展验证建议

  7. 参数化测试扩展:

    struct SubfunctionTestSet {
      byte serviceID = 0x11;
      byte invalidSubfunc = 0xFF;
      byte expectedNRC = 0x12;
      dword timeout = 200;
    };
    
  8. 边界值测试扩展:

    void ExecuteBoundaryTests() {
      // 可测试:
      // 0x00 - 保留值边界 
      // 0x7F - 最大标准值 
      // 0x80 - 扩展子功能边界 
    }
    
  9. 服务矩阵验证:

    void CheckServiceMatrix(byte serviceID) {
      // 验证服务支持矩阵的完整性 
    }
    

工程实践指南

  1. 环境配置要求
    | 配置项 | 规格要求 |
    |----------------|-------------------------------|
    | 测试工具 | CANoe 15.0+(带Diagnostics) |
    | 硬件接口 | VN1630/VN8970 |
    | ECU供电 | 可编程电源(9-16V) |
    | 协议版本 | UDS 1.4.0 |

  2. 关键指标分析
    | 验证维度 | 合格标准 | 测量方法 |
    |----------------|---------------------------|------------------------|
    | 响应时间 | ≤150ms | 示波器触发测量 |
    | NRC一致性 | 100%返回0x12 | 自动化脚本验证 |
    | 错误检测率 | 非法请求拒绝率100% | 压力测试统计 |
    | 协议合规性 | 符合ISO14229-1要求 | 协议分析仪检测 |

  3. 执行注意事项

  • 测试前确保ECU处于默认会话模式
  • 禁用其他可能修改诊断状态的测试用例
  • 建议在ECU冷启动后立即执行
  • 避免与刷写操作测试并行执行
  1. 关联测试建议
  • 配合TC07-015(有效子功能边界值测试)
  • 结合TC09-018(非法服务ID检测)
  • 关联TC12-007(诊断服务支持矩阵验证)

调试技巧:

  1. Write Window设置过滤器:id==733h && byte(0)==7Fh
  2. 使用Graphics窗口绘制NRC分布图
  3. 启用Diagnostic Event Viewer跟踪服务交互
  4. 添加Test Coverage监控点:
    testAddCoverage("SVC-0x11", "Subfunction validation");
    testAddCoverage("NRC-0x12", "Subfunction not supported");
    

相关文章:

  • 《StyleID:一种无训练的方法将大规模扩散模型适配于风格迁移》
  • Mistral Saba:为中东和南亚量身打造的AI模型
  • npu 瑞芯微rk系列,rknn模型转换以及npu使用
  • ES8字符串填充用法总结:padStart(),padEnd(),rest剩余参数的用法{name,...obj},扩展运算符的用法,正则表达式命名捕获组
  • 聚焦地灾防治,助力城市地质安全风险防控
  • 基于STM32的智能交通信号控制系统
  • Windows环境打印文档的同时自动生成PDF副本的方法
  • SpringBoot中自动装配机制的原理
  • Pytorch实现论文之一种基于扰动卷积层和梯度归一化的生成对抗网络
  • 2024年GESP09月认证Scratch一级试卷
  • 问题定位总结
  • WebSocket在分布式环境中的局限性及解决方案
  • 线程的多种创建方式和使用
  • QML 自定义矩形框Rectangle,实现四个边框自定义大小
  • 反射机制的简单示例
  • pytorch预训练模型下载保存路径更改
  • 【干货教程】DeepSeek R1+Open WebUI构建RAG检索增强知识库的实战教程
  • 《DeepSeek Janus Pro 7B:多模态人工智能大模型部署全攻略》
  • 用 UniApp 打造新颖美观的弹出框
  • C#多线程
  • 马上评|安排见义勇为学生补考,善意与善意的双向奔赴
  • 诠释微末处的丰盈:“上海制造佳品汇”首届海外专场即将亮相日本大阪
  • 独行侠以1.8%概率获得状元签,NBA原来真的有剧本?
  • 习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式
  • 阚吉林任重庆市民政局党组书记,原任市委组织部主持日常工作的副部长
  • 中俄就应对美加征所谓“对等关税”等问题进行深入交流