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

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

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

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

TC10-005测试用例

用例ID测试场景验证要点参考条款预期结果
TC10-005默认会话切换至扩展会话发送0x10 0x03请求扩展会话§7.4.1收到0x50 0x03响应
/*-------------------------------------------------------------------
  测试用例 TC10-005:默认会话切换至扩展会话 
  标准依据:ISO 14229-1 §7.4.1 
  验证目标:成功切换至扩展会话模式 
  预期响应:0x50 0x03(肯定响应)
-------------------------------------------------------------------*/
variables {
  message 0x7E0 DiagReq = {dlc=8};  // 诊断请求报文 
  message 0x7E8 DiagRes;           // 诊断响应报文 
  msTimer sessionTimer;            // 会话计时器 
  byte currentSession;             // 当前会话状态 
}
 
testcase TC10_005_DefaultToExtendedSession() 
{
  //==================== 预置条件设置 ====================
  sysSetVariable("Diag::Session", 0x01);  // 强制默认会话 
  currentSession = 0x01;
  
  // 验证初始状态 
  if(sysGetVariable("Diag::Session") != 0x01) {
    testStepAbort("初始化失败:ECU未处于默认会话");
    return;
  }
 
  //==================== 测试步骤执行 ====================
  // 步骤1:发送扩展会话请求 
  DiagReq.byte(0) = 0x10;          // 诊断会话控制服务 
  DiagReq.byte(1) = 0x03;          // 子功能:扩展会话 
  DiagReq.dlc = 2;
  output(DiagReq);                 // 发送请求 
  
  //==================== 响应验证 ====================
  testWaitForMessage(0x7E8, 1000); // 1秒响应超时 
  
  // 情况1:通信超时 
  if(TestGetLastError() == teTimeout) {
    testStepFail("错误:ECU未在1秒内响应");
    return;
  }
  
  // 情况2:收到肯定响应 
  if(DiagRes.byte(0) == 0x50 && DiagRes.byte(1) == 0x03) {
    testStepPass("成功进入扩展会话");
    write("当前会话状态:0x%02X", sysGetVariable("Diag::Session"));
    
    // 验证系统变量同步更新 
    if(sysGetVariable("Diag::Session") == 0x03) {
      testStepPass("会话状态同步验证通过");
    } else {
      testStepFail("会话状态未更新(当前:0x%02X)", 
                  sysGetVariable("Diag::Session"));
    }
  }
  // 情况3:收到否定响应 
  else if(DiagRes.byte(0) == 0x7F) {
    testStepFail("收到否定响应 NRC=0x%02X", DiagRes.byte(2));
  }
  // 情况4:无效响应 
  else {
    testStepFail("收到未知响应:0x%02X %02X", 
                DiagRes.byte(0), DiagRes.byte(1));
  }
 
  //==================== 后置清理 ====================
  // 恢复默认会话 
  DiagReq.byte(1) = 0x01;          // 默认会话子功能 
  output(DiagReq);
  testWaitForMessage(0x7E8, 500);  // 等待会话恢复确认 
}
 
/*------------------------- 执行日志示例 ------------------------- 
[2025-02-15 14:35:12] TC10-005 测试启动 
[2025-02-15 14:35:12] 当前会话状态:0x01 
[2025-02-15 14:35:12] 发送请求: 10 03 @ 7E0 
[2025-02-15 14:35:12] 收到响应: 50 03 @ 7E8 
[2025-02-15 14:35:12] 系统会话状态已更新:0x03 
[2025-02-15 14:35:12] 测试通过:成功进入扩展会话 
[2025-02-15 14:35:13] 恢复默认会话成功 
----------------------------------------------------------------*/

代码执行流程图

测试系统 ECU 强制设置默认会话(0x01) 确认会话状态 发送10 03请求 响应50 03 验证会话状态更新 发送恢复默认会话请求 确认响应 测试系统 ECU

关键实现说明

  1. 双重状态验证机制
// 报文响应验证 
if(DiagRes.byte(0) == 0x50 && DiagRes.byte(1) == 0x03) 
 
// 系统变量验证 
if(sysGetVariable("Diag::Session") == 0x03)
  1. 动态总线适配
// 自动检测总线类型设置DLC 
DiagReq.dlc = (this.msgChannel == CAN_CHANNEL_HSCAN) ? 3 : 2;
  1. 实时会话监控
on sysvar Diag::Session {
  currentSession = @this;
  write("实时会话状态:0x%02X", currentSession);
}

增强型错误处理

  1. 连续状态监测
// 添加会话状态变化监控 
on sysvar Diag::Session changed {
  testReportPicture("会话状态变更", 
                   "时间:%t 状态:0x%02X", 
                   timeNow(), @this);
}
  1. 电压波动测试
// 模拟电压波动场景 
sysSetVariable("PowerVoltage", 13.5);
testWaitForTimeout(1000);
sysSetVariable("PowerVoltage", 10.5);
  1. 异常报文注入
// 在测试过程中注入错误报文 
message 0x123干扰报文 = {0xAA, 0xBB, 0xCC};
output(干扰报文);

操作指南:

  1. 使用CANoe的Graphics窗口监控Diag::Session变量
  2. Diagnostic Console中手动验证会话状态
  3. 建议测试步骤:
    • 冷启动立即测试
    • 热复位后测试
    • 连续执行10次切换操作测试稳定性
  4. 使用testReportMerge合并多轮测试结果

将本代码集成到CANoe Test Module时需注意:

  1. 确认ECU诊断数据库已加载0x10服务定义
  2. Test Setup中设置Diag::Session变量的读写权限
  3. 建议配合使用IL层日志记录详细通信过程

遇到测试失败时可参考以下排查步骤:

  1. 检查ECU的诊断地址配置
  2. 验证ECU软件版本是否支持扩展会话
  3. 使用Bus Statistics分析总线负载情况
  4. 检查测试序列中是否存在会话冲突操作
http://www.dtcms.com/a/20049.html

相关文章:

  • 初阶数据结构:树---二叉树的链式结构
  • LeetCode1706
  • 使用 React 16+Webpack 和 pdfjs-dist 或 react-pdf 实现 PDF 文件显示、定位和高亮
  • [Java网络安全系列面试题] GET 和 POST 的区别在哪里?
  • 1441. 用栈操作构建数组 中等
  • 《当DeepSeek遇上豆包:AI大模型的华山论剑》
  • 我用 Cursor 开发了一款个人小记系统
  • B站视频同步思维导图(全)
  • 利用AI智能体创建云端文档知识库并集成第三方数据源(下)
  • 开发指南101-拖动排序
  • 细说STM32F407单片机RTC的基本原理及闹钟和周期唤醒功能的使用方法
  • kafka生产端之架构及工作原理
  • 【弹性计算】容器、裸金属
  • [C++语法基础与基本概念] std::function与可调用对象
  • 亚远景-ASPICE 4.0与敏捷开发:如何实现高效协同
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-tuner.py
  • CAS单点登录(第7版)8.委托和代理
  • (PC+WAP) PbootCMS中小学教育培训机构网站模板 – 绿色小学学校网站源码下载
  • 1219:马走日
  • android studio下载安装汉化-Flutter安装
  • Shader示例 6: 卡渲基础 - 描边 + 着色
  • VisualStudio 2012 fatal error C1083: 无法打开包括文件:“stdio.h 找不到 sdkddkver.h
  • 【算法与数据结构】并查集详解+题目
  • CF91B Queue
  • 数组_有序数组的平方
  • 基于 ollama 在linux 私有化部署DeepSeek-R1以及使用RESTful API的方式使用模型
  • 机器学习:k均值
  • x-restormer——restormer+SSA
  • 【算法】【区间和】acwing算法基础 802. 区间和 【有点复杂,但思路简单】
  • 本地部署MindSearch(开源 AI 搜索引擎框架),然后上传到 hugging face的Spaces——L2G6