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

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

作者:车端域控测试工程师

更新日期:2025年02月18日

关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023

TC11-011测试用例

用例ID 测试场景 验证要点 参考条款 预期结果
TC11-011 复位服务参数越界检测 发送0x11 0x01 0xAA(非法参数) §7.1.3 返回NRC=0x31(参数越界)

以下是为TC11-011设计的增强型CAPL测试用例,包含参数边界检测与异常处理机制,包含执行流程图和工业级验证策略:

cpp 复制代码
/*----------------------------------------------------------
  Title:TC11-011 复位服务参数越界验证 
  作者:车端域控测试工程师 
  日期:2025-02-18 
------------------------------------------------------------*/
 
variables {
  // 诊断通信参数 
  const long DiagReqID = 0x732;       // 诊断请求标识符 
  const long DiagResID = 0x733;       // 诊断响应标识符 
  const byte ResetSID = 0x11;         // ECU复位服务 
  const byte ResetSubFunc = 0x01;     // 硬件复位子功能 
  const byte InvalidParam = 0xAA;     // 非法参数值 
  const byte ExpectedNRC = 0x31;      // 预期否定响应码 
  
  // 测试控制参数 
  msTimer responseTimer;
  byte actualNRC = 0x00;
}
 
testcase TC11_011_ParameterBoundaryTest() 
{
  TestModuleTitle("TC11-011 复位服务参数越界验证");
  
  // ███ 阶段1:构造非法请求 ███ 
  testStep("STEP1 发送含非法参数的复位请求");
  
  message DiagReqID [CAN] {
    dlc = 3;
    byte(0) = ResetSID;          // 复位服务ID 
    byte(1) = ResetSubFunc;      // 子功能号 
    byte(2) = InvalidParam;      // 非法参数 
  }
  output(this);
  
  // ███ 阶段2:响应捕获与分析 ███ 
  testStep("STEP2 验证否定响应");
  setTimer(responseTimer, 500);  // 设置500ms响应窗口 
  
  while(getTimer(responseTimer) < 500) 
  {
    if(TestWaitForMessage(DiagResID, 100)) 
    {
      // 否定响应格式验证 
      if(this.byte(0) == 0x7F &&        // 否定响应标识 
         this.byte(1) == ResetSID &&    // 服务ID回显 
         this.byte(2) == ExpectedNRC) 
      {
        actualNRC = this.byte(2);
        testStepPass("收到预期NRC=0x%02X", ExpectedNRC);
        break;
      }
      // 异常响应处理 
      else if(this.byte(0) == 0x7F) 
      {
        actualNRC = this.byte(2);
        testStepFail("收到错误NRC=0x%02X", actualNRC);
        break;
      }
    }
  }
  
  // ███ 阶段3:综合结果判定 ███ 
  testStep("STEP3 最终结果确认");
  if(actualNRC == ExpectedNRC) {
    testCasePass("参数越界检测机制正常");
  } else if(actualNRC == 0x00) {
    testCaseFail("ECU无响应");
  } else {
    testCaseFail("NRC异常(实际:0x%02X)", actualNRC);
  }
}
 
/*----------------------------------------------------------
  总线监控扩展模块(调试辅助)
----------------------------------------------------------*/
on message DiagResID 
{
  // 实时显示诊断响应 
  if(this.byte(0) == 0x7F) {
    testAddLog("收到NRC=0x%02X @%dms", 
              this.byte(2), timeNow() - testGetStartTime());
  }
}

流程图解(执行逻辑可视化)
Tester ECU 复位请求(0x11 0x01 0xAA) 参数有效性校验 NRC=0x31 验证响应码正确性 Tester ECU

关键参数说明表

参数名称 示例值 工程校准要点
非法参数值 0xAA 需覆盖OEM定义的参数范围
响应超时窗口 500ms 需大于ECU最大处理时间2倍
否定响应格式 7F 11 31 ISO 14229标准响应结构
参数校验机制 范围检查 需验证ECU参数表完整性

工业级增强功能

  1. 参数遍历测试

    cpp 复制代码
    void ExecuteParamRangeTest() {
      // 扩展测试:
      // 1. 遍历所有非法参数值(0x00-0xFF)
      // 2. 边界值测试(0x00,0x01,0xFE,0xFF)
      // 3. 随机参数注入 
    }
  2. ECU状态监控

    cpp 复制代码
    on sysvar ECU::ParameterCheck {
      testAddLog("参数校验状态码:0x%02X", @this::ParameterCheck);
    }
  3. 压力测试扩展

    cpp 复制代码
    void ExecuteStressTest() {
      // 可扩展:
      // 1. 连续发送100次非法请求 
      // 2. 混合合法/非法请求 
      // 3. 总线负载90%场景测试 
    }

测试执行说明

  1. 环境配置建议

    ini 复制代码
    [Diagnostic]
    P2Server_Max = 3000 
    P3Server_Timeout = 10000 
  2. 结果判定矩阵

    检查项 通过标准 验证方法
    响应格式 7F 11 31三字节结构 报文解析
    响应时间 ≤250ms 时间戳比对
    ECU行为 未触发任何复位操作 电源监控
    日志记录 记录非法参数访问事件 安全日志分析

调试技巧:

  1. Write窗口添加过滤条件快速定位关键报文:

    bash 复制代码
    id == 733h && (byte(0) == 7Fh || byte(0) == 51h)
  2. 使用Graphic窗口监控关键信号:

    ini 复制代码
    sysvar::ECU::ResetAttempts 
    sysvar::Diag::InvalidParamCount 
  3. 添加总线触发条件捕获异常:

    cpp 复制代码
    on message DiagResID {
      if(this.byte(0) == 0x7F && this.byte(2) != 0x31) {
        write("发现异常NRC: 0x%02X", this.byte(2));
        break;
      }
    }
相关推荐
非凡ghost3 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
云间月13145 小时前
飞算JavaAI智慧教育场景实践:从个性化学习到教学管理的全链路技术革新
学习·飞算javaai挑战赛
weixin_456904276 小时前
一文讲清楚Pytorch 张量、链式求导、正向传播、反向求导、计算图等基础知识
人工智能·pytorch·学习
Python私教8 小时前
从“Hello World”到“高并发中间件”:Go 语言 2025 系统学习路线图
学习·中间件·golang
Brookty10 小时前
【Java学习】锁、线程死锁、线程安全2
java·开发语言·学习·java-ee
HalvmånEver16 小时前
在 C++ :x86(32 位)和 x64(64 位)的不同
开发语言·c++·学习
艾伦~耶格尔20 小时前
【数据结构进阶】
java·开发语言·数据结构·学习·面试
Binary_ey20 小时前
汽车高位制动灯难达 CIE 标准?OAS 光学软件高效优化破局
汽车·软件需求·光学软件·车灯设计
Janspran20 小时前
嵌入式linux学习 -- 进程和线程
linux·运维·学习