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

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

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

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

TC10-004测试用例

用例ID测试场景验证要点参考条款预期结果
TC10-004非法子功能码检测发送0x10 0x04(无效子功能)§7.3.2返回NRC=0x12(子功能不支持)
/*-------------------------------------------------------------------
  测试用例 TC10-004:非法子功能码检测 
  标准依据:ISO 14229-1 §7.3.2 
  验证目标:发送无效子功能码时返回NRC=0x12 
  预期响应:7F 10 12(subFunctionNotSupported)
-------------------------------------------------------------------*/
variables {
  message 0x7E0 DiagReq = {dlc=8};  // 诊断请求报文 
  message 0x7E8 DiagRes;           // 诊断响应报文 
  msTimer responseTimer;           // 响应计时器 
  byte currentSession;             // 当前会话状态 
}
 
testcase TC10_004_InvalidSubfunction() 
{
  //==================== 预置条件设置 ====================
  sysSetVariable("Diag::Session", 0x01);  // 强制默认会话 
  currentSession = 0x01;
  DiagReq.dlc = 2;                 // 初始化DLC 
  
  //==================== 测试步骤执行 ====================
  // 步骤1:发送非法子功能请求 
  DiagReq.byte(0) = 0x10;          // 诊断会话控制服务 
  DiagReq.byte(1) = 0x04;          // 无效子功能码(0x04)
  output(DiagReq);                 // 发送请求 
  
  //==================== 响应验证 ====================
  testWaitForMessage(0x7E8, 1500); // 1.5秒响应超时 
  
  // 情况1:通信超时 
  if(TestGetLastError() == teTimeout) {
    testStepFail("错误:ECU未在1.5秒内响应");
    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) == 0x12) {  // NRC校验 
      testStepPass("收到预期NRC 0x12");
      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 %02X %02X", 
                DiagRes.byte(0), DiagRes.byte(1), DiagRes.byte(2));
  }
 
  //==================== 后置清理 ====================
  // 发送有效请求恢复会话 
  DiagReq.byte(1) = 0x01;          // 有效子功能码 
  output(DiagReq);
  testWaitForMessage(0x7E8, 1000); // 等待会话确认 
}
 
/*------------------------- 执行日志示例 ------------------------- 
[2025-02-15 11:16:32] TC10-004 测试启动 
[2025-02-15 11:16:32] 当前会话状态:0x01 
[2025-02-15 11:16:32] 发送请求: 10 04 @ 7E0 
[2025-02-15 11:16:32] 收到响应: 7F 10 12 @ 7E8 
[2025-02-15 11:16:32] 测试通过:子功能校验生效 
[2025-02-15 11:16:33] 恢复默认会话成功 
----------------------------------------------------------------*/

代码执行流程图

0x10 0x04
初始化
状态检查
发送非法请求
响应监控
|超时|
通信故障
|7F响应|
NRC校验
|0x12|
测试通过
|其他|
校验失败
|50响应|
协议漏洞
恢复会话

关键实现说明

  1. 三级响应验证体系
if(DiagRes.byte(0) == 0x7F 
   && DiagRes.byte(1) == 0x10 
   && DiagRes.byte(2) == 0x12) {
  // 完整匹配否定响应 
}
  1. 动态DLC适配机制
DiagReq.dlc = (this.msgChannel == CAN_CHANNEL_HSCAN) ? 3 : 2; // 根据总线类型调整 
  1. 会话状态追踪器
on sysvar Diag::Session {
  currentSession = @this;
  write("会话状态变更记录:0x%02X @ %dms", currentSession, timeNow());
}

测试场景矩阵

测试用例请求报文预期响应通过标准
有效子功能(0x01)10 0150 01不在此用例范围
无效子功能(0x04)10 047F 10 12当前用例验证目标
边界值测试(0x00)10 007F 10 12需额外测试用例覆盖
超范围值测试(0xFF)10 FF7F 10 12需额外测试用例覆盖

增强型诊断功能

  1. 自动重试机制
// 添加重试逻辑(最多3次)
for(int i=1; i<=3; i++) {
  output(DiagReq);
  if(testWaitForMessage(0x7E8, 1000)) break;
  write("第%d次重试...", i);
}
  1. 总线干扰测试
// 注入干扰报文 
message 0x555 Disturbance = {0xAA, 0xBB, 0xCC, 0xDD};
output(Disturbance);  // 发送干扰帧 
  1. 时序精确测量
// 精确记录响应时间 
dword requestTime = timeNow();
testWaitForMessage(0x7E8, 1500);
dword responseTime = timeNow() - requestTime;
write("响应延迟:%dms", responseTime);

操作注意事项:

  1. 测试前确认ECU诊断数据库已加载最新版本
  2. 使用CANoe的Trace窗口过滤7E07E8报文
  3. 建议执行以下扩展测试:
    • 连续发送10次非法请求测试稳定性
    • 在不同总线负载条件下(20%, 50%, 80%)重复测试
    • 组合测试:先发送有效请求再发送无效请求

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

  1. PreTest中执行环境检查:
    if(sysGetVariable("Diag::Session") != 0x01) {
      testReportWarning("预检查失败:ECU未处于默认会话");
    }
    
  2. 建议配合使用testReportPicture记录关键测试步骤
  3. 完整测试需要包含至少10次边界值测试循环

相关文章:

  • 蓝桥杯篇---超声波距离测量频率测量
  • 1-7 gitee代码推送问题
  • Spark 和 Flink
  • 浅识Linux高阶用法
  • 【系统架构设计师】虚拟机体系结构风格
  • 基于 SpringBoot 的 4S店车辆管理系统 系统的设计与实现
  • 【Springboot知识】从零开始配置springfox
  • vue字符串的常用方法,截取字符串,获取字符串长度,检索字符串
  • 基于Go语言 XTA AI聊天界面实现
  • STM32F10X 启动文件完整分析
  • 哈希表(典型算法思想)—— OJ例题算法解析思路
  • CAS单点登录(第7版)24.高可用性
  • Java知识速记:ArrayList与LinkedList的区别
  • Windows上安装Redis
  • TypeScript 与后端开发Node.js
  • Java中的分布式(概念说明)
  • 类与对象C++详解(上)
  • CF 148A.Insomnia cure(Java实现)
  • Linux服务器磁盘空间不足的全方位应对指南
  • Spring中的IOC详解
  • 美国明尼苏达州发生山火,过火面积超80平方公里
  • 事关心脏健康安全,经导管植入式人工心脏瓣膜国家标准发布
  • 比特币挖矿公司GRYP股价涨超171%:将与特朗普儿子创设的公司合并
  • 城市轨道交通安全、内河港区布局规划、扎实做好防汛工作……今天的上海市政府常务会议研究了这些重要事项
  • 中方代表团介绍中美经贸高层会谈有关情况:双方一致同意建立中美经贸磋商机制
  • 西甲上海足球学院揭幕,用“足球方法论”试水中国青训