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測試用例,包含多復位類型狀態機驗證,包含時序控制策略和異常處理機制:
/*----------------------------------------------------------Title:TC11-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(currentResetIndex=0; currentResetIndex<3; 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 執行失敗(NRC=0x%02X)", resetTypes[currentResetIndex].desc, this.byte(2));}}else {responseStatus[currentResetIndex] = 0; // 超時 }// 操作間隔 testWait(300);}// ███ 階段3:綜合結果驗證 ███ testStep("STEP3 驗證獨立生效性");int successCount = 0;for(int i=0; i<3; 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);}
}
流程圖解(執行邏輯可視化)
關鍵參數說明表
參數名稱 | 示例值 | 工程校準要點 |
---|---|---|
會話保活周期 | 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
窗口添加過濾條件:id==733h && (byte(0)==51h || byte(0)==7Fh)
- 使用
Graphic
窗口監控信號:sysvar::ECU::PowerStatus sysvar::Diag::ActiveSession
- 添加總線觸發條件:
on message DiagResID {if(this.byte(0) == 0x7F) break; }