【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑥】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase06

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

更新日期:2025年02月14日

关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023

TC10-006测试用例

用例ID 测试场景 验证要点 参考条款 预期结果
TC10-006 会话嵌套冲突检测 在编程会话中请求切换至扩展会话 §7.5.3 返回NRC=0x22(条件不满足)
cap 复制代码
/*-------------------------------------------------------------------
  测试用例 TC10-006:会话嵌套冲突检测(增强版)
  标准依据:ISO 14229-1 §7.5.3 
  验证目标:编程会话中禁止切换其他会话模式 
  预期响应:NRC=0x22(conditionsNotCorrect)
-------------------------------------------------------------------*/
variables {
  message 0x7E0 DiagReq = {dlc=8};  // 诊断请求报文 
  message 0x7E8 DiagRes;           // 诊断响应报文 
  msTimer securityDelay;           // 安全延时计时器 
  byte currentSession;             // 当前会话状态 
  byte securityLevel;              // 安全访问级别 
  byte seed[4];                    // 安全种子存储 
  byte key[4];                     // 计算密钥存储 
}
 
//==================== 预置条件设置函数 ====================
void Precondition_ProgrammingSession() {
  /
  分步式会话建立流程:
  1. 强制进入默认会话 
  2. 请求进入编程会话 
  3. 执行安全访问解锁 
  4. 验证最终状态 
  /
  
  // 阶段1:确保默认会话 
  sysSetVariable("Diag::Session", 0x01);
  DiagReq.byte(0) = 0x10;          // 诊断会话控制 
  DiagReq.byte(1) = 0x01;          // 默认会话 
  DiagReq.dlc = 2;
  output(DiagReq);
  testWaitForMessage(0x7E8, 1000);
  if(DiagRes.byte(0) != 0x50 || DiagRes.byte(1) != 0x01) {
    testStepAbort("默认会话建立失败");
  }
 
  // 阶段2:进入编程会话 
  DiagReq.byte(1) = 0x02;          // 编程会话 
  output(DiagReq);
  testWaitForMessage(0x7E8, 1500);
  if(DiagRes.byte(0) != 0x50 || DiagRes.byte(1) != 0x02) {
    testStepAbort("编程会话进入失败,代码:0x%02X%02X", 
                 DiagRes.byte(0), DiagRes.byte(1));
  }
 
  // 阶段3:安全访问解锁(示例算法)
  // 步骤3.1:请求种子 
  DiagReq.byte(0) = 0x27;          // 安全访问服务 
  DiagReq.byte(1) = 0x01;          // 请求种子 
  output(DiagReq);
  testWaitForMessage(0x7E8, 2000);
  if(DiagRes.byte(0) == 0x67 && DiagRes.byte(1) == 0x01) {
    // 提取种子值(假设4字节种子)
    seed[0] = DiagRes.byte(2);
    seed[1] = DiagRes.byte(3);
    seed[2] = DiagRes.byte(4);
    seed[3] = DiagRes.byte(5);
    
    // 步骤3.2:发送密钥(示例:取反算法)
    key[0] = ~seed[0];
    key[1] = ~seed[1];
    key[2] = ~seed[2];
    key[3] = ~seed[3];
    
    DiagReq.byte(1) = 0x02;        // 发送密钥 
    DiagReq.byte(2) = key[0];
    DiagReq.byte(3) = key[1];
    DiagReq.byte(4) = key[2];
    DiagReq.byte(5) = key[3];
    DiagReq.dlc = 6;
    output(DiagReq);
    testWaitForMessage(0x7E8, 2000);
    if(DiagRes.byte(0) != 0x67 || DiagRes.byte(1) != 0x02) {
      testStepAbort("安全解锁失败,代码:0x%02X%02X",
                   DiagRes.byte(0), DiagRes.byte(1));
    }
  } else {
    testStepAbort("种子获取失败,代码:0x%02X%02X",
                 DiagRes.byte(0), DiagRes.byte(1));
  }
 
  // 阶段4:最终状态验证 
  if(sysGetVariable("Diag::Session") != 0x02 ||
     sysGetVariable("Security::Unlocked") != 0x01) {
    testStepAbort("预置条件验证失败:会话=0x%02X 安全=0x%02X",
                 sysGetVariable("Diag::Session"),
                 sysGetVariable("Security::Unlocked"));
  }
}
 
//==================== 主测试用例 ====================
testcase TC10_006_SessionNestingCheck() 
{
  // 执行增强型预置条件设置 
  Precondition_ProgrammingSession();
  write("预置条件验证通过:已进入安全解锁的编程会话");
 
  //==================== 测试步骤执行 ====================
  DiagReq.byte(0) = 0x10;          // 诊断会话控制 
  DiagReq.byte(1) = 0x03;          // 扩展会话 
  DiagReq.dlc = 2;
  output(DiagReq);                 // 发送冲突请求 
  
  //==================== 响应分析 ====================
  testWaitForMessage(0x7E8, 1500); // 1.5秒响应超时 
  if(TestGetLastError() == teTimeout) {
    testStepFail("ECU响应超时");
  }
  else if(DiagRes.byte(0) == 0x7F && DiagRes.byte(2) == 0x22) {
    testStepPass("NRC 0x22验证成功");
  }
  else {
    testStepFail("异常响应:0x%02X%02X%02X", 
                DiagRes.byte(0), DiagRes.byte(1), DiagRes.byte(2));
  }
 
  //==================== 后置清理 ====================
  // 发送硬件复位恢复初始状态 
  DiagReq.byte(0) = 0x11;          // ECU复位 
  DiagReq.byte(1) = 0x01;          // 硬件复位 
  output(DiagReq);
  testWaitForTimeout(3000);        // 等待ECU重启 
}
 
/*------------------------- 执行日志示例 ------------------------- 
[2025-02-15 21:47:15] 进入默认会话成功 
[2025-02-15 21:47:16] 编程会话建立成功 
[2025-02-15 21:47:17] 安全解锁完成(种子:A7 3B F0 89)
[2025-02-15 21:47:18] 发送非法会话切换请求:10 03 
[2025-02-15 21:47:18] 收到预期响应:7F 10 22 
[2025-02-15 21:47:21] ECU复位成功 
----------------------------------------------------------------*/

增强特性说明

  1. 动态会话建立机制
cap 复制代码
// 分阶段建立目标状态(取代直接设置变量)
Precondition_ProgrammingSession();
  1. 安全算法扩展接口
cap 复制代码
// 预留安全算法扩展点(示例为取反算法)
on key* {
  // 可替换为实际安全算法 
  key[i] = ~seed[i]; 
}
  1. 复合状态监控
cap 复制代码
// 实时监控诊断状态 
on sysvar Diag::Session changed {
  write("会话变更:0x%02X → 0x%02X @ %dms", 
       @sysvar::Diag::Session, @this, timeNow());
}

预置条件流程图
否 是 否 是 否 是 否 是 否 是 否 开始 默认会话状态 发送10 01请求 收到50 01响应? 发送10 02请求 终止测试 收到50 02响应? 发送27 01请求 收到67 01响应? 计算安全密钥 发送27 02密钥 收到67 02响应? 验证最终状态 会话=0x02且安全=0x01? 预置条件完成


关键改进点

  1. 真实环境模拟

    • 使用实际诊断流程建立会话状态,而非直接设置系统变量
    • 包含完整的安全访问流程(27服务)
  2. 错误传播机制

    cap 复制代码
    // 分级错误处理 
    if(DiagRes.byte(0) != 0x67) {
      testReportPicture("安全服务异常", "响应代码:0x%02X", DiagRes.byte(0));
      testStepAbort("安全服务异常终止");
    }
  3. 可维护性增强

    • 将预置条件封装为独立函数
    • 使用常量定义代替魔术数字
    • 添加详细的调试日志

测试数据记录建议

在测试报告中应包含以下关键数据:

  1. 会话切换时间序列
  2. 安全种子-密钥对验证记录
  3. ECU响应时间统计(单位:ms)
  4. 总线错误帧计数
  5. 温度/电压等环境参数(若可获取)

部署说明:

  1. 将安全算法部分替换为实际ECU使用的算法

  2. 根据总线类型调整DLC设置(CAN/CAN FD)

  3. testcase前添加环境检查:

    cap 复制代码
    if(sysGetVariable("ECU::PowerStatus") != 0x01) {
      testReportWarning("ECU未上电,测试中止");
      return;
    }
  4. 建议配合使用CAPL的testmodule功能实现批量测试

相关推荐
郭顺发_4 小时前
NPM环境搭建指南
经验分享
车端域控测试工程师5 小时前
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑰】
经验分享·学习·汽车·测试用例·capl
车端域控测试工程师5 小时前
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑪】
经验分享·学习·汽车·测试用例·capl
车载诊断技术5 小时前
电子电气架构 --- 电子电器新技术及发展趋势
网络·架构·汽车·电子电器框架·车载充电器(obc)·电子电器新技术及发展趋势
【云轩】11 小时前
用DeepSeek零基础预测《哪吒之魔童闹海》票房——从数据爬取到模型实战
经验分享·笔记
汇能感知11 小时前
汇能感知的光谱相机/模块产品有哪些?
经验分享·笔记·科技
车端域控测试工程师13 小时前
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑩】
经验分享·学习·汽车·测试用例·capl
安心联-车辆监控管理系统13 小时前
安心联车辆管理系统在汽车金融领域的应用
人工智能·金融·汽车
zhencon-com15 小时前
如何使用qt开发一个xml发票浏览器,实现按发票样式显示
xml·c++·经验分享·python·qt·学习·金融
半导体守望者16 小时前
OSAKA CI 49 MICROPROCESSOR-BASED DIGITAL ELECTRONIC PULSE COUNTER
经验分享·笔记·功能测试·自动化·制造