自己建的網(wǎng)站有亂碼成都網(wǎng)站設(shè)計(jì)
ISO 14229-1:2023 UDS診斷【ECU復(fù)位0x11服務(wù)】_TestCase10
作者:車端域控測(cè)試工程師
更新日期:2025年02月18日
關(guān)鍵詞:UDS診斷協(xié)議、ECU復(fù)位服務(wù)、0x11服務(wù)、ISO 14229-1:2023
TC11-010測(cè)試用例
用例ID | 測(cè)試場(chǎng)景 | 驗(yàn)證要點(diǎn) | 參考條款 | 預(yù)期結(jié)果 |
---|---|---|---|---|
TC11-010 | 混合復(fù)位類型執(zhí)行 | 在擴(kuò)展會(huì)話中交替請(qǐng)求不同復(fù)位類型 | §8.2.5 | 各復(fù)位類型獨(dú)立生效無沖突 |
以下是為TC11-010設(shè)計(jì)的工業(yè)級(jí)CAPL測(cè)試用例,包含多復(fù)位類型狀態(tài)機(jī)驗(yàn)證,包含時(shí)序控制策略和異常處理機(jī)制:
/*----------------------------------------------------------Title:TC11-010 混合復(fù)位類型沖突驗(yàn)證 作者:車端域控測(cè)試工程師 日期:2025-02-18
------------------------------------------------------------*/variables {// 通信參數(shù) const long DiagReqID = 0x732; // 診斷請(qǐng)求標(biāo)識(shí)符 const long DiagResID = 0x733; // 診斷響應(yīng)標(biāo)識(shí)符 const byte SessionCtrlSID = 0x10; // 會(huì)話控制服務(wù) const byte ResetSID = 0x11; // ECU復(fù)位服務(wù) // 復(fù)位類型配置(基于OEM規(guī)范)struct sResetType {byte subFunc; // 子功能號(hào) char* desc; // 類型描述 dword delay; // 預(yù)期執(zhí)行時(shí)間 } resetTypes[3] = {{0x01, "硬件復(fù)位", 1200},{0x02, "鑰匙復(fù)位", 800},{0x03, "軟件復(fù)位", 500}};// 動(dòng)態(tài)控制變量 msTimer sessionTimer;int currentResetIndex = 0;byte responseStatus[3]; // 0-未響應(yīng) 1-成功 2-失敗
}testcase TC11_010_MixedResetTest()
{TestModuleTitle("TC11-010 混合復(fù)位類型沖突驗(yàn)證");// ███ 階段1:進(jìn)入擴(kuò)展會(huì)話 ███ testStep("STEP1 進(jìn)入擴(kuò)展診斷會(huì)話");message DiagReqID [CAN] {dlc = 2;byte(0) = SessionCtrlSID;byte(1) = 0x03; // 擴(kuò)展會(huì)話 }output(this);if(TestWaitForMessage(DiagResID, 200) && this.byte(0) == 0x50 && this.byte(1) == 0x03) {testStepPass("成功進(jìn)入擴(kuò)展會(huì)話");setTimer(sessionTimer, 5000); // 會(huì)話?;钣?jì)時(shí) } else {testStepFail("會(huì)話建立失敗");return;}// ███ 階段2:交替執(zhí)行復(fù)位操作 ███ testStep("STEP2 執(zhí)行混合復(fù)位序列");for(currentResetIndex=0; currentResetIndex<3; currentResetIndex++){// 發(fā)送復(fù)位請(qǐng)求 message DiagReqID [CAN] {dlc = 2;byte(0) = ResetSID;byte(1) = resetTypes[currentResetIndex].subFunc;}output(this);// 響應(yīng)處理窗口 if(TestWaitForMessage(DiagResID, 300)) {// 肯定響應(yīng)驗(yàn)證 if(this.byte(0) == 0x51 && this.byte(1) == resetTypes[currentResetIndex].subFunc) {responseStatus[currentResetIndex] = 1;testAddLog("%s 執(zhí)行成功", resetTypes[currentResetIndex].desc);// 等待復(fù)位完成 testWait(resetTypes[currentResetIndex].delay);// 重新激活會(huì)話 message DiagReqID [CAN] {dlc = 2;byte(0) = SessionCtrlSID;byte(1) = 0x03;}output(this);TestWaitForMessage(DiagResID, 200);}// 否定響應(yīng)處理 else if(this.byte(0) == 0x7F && this.byte(1) == ResetSID) {responseStatus[currentResetIndex] = 2;testAddLog("%s 執(zhí)行失敗(NRC=0x%02X)", resetTypes[currentResetIndex].desc, this.byte(2));}}else {responseStatus[currentResetIndex] = 0; // 超時(shí) }// 操作間隔 testWait(300);}// ███ 階段3:綜合結(jié)果驗(yàn)證 ███ testStep("STEP3 驗(yàn)證獨(dú)立生效性");int successCount = 0;for(int i=0; i<3; i++) {if(responseStatus[i] == 1) {testStepPass("%s 獨(dú)立生效", resetTypes[i].desc);successCount++;} else {testStepFail("%s 狀態(tài)異常(代碼:%d)", resetTypes[i].desc, responseStatus[i]);}}if(successCount == 3) {testCasePass("所有復(fù)位類型獨(dú)立生效");} else {testCaseFail("檢測(cè)到%02d/03次沖突", successCount);}
}/*----------------------------------------------------------會(huì)話狀態(tài)監(jiān)控模塊(關(guān)鍵擴(kuò)展)
----------------------------------------------------------*/
on timer sessionTimer
{testAddCondition("會(huì)話?;钍S鄷r(shí)間:%.1fs", (5000 - getTimer(sessionTimer))/1000.0);// 每4秒發(fā)送TesterPresent if(getTimer(sessionTimer) % 4000 == 0) {message DiagReqID [CAN] {byte(0) = 0x3E; // TesterPresent byte(1) = 0x00;}output(this);}
}
流程圖解(執(zhí)行邏輯可視化)
關(guān)鍵參數(shù)說明表
參數(shù)名稱 | 示例值 | 工程校準(zhǔn)要點(diǎn) |
---|---|---|
會(huì)話保活周期 | 5000ms | 需小于ECU會(huì)話超時(shí)時(shí)間 |
復(fù)位執(zhí)行延遲 | 類型相關(guān) | 根據(jù)OEM標(biāo)定值調(diào)整 |
操作間隔 | 300ms | 需覆蓋總線負(fù)載高峰期 |
TesterPresent周期 | 4000ms | 維持會(huì)話的最小間隔 |
響應(yīng)狀態(tài)矩陣
復(fù)位類型 | 預(yù)期結(jié)果 | 失敗模式示例 |
---|---|---|
硬件復(fù)位 | 立即執(zhí)行 | 系統(tǒng)未實(shí)際斷電 |
鑰匙復(fù)位 | 點(diǎn)火周期復(fù)位 | 未檢測(cè)到鑰匙信號(hào) |
軟件復(fù)位 | 應(yīng)用層重啟 | 部分進(jìn)程未終止 |
工業(yè)級(jí)增強(qiáng)功能
-
復(fù)位深度檢測(cè)
// 通過系統(tǒng)變量驗(yàn)證復(fù)位層級(jí) on sysvar ECU::ResetLevel {testAddLog("當(dāng)前復(fù)位深度:%d級(jí)", @this::ResetLevel); }
-
混合負(fù)載測(cè)試
void ExecuteStressTest() {// 可擴(kuò)展:// 1. 隨機(jī)順序執(zhí)行復(fù)位類型 // 2. 疊加總線負(fù)載(70%-90%)// 3. 電源波動(dòng)模擬 }
-
時(shí)序校驗(yàn)邏輯
// 驗(yàn)證響應(yīng)時(shí)序合規(guī)性 if(getTimer(responseTimer) < 200) {testAddCondition("響應(yīng)時(shí)間:%dms", getTimer(responseTimer)); }
測(cè)試執(zhí)行說明
-
環(huán)境配置建議
[Diagnostic] P2Server_Timeout = 3000 P2Client_Timeout = 5000
-
結(jié)果判定標(biāo)準(zhǔn)
檢查項(xiàng) 合格標(biāo)準(zhǔn) 驗(yàn)證方法 會(huì)話保持 100%維持?jǐn)U展會(huì)話 日志分析 復(fù)位獨(dú)立性 各類型執(zhí)行成功率100% 狀態(tài)機(jī)驗(yàn)證 時(shí)序符合性 誤差≤±15% 示波器測(cè)量
專家調(diào)試技巧:
- 在
Write
窗口添加過濾條件:id==733h && (byte(0)==51h || byte(0)==7Fh)
- 使用
Graphic
窗口監(jiān)控信號(hào):sysvar::ECU::PowerStatus sysvar::Diag::ActiveSession
- 添加總線觸發(fā)條件:
on message DiagResID {if(this.byte(0) == 0x7F) break; }