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

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

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

作者:车端域控测试工程师
更新日期:2025年02月15日
关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023

TC10-003测试用例

用例ID测试场景验证要点参考条款预期结果
TC10-003编程会话安全校验未通过安全访问时禁止进入编程会话§7.4.2返回NRC=0x33(安全访问拒绝)
/*-------------------------------------------------------------------
  测试用例 TC10-003:编程会话安全校验 
  标准依据:ISO 14229-1 §7.4.2 
  验证目标:未通过安全访问时禁止进入编程会话 
  预期响应:NRC=0x33(securityAccessDenied)
-------------------------------------------------------------------*/
variables {
  message 0x7E0 DiagReq = {dlc=8};  // 诊断请求报文 
  message 0x7E8 DiagRes;           // 诊断响应报文 
  msTimer securityTimer;           // 安全状态监测计时器 
  byte currentSession;             // 当前会话状态跟踪 
  byte securityLevel;              // 安全访问级别 
}
 
testcase TC10_003_ProgrammingSessionSecurity() 
{
  //==================== 预置条件设置 ====================
  // 强制重置诊断会话和安全状态 
  sysSetVariable("Diag::Session", 0x01);  // 默认会话 
  sysSetVariable("Security::Unlocked", 0); // 安全锁状态 
  currentSession = 0x01;
  securityLevel = 0x00;
  
  // 验证初始状态 
  if(sysGetVariable("Diag::Session") != 0x01) {
    testStepAbort("初始化失败:ECU未处于默认会话");
  }
 
  //==================== 测试步骤执行 ====================
  // 步骤1:直接尝试进入编程会话 
  DiagReq.byte(0) = 0x10;          // 诊断会话控制服务 
  DiagReq.byte(1) = 0x02;          // 编程会话 
  DiagReq.dlc = 2;
  output(DiagReq);                 // 发送请求 
  
  //==================== 响应验证 ====================
  // 设置双重验证机制 
  testWaitForMessage(0x7E8, 1500); // 等待响应1.5秒 
  
  // 情况1:未收到任何响应 
  if(TestGetLastError() == teTimeout) {
    testStepFail("错误:ECU未响应请求");
    return;
  }
  
  // 情况2:收到否定响应 
  if(DiagRes.byte(0) == 0x7F) {
    // 三级验证逻辑 
    if(DiagRes.byte(1) != 0x10) {  // 验证服务ID 
      testStepFail("服务ID不匹配,收到0x%02X", DiagRes.byte(1));
      return;
    }
    
    if(DiagRes.byte(2) == 0x33) {  // 验证NRC代码 
      testStepPass("收到预期NRC 0x33");
      write("安全校验机制生效");
    } else {
      testStepFail("错误NRC代码:0x%02X", DiagRes.byte(2));
    }
  }
  // 情况3:意外收到肯定响应 
  else if(DiagRes.byte(0) == 0x50) {
    testStepFail("安全校验失效!收到正响应");
    sysSetVariable("Diag::Session", 0x01); // 强制恢复默认会话 
  }
  // 情况4:无效响应 
  else {
    testStepFail("收到无效响应:0x%02X", DiagRes.byte(0));
  }
 
  //==================== 后置清理 ====================
  // 发送默认会话恢复请求 
  DiagReq.byte(1) = 0x01;          // 子功能:默认会话 
  output(DiagReq);
  testWaitForMessage(0x7E8, 1000); // 等待会话恢复确认 
}
 
/*------------------------- 执行日志示例 ------------------------- 
[2025-02-15 10:35:12] TC10-003 测试启动 
[2025-02-15 10:35:12] 当前会话状态:0x01 
[2025-02-15 10:35:12] 发送请求: 10 02 @ 7E0 
[2025-02-15 10:35:12] 收到响应: 7F 10 33 @ 7E8 
[2025-02-15 10:35:12] 测试通过:安全访问拒绝机制生效 
[2025-02-15 10:35:13] 恢复默认会话成功 
----------------------------------------------------------------*/

代码执行流程图

默认会话&安全锁定
初始化
状态检查
发送请求
响应监控
|超时|
失败处理
|收到7F|
NRC验证
|0x33|
测试通过
|其他|
|收到50|
严重错误
恢复默认会话

关键实现说明

  1. 三重状态验证机制
// 状态同步检查 
if(sysGetVariable("Diag::Session") != 0x01 
   || sysGetVariable("Security::Unlocked") != 0) {
  testStepAbort("预置条件不满足");
}
  1. 动态DLC管理
DiagReq.dlc = 2 + (this.msgChannel == CAN_CHANNEL_HSCAN ? 1 : 0); // 自动适应总线类型 
  1. 安全状态实时监控
on sysvar Security::Unlocked {
  securityLevel = @this;
  write("安全状态变更:%s", 
       securityLevel ? "解锁" : "锁定");
}

测试用例验证矩阵

测试场景预期响应通过标准
未解锁直接请求编程会话7F 10 33收到精确NRC代码
安全解锁后请求编程会话50 02不在此用例测试范围
异常报文长度7F 10 13需其他用例覆盖
物理层通信中断超时无响应检测通信故障

增强型错误处理方案

  1. 安全校验旁路检测
// 连续三次尝试检测安全机制 
for(int i=0; i<3; i++) {
  output(DiagReq);
  if(DiagRes.byte(0) == 0x50) {
    testReportPicture("安全漏洞", "紧急:安全机制失效!");
    break;
  }
}
  1. 总线负载压力测试
// 在50%总线负载下测试 
setBusLoad(CAN1, 50.0);
testWaitForTimeout(5000);  // 持续5秒压力测试 
  1. 温度边界测试
// 需配合环境箱使用 
if(sysGetVariable("Env::Temperature") < -40) {
  testStepWarning("低温环境测试:%.1f°C", 
                 sysGetVariable("Env::Temperature"));
}

操作指南:

  1. 使用CANoe的Diagnostic Console验证当前安全状态
  2. 通过Trace窗口过滤7E07E8报文
  3. 建议配合CAPL的testReportAddComment添加测试备注
  4. 完整测试需包含以下步骤:
    • 冷启动测试
    • 电压暂降测试(9-16V)
    • 快速上下电循环测试

测试代码可直接集成到CANoe Test Module中,运行时需注意:

  1. 禁用其他可能修改会话状态的测试用例
  2. 确保ECU诊断数据库版本为最新
  3. 建议在测试前执行ECU完整复位操作

遇到NRC 0x33以外的响应时,建议使用以下工具诊断:

  • CANoe的Service Viewer
  • Wireshark抓包分析
  • ECU标定工具检查安全配置

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

相关文章:

  • ffmpeg-cli-wrapper操作ffmpeg的工具
  • Anaconda +Jupyter Notebook安装(2025最新版)
  • 问卷数据分析|SPSS实操之量表描述性统计
  • 服务器硬件知识--------linux系统初识and安装
  • 探索Zephyr在汽车领域的应用潜力与挑战
  • 【LLM】13:大模型算法面试题库
  • kubectl exec 实现的原理
  • 力扣 470. 用 Rand7() 实现 Rand10() 拒绝采样 等概率随机数生成
  • SOCKET建立简单的tcp服务端与客户端通信
  • 【Elasticsearch】match查询
  • Matlab实现POA-BP鹈鹕算法优化BP神经网络多输入多输出预测
  • 简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标
  • HTTP的前世今生:如何塑造现代互联网的交互方式?
  • ML.NET库学习008:使用ML.NET进行心脏疾病预测模型开发
  • Linux运维篇-存储基础知识
  • git开发流程以及github社区企业版
  • Redis未授权访问漏洞导致getshell
  • Moya 网络框架
  • Transformer以及BERT阅读参考博文
  • python大恒相机保存RAW图和实时显示