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

【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");
    

http://www.kler.cn/a/552306.html

相关文章:

  • python环境的yolov11.rknn物体检测
  • vscode/cursor 写注释时候出现框框解决办法
  • 深度学习论文: RailYolact -- A Yolact Focused on edge for Real-Time Rail Segmentation
  • Linux环境基础开发工具的使用(一)
  • 五档历史Level2行情数据:期货市场的信息宝库
  • 【Spring快速入门】不断更新...
  • 实现可拖拽的 Ant Design Modal 并保持下层 HTML 可操作性
  • 百度智能云—千帆 ModelBuilder API的简单调用(Java)
  • leetcode232-用栈实现队列
  • 百度搜索和文心智能体接入DeepSeek满血版——AI搜索的新纪元
  • 【网络安全 | 漏洞挖掘】我如何通过Cookie Manipulation发现主域上的关键PII?
  • [OD E 100] 服务器广播需要广播的服务器数量
  • Hive Orc表数据导出和导入
  • Param ‘serviceName‘ is illegal, serviceName is blank
  • Rabbitmq的三个端口区分
  • python 的框架 dash 开发TodoList Web 应用
  • Spring Boot自动装配:约定大于配置的魔法解密
  • 组合模式详解(Java)
  • React 与 Vue 对比指南 - 上
  • 备战蓝桥杯 Day4 差分