【ISO14229-1:2023UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析③】
- 开源代码
- 2025-09-10 07:18:01

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] 恢复默认会话成功 ----------------------------------------------------------------*/代码执行流程图
#mermaid-svg-gfuHEDXWmBzeidpA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gfuHEDXWmBzeidpA .error-icon{fill:#552222;}#mermaid-svg-gfuHEDXWmBzeidpA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gfuHEDXWmBzeidpA .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-gfuHEDXWmBzeidpA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gfuHEDXWmBzeidpA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gfuHEDXWmBzeidpA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gfuHEDXWmBzeidpA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gfuHEDXWmBzeidpA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gfuHEDXWmBzeidpA .marker.cross{stroke:#333333;}#mermaid-svg-gfuHEDXWmBzeidpA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gfuHEDXWmBzeidpA defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-gfuHEDXWmBzeidpA g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-gfuHEDXWmBzeidpA g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-gfuHEDXWmBzeidpA g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-gfuHEDXWmBzeidpA g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-gfuHEDXWmBzeidpA g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-gfuHEDXWmBzeidpA .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-gfuHEDXWmBzeidpA .stateGroup posit{fill:white;border-bottom:1px;}#mermaid-svg-gfuHEDXWmBzeidpA .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-gfuHEDXWmBzeidpA .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-gfuHEDXWmBzeidpA .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-gfuHEDXWmBzeidpA .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-gfuHEDXWmBzeidpA .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-gfuHEDXWmBzeidpA .edgeLabel .label text{fill:#333;}#mermaid-svg-gfuHEDXWmBzeidpA .label div .edgeLabel{color:#333;}#mermaid-svg-gfuHEDXWmBzeidpA .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-gfuHEDXWmBzeidpA .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-gfuHEDXWmBzeidpA .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-gfuHEDXWmBzeidpA .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-gfuHEDXWmBzeidpA .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-gfuHEDXWmBzeidpA .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gfuHEDXWmBzeidpA .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gfuHEDXWmBzeidpA #statediagram-barbEnd{fill:#333333;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gfuHEDXWmBzeidpA .cluster-label,#mermaid-svg-gfuHEDXWmBzeidpA .nodeLabel{color:#131300;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-gfuHEDXWmBzeidpA .note-edge{stroke-dasharray:5;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-note text{fill:black;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram-note .nodeLabel{color:black;}#mermaid-svg-gfuHEDXWmBzeidpA .statediagram .edgeLabel{color:red;}#mermaid-svg-gfuHEDXWmBzeidpA #dependencyStart,#mermaid-svg-gfuHEDXWmBzeidpA #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-gfuHEDXWmBzeidpA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 默认会话&安全锁定 初始化 状态检查 发送请求 响应监控 |超时| 失败处理 |收到7F| NRC验证 |0x33| 测试通过 |其他| |收到50| 严重错误 恢复默认会话关键实现说明
三重状态验证机制 // 状态同步检查 if(sysGetVariable("Diag::Session") != 0x01 || sysGetVariable("Security::Unlocked") != 0) { testStepAbort("预置条件不满足"); } 动态DLC管理 DiagReq.dlc = 2 + (this.msgChannel == CAN_CHANNEL_HSCAN ? 1 : 0); // 自动适应总线类型 安全状态实时监控 on sysvar Security::Unlocked { securityLevel = @this; write("安全状态变更:%s", securityLevel ? "解锁" : "锁定"); }测试用例验证矩阵
测试场景预期响应通过标准未解锁直接请求编程会话7F 10 33收到精确NRC代码安全解锁后请求编程会话50 02不在此用例测试范围异常报文长度7F 10 13需其他用例覆盖物理层通信中断超时无响应检测通信故障增强型错误处理方案
安全校验旁路检测 // 连续三次尝试检测安全机制 for(int i=0; i<3; i++) { output(DiagReq); if(DiagRes.byte(0) == 0x50) { testReportPicture("安全漏洞", "紧急:安全机制失效!"); break; } } 总线负载压力测试 // 在50%总线负载下测试 setBusLoad(CAN1, 50.0); testWaitForTimeout(5000); // 持续5秒压力测试 温度边界测试 // 需配合环境箱使用 if(sysGetVariable("Env::Temperature") < -40) { testStepWarning("低温环境测试:%.1f°C", sysGetVariable("Env::Temperature")); }操作指南:
使用CANoe的Diagnostic Console验证当前安全状态通过Trace窗口过滤7E0和7E8报文建议配合CAPL的testReportAddComment添加测试备注完整测试需包含以下步骤: 冷启动测试电压暂降测试(9-16V)快速上下电循环测试 测试代码可直接集成到CANoe Test Module中,运行时需注意: 禁用其他可能修改会话状态的测试用例确保ECU诊断数据库版本为最新建议在测试前执行ECU完整复位操作 遇到NRC 0x33以外的响应时,建议使用以下工具诊断: CANoe的Service ViewerWireshark抓包分析ECU标定工具检查安全配置【ISO14229-1:2023UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析③】由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【ISO14229-1:2023UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析③】”