手机网站打开微信号,网站中新颖的功能,wordpress 站内消息,个人工商营业执照查询官网ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase10
作者#xff1a;车端域控测试工程师 更新日期#xff1a;2025年02月18日 关键词#xff1a;UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023
TC11-010测试用例
用例ID测试场景验证要点参考条款预期结果TC…ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase10
作者车端域控测试工程师 更新日期2025年02月18日 关键词UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023
TC11-010测试用例
用例ID测试场景验证要点参考条款预期结果TC11-010混合复位类型执行在扩展会话中交替请求不同复位类型§8.2.5各复位类型独立生效无冲突
以下是为TC11-010设计的工业级CAPL测试用例包含多复位类型状态机验证包含时序控制策略和异常处理机制
/*----------------------------------------------------------TitleTC11-010 混合复位类型冲突验证 作者车端域控测试工程师 日期2025-02-18
------------------------------------------------------------*/variables {// 通信参数 const long DiagReqID 0x732; // 诊断请求标识符 const long DiagResID 0x733; // 诊断响应标识符 const byte SessionCtrlSID 0x10; // 会话控制服务 const byte ResetSID 0x11; // ECU复位服务 // 复位类型配置基于OEM规范struct sResetType {byte subFunc; // 子功能号 char* desc; // 类型描述 dword delay; // 预期执行时间 } resetTypes[3] {{0x01, 硬件复位, 1200},{0x02, 钥匙复位, 800},{0x03, 软件复位, 500}};// 动态控制变量 msTimer sessionTimer;int currentResetIndex 0;byte responseStatus[3]; // 0-未响应 1-成功 2-失败
}testcase TC11_010_MixedResetTest()
{TestModuleTitle(TC11-010 混合复位类型冲突验证);// ███ 阶段1进入扩展会话 ███ testStep(STEP1 进入扩展诊断会话);message DiagReqID [CAN] {dlc 2;byte(0) SessionCtrlSID;byte(1) 0x03; // 扩展会话 }output(this);if(TestWaitForMessage(DiagResID, 200) this.byte(0) 0x50 this.byte(1) 0x03) {testStepPass(成功进入扩展会话);setTimer(sessionTimer, 5000); // 会话保活计时 } else {testStepFail(会话建立失败);return;}// ███ 阶段2交替执行复位操作 ███ testStep(STEP2 执行混合复位序列);for(currentResetIndex0; currentResetIndex3; currentResetIndex){// 发送复位请求 message DiagReqID [CAN] {dlc 2;byte(0) ResetSID;byte(1) resetTypes[currentResetIndex].subFunc;}output(this);// 响应处理窗口 if(TestWaitForMessage(DiagResID, 300)) {// 肯定响应验证 if(this.byte(0) 0x51 this.byte(1) resetTypes[currentResetIndex].subFunc) {responseStatus[currentResetIndex] 1;testAddLog(%s 执行成功, resetTypes[currentResetIndex].desc);// 等待复位完成 testWait(resetTypes[currentResetIndex].delay);// 重新激活会话 message DiagReqID [CAN] {dlc 2;byte(0) SessionCtrlSID;byte(1) 0x03;}output(this);TestWaitForMessage(DiagResID, 200);}// 否定响应处理 else if(this.byte(0) 0x7F this.byte(1) ResetSID) {responseStatus[currentResetIndex] 2;testAddLog(%s 执行失败(NRC0x%02X), resetTypes[currentResetIndex].desc, this.byte(2));}}else {responseStatus[currentResetIndex] 0; // 超时 }// 操作间隔 testWait(300);}// ███ 阶段3综合结果验证 ███ testStep(STEP3 验证独立生效性);int successCount 0;for(int i0; i3; i) {if(responseStatus[i] 1) {testStepPass(%s 独立生效, resetTypes[i].desc);successCount;} else {testStepFail(%s 状态异常(代码:%d), resetTypes[i].desc, responseStatus[i]);}}if(successCount 3) {testCasePass(所有复位类型独立生效);} else {testCaseFail(检测到%02d/03次冲突, successCount);}
}/*----------------------------------------------------------会话状态监控模块关键扩展
----------------------------------------------------------*/
on timer sessionTimer
{testAddCondition(会话保活剩余时间%.1fs, (5000 - getTimer(sessionTimer))/1000.0);// 每4秒发送TesterPresent if(getTimer(sessionTimer) % 4000 0) {message DiagReqID [CAN] {byte(0) 0x3E; // TesterPresent byte(1) 0x00;}output(this);}
}流程图解执行逻辑可视化 #mermaid-svg-wwdAkazIRMeDIm0J {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wwdAkazIRMeDIm0J .error-icon{fill:#552222;}#mermaid-svg-wwdAkazIRMeDIm0J .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wwdAkazIRMeDIm0J .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-wwdAkazIRMeDIm0J .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wwdAkazIRMeDIm0J .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wwdAkazIRMeDIm0J .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wwdAkazIRMeDIm0J .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wwdAkazIRMeDIm0J .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wwdAkazIRMeDIm0J .marker.cross{stroke:#333333;}#mermaid-svg-wwdAkazIRMeDIm0J svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wwdAkazIRMeDIm0J defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-wwdAkazIRMeDIm0J g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-wwdAkazIRMeDIm0J g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-wwdAkazIRMeDIm0J g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-wwdAkazIRMeDIm0J g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-wwdAkazIRMeDIm0J g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-wwdAkazIRMeDIm0J .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-wwdAkazIRMeDIm0J .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-wwdAkazIRMeDIm0J .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-wwdAkazIRMeDIm0J .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-wwdAkazIRMeDIm0J .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-wwdAkazIRMeDIm0J .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-wwdAkazIRMeDIm0J .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-wwdAkazIRMeDIm0J .edgeLabel .label text{fill:#333;}#mermaid-svg-wwdAkazIRMeDIm0J .label div .edgeLabel{color:#333;}#mermaid-svg-wwdAkazIRMeDIm0J .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-wwdAkazIRMeDIm0J .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-wwdAkazIRMeDIm0J .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-wwdAkazIRMeDIm0J .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-wwdAkazIRMeDIm0J .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-wwdAkazIRMeDIm0J .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wwdAkazIRMeDIm0J .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wwdAkazIRMeDIm0J #statediagram-barbEnd{fill:#333333;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wwdAkazIRMeDIm0J .cluster-label,#mermaid-svg-wwdAkazIRMeDIm0J .nodeLabel{color:#131300;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-wwdAkazIRMeDIm0J .note-edge{stroke-dasharray:5;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-note text{fill:black;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram-note .nodeLabel{color:black;}#mermaid-svg-wwdAkazIRMeDIm0J .statediagram .edgeLabel{color:red;}#mermaid-svg-wwdAkazIRMeDIm0J #dependencyStart,#mermaid-svg-wwdAkazIRMeDIm0J #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-wwdAkazIRMeDIm0J :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 进入扩展会话 发送0x11 0x01等待1200ms 发送0x11 0x02等待800ms 发送0x11 0x03等待500ms 结果验证 关键参数说明表
参数名称示例值工程校准要点会话保活周期5000ms需小于ECU会话超时时间复位执行延迟类型相关根据OEM标定值调整操作间隔300ms需覆盖总线负载高峰期TesterPresent周期4000ms维持会话的最小间隔
响应状态矩阵
复位类型预期结果失败模式示例硬件复位立即执行系统未实际断电钥匙复位点火周期复位未检测到钥匙信号软件复位应用层重启部分进程未终止
工业级增强功能 复位深度检测 // 通过系统变量验证复位层级
on sysvar ECU::ResetLevel {testAddLog(当前复位深度%d级, this::ResetLevel);
}混合负载测试 void ExecuteStressTest() {// 可扩展// 1. 随机顺序执行复位类型 // 2. 叠加总线负载(70%-90%)// 3. 电源波动模拟
}时序校验逻辑 // 验证响应时序合规性
if(getTimer(responseTimer) 200) {testAddCondition(响应时间%dms, getTimer(responseTimer));
}测试执行说明 环境配置建议 [Diagnostic]
P2Server_Timeout 3000
P2Client_Timeout 5000 结果判定标准 检查项合格标准验证方法会话保持100%维持扩展会话日志分析复位独立性各类型执行成功率100%状态机验证时序符合性误差≤±15%示波器测量 专家调试技巧 在Write窗口添加过滤条件id733h (byte(0)51h || byte(0)7Fh)使用Graphic窗口监控信号sysvar::ECU::PowerStatus
sysvar::Diag::ActiveSession 添加总线触发条件on message DiagResID {if(this.byte(0) 0x7F) break;
}