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


ISO 14229-1:2023 UDS诊断【WriteDataByIdentifier0x2E服务】_TestCase06

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

TC2E-006测试用例

用例ID 测试场景 验证要点 参考条款 预期结果
TC2E-006 跨会话模式权限验证 在默认会话下请求写入需扩展会话的DID §7.4.5.3.5 返回NRC=0x7E(服务不支持)
/*----------------------------------------------------------------*/
/* 测试用例:TC2E-006_跨会话权限验证_CAPL2010.can                  */
/* 适用标准:ISO 14229-1 (2023)                                  */
/* 开发环境:CANoe 10.0 + CAPL 2010                              */
/* 修订记录:2025-02-24 适配CAPL 2010标准库                      */
/*----------------------------------------------------------------*/
 
variables {
  // ===== 诊断参数配置 ===== 
  const int cDefaultSession = 0x01;   // 默认会话标识符 
  const int cTargetDID = 0xF120;      // 目标诊断标识符 
  const long cTimeout = 2000;         // 响应超时时间(ms)
  
  // ===== 全局变量 ===== 
  msTimer tResponseTimer;             // 响应计时器 
  message 0x732 DiagReqMsg = { dlc=5 }; // 诊断请求报文(物理寻址)
  int gSessionState = 0xFF;           // 当前会话状态缓存 
}
 
// ========== 测试用例主函数 ==========
testcase TC2E_006() {
  // === 步骤1:进入默认会话 === 
  DiagReqMsg.byte(0) = 0x10;  // 10服务 
  DiagReqMsg.byte(1) = 0x01;  // 子服务:默认会话 
  DiagReqMsg.dlc = 2;
  output(DiagReqMsg);         // 发送会话控制请求 
  
  // 等待会话切换完成(CAPL2010需同步等待)
  testWaitForTimeout(500);
  
  // === 手动验证会话状态 === 
  DiagReqMsg.byte(0) = 0x3E;  // 发送TesterPresent维持会话 
  DiagReqMsg.byte(1) = 0x80;  // 抑制响应位 
  DiagReqMsg.dlc = 2;
  output(DiagReqMsg);
  
  // === 步骤2:发送2E服务请求 === 
  DiagReqMsg.byte(0) = 0x2E;                    // 服务ID 
  DiagReqMsg.byte(1) = (cTargetDID >> 8) & 0xFF; // DID高字节 
  DiagReqMsg.byte(2) = cTargetDID & 0xFF;        // DID低字节 
  DiagReqMsg.byte(3) = 0xAA;                    // 数据字节1 
  DiagReqMsg.byte(4) = 0xBB;                    // 数据字节2 
  DiagReqMsg.dlc = 5;
  output(DiagReqMsg);
  
  // === 步骤3:启动超时监控 === 
  setTimer(tResponseTimer, cTimeout);
}
 
// ========== 事件处理器 ==========
on timer tResponseTimer {
  write("ERROR: ECU未在指定时间内响应");
}
 
on message 0x73A {  // 诊断响应报文监听 
  cancelTimer(tResponseTimer);
  
  // === 响应数据分析 === 
  if(this.dlc >= 3) {
    if(this.byte(0) == 0x7F &&    // 否定响应标识 
       this.byte(1) == 0x2E &&    // 服务ID 
       this.byte(2) == 0x7E)      // NRC 0x7E 
    {
      write("PASS: 收到预期NRC 0x7E");
    } else {
      write("FAIL: 收到异常响应[%02X %02X %02X]", 
           this.byte(0), this.byte(1), this.byte(2));
    }
  } else {
    write("FAIL: 无效响应长度DLC=%d", this.dlc); 
  }
}

CAPL 核心特性说明

  1. 基础通信架构

    • 采用message关键字定义原始CAN报文
    • 使用output()函数发送报文(无诊断抽象层)
    • 通过on message事件处理响应
  2. 诊断服务实现

    • 手动构造服务报文(byte(n)逐字节赋值)
    • 需要手动维护会话状态(无diagSetSession等高级函数)
    • 通过0x3E服务维持会话
  3. 时序控制

    • 使用testWaitForTimeout()实现简单延时
    • 通过setTimer/cancelTimer管理超时机制
    • 不支持异步回调,需同步处理流程
  4. 调试输出

    • 采用write()函数输出日志信息
    • testStepPass等现代测试报告函数
    • 依赖CANoe Trace窗口观察原始报文

工程适配指南

  1. 硬件配置

    ; CAN通道配置(CANoe 10.0)
    [CAN_Configuration]
    Baudrate = 500 
    SamplePoint = 80%
    SJW = 1 
    
  2. 诊断数据库要求

    
    <DEFAULT-SESSION>0x01DEFAULT-SESSION>
    <DIAGNOSTIC-SERVICE ID="SID_2E" >
      <REQUEST>
        <PARAMETER BYTE-POSITION="0">0x2EPARAMETER>
      REQUEST>
    DIAGNOSTIC-SERVICE>
    
  3. 测试执行流程

    [步骤]
    1. 启动CANoe工程 
    2. 加载CDD诊断描述文件 
    3. 激活Test Module 
    4. 执行TC2E_006测试用例 
    5. 在Trace窗口观察报文交互 
    

结尾请关注

关注作者,后续连载更多汽车电子测试知识栏目,包括不限于:汽车控制器测试全流程解析、常见故障排查案例、测试工具深度教程、行业协议解读、行业前沿与职业发展之《2024年汽车电子测试工程师必备技能TOP10:掌握Python自动化测试年薪涨5W?》、《汽车控制器测试工程师面试指南:如何用STAR法则拿下30W Offer?》、《零基础玩转汽车电子测试:从CANoe到HIL实战》、《CANoe自动化测试框架(支持XCP标定+UDS诊断)》

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