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

【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次边界值测试循环

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

相关文章:

  • Qt 中使用 ffmpeg 获取采集卡数据录制视频
  • i++和++i的区别
  • 计算机网络(涵盖OSI,TCP/IP,交换机,路由器,局域网)
  • 从零到一实现微信小程序计划时钟:完整教程
  • C语言【基础篇】之函数——开启模块化开发的钥匙
  • Node.js和浏览器对JavaScript的支持区别
  • 基于STM32的智能环境监测系统
  • 完整实现CNN(Faster-RCNN)模型和Transformer(DETR)模型下遥感影像目标检测流程
  • 网站搭建基本流程
  • 华为 eNSP:MSTP
  • 使用linux脚本部署discuz博客(详细注释版)
  • 如何最优雅地部署 AWS Lambda?Lambda Version 与 Alias 的最佳实践
  • Sa-Token 根据官方文档简单实现登录认证的示例
  • 机器学习·最近邻方法(k-NN)
  • 【算法】快排
  • harbor安装教程
  • PHP支付宝--转账到支付宝账户
  • 数据结构:最小生成树
  • 个人博客测试报告
  • SMU寒假训练第三周周报