上位機(jī)-LabVIEW版本(十六):從刷寫到診斷的功能擴(kuò)展)
1. 引言在前面的系列文章中我們完成了基于圖莫斯CAN工具的LabVIEW UDS升級(jí)上位機(jī)開發(fā)實(shí)現(xiàn)了ECU固件刷寫的完整流程。然而UDS協(xié)議的能力遠(yuǎn)不止于刷寫——它涵蓋了六大功能單元、共26種診斷服務(wù)是汽車電子領(lǐng)域最全面的診斷通信協(xié)議。刷寫功能只是UDS應(yīng)用的一個(gè)子集。在實(shí)際的ECU開發(fā)、產(chǎn)線測(cè)試和售后診斷場(chǎng)景中我們還需要讀取DTC故障碼快速定位ECU故障讀取DID數(shù)據(jù)標(biāo)識(shí)符獲取軟件版本、硬件版本、VIN碼等信息清除DTC故障修復(fù)后清除歷史故障碼安全訪問解鎖受保護(hù)的診斷服務(wù)例程控制執(zhí)行ECU內(nèi)部預(yù)定義操作如傳感器自學(xué)習(xí)、標(biāo)定等好消息是我們已經(jīng)封裝好的通信基座和UDS服務(wù)子VI可以直接復(fù)用只需在此基礎(chǔ)上擴(kuò)展新的診斷服務(wù)即可。本文將展示如何利用現(xiàn)有架構(gòu)快速構(gòu)建一個(gè)功能完整的UDS診斷上位機(jī)。2. 已封裝子VI的復(fù)用價(jià)值在刷寫上位機(jī)中我們已經(jīng)完成了以下核心基礎(chǔ)設(shè)施2.1 通信基座TOOMOSS_SendAndWaitResp.vi這是所有UDS服務(wù)的“發(fā)動(dòng)機(jī)”。它封裝了CAN_UDS_Request發(fā)送UDS請(qǐng)求CAN_UDS_Response接收UDS響應(yīng)超時(shí)處理與錯(cuò)誤返回任何新的UDS服務(wù)只需構(gòu)造對(duì)應(yīng)的請(qǐng)求數(shù)據(jù)調(diào)用此基座即可完成收發(fā)無需重復(fù)編寫CAN通信邏輯。2.2 設(shè)備管理層TOOMOSS_OpenDev(CAN).vi提供設(shè)備句柄管理所有診斷服務(wù)共用同一個(gè)設(shè)備句柄無需重復(fù)打開設(shè)備。2.3 已有的UDS服務(wù)子VI子VI服務(wù)用途TOOMOSS_SID10_RequestSession.vi0x10會(huì)話切換TOOMOSS_SID27_SecurityAccess.vi0x27安全訪問TOOMOSS_SID2E_WriteDataByID.vi0x2E寫入數(shù)據(jù)TOOMOSS_SID31_RoutineControl.vi0x31例程控制TOOMOSS_SID11_EcuReset.vi0x11ECU復(fù)位TOOMOSS_SID28_CommunicationControl.vi0x28通信控制TOOMOSS_SID85_ControlDTCSetting.vi0x85DTC控制這些子VI可以直接在診斷上位機(jī)中復(fù)用無需任何修改。3. 需要新增的診斷服務(wù)要構(gòu)建完整的診斷上位機(jī)還需要補(bǔ)充以下UDS服務(wù)3.1 0x22 ReadDataByIdentifier按標(biāo)識(shí)符讀數(shù)據(jù)功能根據(jù)DIDData Identifier讀取ECU中存儲(chǔ)的數(shù)據(jù)。DID是2字節(jié)的標(biāo)識(shí)符每個(gè)DID對(duì)應(yīng)ECU中的特定數(shù)據(jù)。典型應(yīng)用0xF190讀取VIN碼0xF188讀取軟件版本號(hào)0xF187讀取硬件版本號(hào)請(qǐng)求格式Byte 0: SID 0x22 Byte 1: DID_High Byte 2: DID_Low肯定響應(yīng)格式Byte 0: SID 0x62 (0x22 0x40) Byte 1: DID_High Byte 2: DID_Low Byte 3~N: dataRecord讀取到的數(shù)據(jù)示例請(qǐng)求讀取DID0xF187發(fā)送22 F1 87響應(yīng)62 F1 87 48 32 30 31數(shù)據(jù)為H201等ASCII字符3.2 0x19 ReadDTCInformation讀取DTC信息功能讀取ECU中存儲(chǔ)的診斷故障碼DTC。這是UDS中最復(fù)雜但最重要的診斷服務(wù)之一包含28個(gè)子功能。常用子功能子功能名稱用途0x01reportNumberOfDTCByStatusMask讀取符合特定條件的DTC數(shù)量0x02reportDTCByStatusMask讀取符合特定條件的DTC列表0x06reportDTCExtDataRecordByDTCNumber讀取指定DTC的快照/環(huán)境數(shù)據(jù)DTC狀態(tài)掩碼1字節(jié)bit 0testFailed當(dāng)前是否失敗bit 4confirmedDTC是否已被確認(rèn)/存儲(chǔ)bit 6warningIndicatorRequested是否觸發(fā)警告燈示例讀取所有已確認(rèn)的DTC數(shù)量19 01 08讀取所有激活狀態(tài)的DTC列表19 02 01讀取指定DTC的完整環(huán)境數(shù)據(jù)19 06 XX XX XX FF具體的設(shè)計(jì)在下一篇“基于圖莫斯的CAN UDS診斷上位機(jī)-LabVIEW版本十七TOOMOSS_SID19_ReadDTCInformation.vi-讀取DTC信息”文章介紹。3.3 0x14 ClearDiagnosticInformation清除DTC功能清除ECU中存儲(chǔ)的DTC。請(qǐng)求格式Byte 0: SID 0x14 Byte 1: groupOfDTC_High Byte 2: groupOfDTC_Mid Byte 3: groupOfDTC_Low特殊值FF FF FF表示清除所有DTC肯定響應(yīng)0x54示例清除所有DTC發(fā)送14 FF FF FF響應(yīng)543.4 0x3E TesterPresent待機(jī)握手功能維持非默認(rèn)會(huì)話狀態(tài)防止ECU因超時(shí)而自動(dòng)退回默認(rèn)會(huì)話。請(qǐng)求格式Byte 0: SID 0x3E Byte 1: subFunction (0x00 需要響應(yīng), 0x80 不需要響應(yīng))典型用法進(jìn)入擴(kuò)展會(huì)話或編程會(huì)話后周期性發(fā)送3E 80無需響應(yīng)保持會(huì)話活躍。4. 診斷功能上位機(jī)界面設(shè)計(jì)4.1 主界面布局┌─────────────────────────────────────────────────────────────────────┐ │ CAN UDS 診斷上位機(jī) │ ├─────────────────────────────────────────────────────────────────────┤ │ ┌─ 通信配置 ────────────────────────────────────────────────────┐ │ │ │ 通道: [CAN1▼] 波特率: [500] Kbps │ │ │ │ 物理ID: [0x700] 響應(yīng)ID: [0x708] 設(shè)備: [已打開 ●] │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ 診斷服務(wù) ────────────────────────────────────────────────────┐ │ │ │ [讀取DTC] [清除DTC] [讀取DID] [寫入DID] [安全訪問] [復(fù)位] │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ 服務(wù)參數(shù) ────────────────────────────────────────────────────┐ │ │ │ DID: [0xF190] 數(shù)據(jù): [ ] │ │ │ │ 子功能: [0x02▼] 掩碼: [0xFF] │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ 響應(yīng)顯示 ────────────────────────────────────────────────────┐ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ │ │ [14:30:25.123] TX: 22 F1 90 │ │ │ │ │ │ [14:30:25.456] RX: 62 F1 90 4C 56 4E 39 30 30 30 30 │ │ │ │ │ │ VIN: LVN90000 │ │ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ 狀態(tài)欄: [就緒] │ └─────────────────────────────────────────────────────────────────────┘4.2 功能區(qū)域說明區(qū)域內(nèi)容說明通信配置通道、波特率、物理ID、響應(yīng)ID、設(shè)備狀態(tài)與刷寫上位機(jī)共用診斷服務(wù)功能按鈕點(diǎn)擊觸發(fā)對(duì)應(yīng)的UDS服務(wù)服務(wù)參數(shù)DID、子功能、掩碼、數(shù)據(jù)等根據(jù)所選服務(wù)動(dòng)態(tài)顯示響應(yīng)顯示收發(fā)日志 解析結(jié)果顯示原始報(bào)文和解析后的數(shù)據(jù)狀態(tài)欄當(dāng)前狀態(tài)、錯(cuò)誤信息實(shí)時(shí)反饋5. 診斷服務(wù)子VI實(shí)現(xiàn)5.1 TOOMOSS_SID22_ReadDataByID.vi輸入?yún)?shù)控件類型說明設(shè)備句柄U32由OpenDev返回通道號(hào)枚舉CAN1/CAN2物理地址U32請(qǐng)求ID響應(yīng)地址U32響應(yīng)IDDIDU16數(shù)據(jù)標(biāo)識(shí)符輸出參數(shù)控件類型說明響應(yīng)數(shù)據(jù)U8數(shù)組讀取到的數(shù)據(jù)數(shù)據(jù)長(zhǎng)度I32數(shù)據(jù)字節(jié)數(shù)返回值I320成功-1失敗錯(cuò)誤信息字符串錯(cuò)誤描述程序框圖典型調(diào)用讀取VIN碼DID 0xF190發(fā)送22 F1 90響應(yīng)62 F1 90 4C 56 4E ...17字節(jié)VIN碼5.2 TOOMOSS_SID19_ReadDTC.vi下篇文章詳解5.3 TOOMOSS_SID14_ClearDTC.vi輸入?yún)?shù)控件類型說明設(shè)備句柄U32由OpenDev返回通道號(hào)枚舉CAN1/CAN2物理地址U32請(qǐng)求ID響應(yīng)地址U32響應(yīng)IDDTC組U323字節(jié)組標(biāo)識(shí)FF FF FF表示全部輸出參數(shù)控件類型說明返回值I320成功-1失敗錯(cuò)誤信息字符串錯(cuò)誤描述程序框圖5.4 TOOMOSS_SID3E_TesterPresent.vi輸入?yún)?shù)控件類型說明設(shè)備句柄U32由OpenDev返回通道號(hào)枚舉CAN1/CAN2物理地址U32請(qǐng)求ID響應(yīng)地址U32響應(yīng)ID需要響應(yīng)布爾True需要響應(yīng)(0x00)False無需響應(yīng)(0x80)程序框圖6. 診斷功能主VI流程編排6.1 狀態(tài)機(jī)設(shè)計(jì)IDLE → 選擇診斷服務(wù) → 檢查設(shè)備狀態(tài) → 執(zhí)行服務(wù) → 顯示結(jié)果 → IDLE6.2 診斷服務(wù)調(diào)用示例讀取VIN碼流程用戶選擇DID0xF190調(diào)用TOOMOSS_SID22_ReadDataByID.vi將響應(yīng)數(shù)據(jù)17字節(jié)顯示為ASCII字符串顯示VIN碼解析結(jié)果讀取DTC流程用戶選擇子功能0x02按狀態(tài)掩碼讀取DTC列表調(diào)用TOOMOSS_SID19_ReadDTC.vi解析響應(yīng)提取DTC列表將3字節(jié)DTC轉(zhuǎn)換為標(biāo)準(zhǔn)5字符格式在表格中顯示DTC及其狀態(tài)6.3 與刷寫功能的集成診斷功能與刷寫功能可以共享通信層同一個(gè)TOOMOSS_SendAndWaitResp.vi設(shè)備管理同一個(gè)設(shè)備句柄日志系統(tǒng)同一個(gè)LogManager.vi主界面通過標(biāo)簽頁(yè)切換“診斷模式”和“刷寫模式”7. 總結(jié)通過本系列文章搭建的UDS通信框架我們已經(jīng)具備了快速擴(kuò)展診斷功能的基礎(chǔ)已實(shí)現(xiàn)刷寫系列可擴(kuò)展診斷系列0x10 會(huì)話切換0x22 讀數(shù)據(jù)0x27 安全訪問0x19 讀DTC0x2E 寫數(shù)據(jù)0x14 清除DTC0x31 例程控制0x3E 待機(jī)握手0x34/36/37 下載0x23 讀內(nèi)存0x11 ECU復(fù)位...更多核心要點(diǎn)通信基座復(fù)用所有新服務(wù)只需構(gòu)造請(qǐng)求數(shù)據(jù)調(diào)用TOOMOSS_SendAndWaitResp.vi即可設(shè)備管理復(fù)用設(shè)備句柄由TOOMOSS_OpenDev(CAN).vi統(tǒng)一管理日志系統(tǒng)復(fù)用所有通信自動(dòng)記錄到日志文件UI框架復(fù)用主VI的While循環(huán)事件結(jié)構(gòu)可直接擴(kuò)展新的事件分支這種架構(gòu)設(shè)計(jì)的最大價(jià)值在于——投入一次基礎(chǔ)設(shè)施建設(shè)即可持續(xù)擴(kuò)展新的診斷功能而無需重復(fù)編寫底層的CAN通信、設(shè)備管理和日志記錄代碼。