統一診斷服務

統一診斷服務（Unified Diagnostic Services，簡稱UDS）是車用電子的通訊協定，是電子控制器（ECU）中設備診斷用的網路傳輸協議，對應的標準是ISO 14229-1。此標準是衍生自ISO 14230-3（KWP2000）以及目前已不使用的ISO 15765-3 （控制器區域網路上的診斷通訊，DoCAN）。「統一診斷服務」中的「統一」是指此標準是國際性標準，不是特定公司的專用標準。目前所有一階供應商新生產的ECU都已支援此通訊協定，也已整合到其他標準中，例如AUTOSAR。現代汽車中的電子控制器控制了非常多的機能，包括燃料噴射裝置（EFI）、發動機控制器、傳動、防鎖死剎車系統（ABS）、門鎖、剎車、窗戶動作等。

診斷工具可以連接車上所有支援統一診斷服務功能的電子控制器。車上常用的控制器區域網路只用到OSI模型的第一層及第二層，而統一診斷服務整合了OSI模型的第五層及第七層。服務識別碼（Service ID、SID）及服務相關的參數都放在8個位元組的訊息框內。

現今的車輛有配合離線診斷的診斷介面，讓電腦或是診斷工具（作為測試設備）可以連接到汽車上的通訊系統。因此可以傳送統一診斷服務的請求到控制器，控制器必須回覆（可能是正面或是負面的回覆），這樣可以確認個別控制單元中的故障記憶體、更新控制單元的韌體、和硬體進行低階的互動（例如開啟或關閉特定的輸出）、或是進行特定的機能，目的是了瞭解電子控制器的環境或是操作條件，以診斷故障或是不希望出現的行為。

## 服務

功能群｜請求 SID｜回覆 SID｜服務｜說明

診斷及通訊管理｜0x10｜0x50｜診斷會話控制Diagnostic Session Control｜UDS會使用不同的會話（session），可以用診斷會話控制（Diagnostic Session Control）來切換。可用的服務會依照目前有效的會話而不同。在一開始，控制單元預設是在「預設會話」（Default Session），有定義其他的會話，需要實現的會話會依照設備的種類而不同。、「程式會話」（Programming Session）可以用來上傳韌體到設備，並更新設備的韌體。、「擴充診斷會話」（Extended Diagnostic Session）可解鎖特定的診斷功能，例如調整感測器等。、「安全系統診斷會話」（Safety system diagnostic session）用來測試安全相關的診斷機能，例如安全氣囊的測試。此外，也有一些保留的會話識別符，為了汽車生產者及供應商的特殊需求而設計。

0x11｜0x51｜ECU重置ECU Reset｜ECU重置的服務是要重新啟動ECU。依照控制單元硬體以及實現方式的不同，有以下幾種不同的重置：、「硬重置」模擬電源關閉的重置。、「關閉鎖匙重置」模擬用鎖匙將汽車熄火，再開啟汽車的點火開關。、「軟重置」初始化特定程式單元以及儲存結構。也有一些汽車生產者及供應商定義的特殊數值。

0x27｜0x67｜安全性存取Security Access｜可以用安全性檢查（Security check）來啟動大部份的安全關鍵性服務（security-critical services）。此情形下控制單元會傳送「密碼種子（seed）」到客戶端（電腦或是診斷工具）。客戶端再用密碼種子計算金鑰（key）送回控制單元，以此來解安全關鍵性服務

0x28｜0x68｜通訊控制Communication Control｜此服務可以關閉控制單元傳送以及接收訊息的功能。

0x29｜0x69｜認證Authentication｜標準在2020年的更新版本，提供一種標準化的方式，可以提供一些安全性存取（0x27）服務無法支援的現代認證方式，包括以PKI為基礎的認證交換，以及雙向的驗證機制。

0x3E｜0x7E｜測試者存在Tester Present｜若客戶端長時間沒有交換通訊資料，控制單元會自動離開目前的會話，回到「預設會話」，也可能會進入休眠模式。而此一服務的目的就是讓控制單元知道客戶端仍存在。

0x83｜0xC3｜存取時序參數Access Timing Parameters｜在控制器及從機的通訊中，需要觀察一定的時間，若時間超過此限制，仍沒有送出訊息，就會假設連接已有問題。可以讀取及修改此時間。

0x84｜0xC4｜安全資料傳輸Secured Data Transmission

0x85｜0xC5｜控制DTC設定Control DTC Settings｜啟動或關閉部份（或所有）錯誤的偵測。若診斷工作是在車內進行的，這個機能格外重要，因為診斷工作有可能造成部份零件的異常行為。

0x86｜0xC6｜事件回覆Response On Event

0x87｜0xC7｜鏈結控制Link Control｜服務鏈結控制是用來設定診斷存取的位元率。多半只在中間閘道器上實現此一機能。

資料傳輸｜0x22｜0x62｜根據識別碼讀取資料Read Data By Identifier｜透過此服務可以讀取控制單元中一個或多個的資料。這些資料的種類不限，也可以有不同的長度，例如料號或是軟體版本等。也可以讀取像是感測器狀態之類會變動的值。每一個值會對一個資料識別碼（Data Identifier、簡稱DID），數值從0到65535。會用正常的CAN信號來傳送特定ECU使用的資料。DID資料只用在資料請求上，也可以用一些沒有ECU使用的DID來傳送資訊，雖ECU不會使用，但服務工具或軟體測試程式可以使用這類的資訊。

0x23｜0x63｜根據位址讀取記憶體Read Memory By Address｜依給定位址讀取實體記憶體中的值。測試工具可以用此機能來讀取軟體內部的行為。

0x24｜0x64｜根據識別碼讀取縮放比例資料Read Scaling Data By Identifier

0x2A｜0x6A｜周期性根據識別碼讀取資料Read Data By Identifier Periodic｜透過此服務可以讓控制單元週期性傳送資料。只能傳送透過「動態定義資料識別碼」定義的識別碼

0x2C｜0x6C｜動態定義資料識別碼Dynamically Define Data Identifier｜此服務提供一個修正設備資料識別碼（DID）的方式，可以重新調整資料識別碼。這個通常是不同資料識別碼的組合，或者單純是所有DID的串接。請求資料可以依以下的原則規劃組態：、原始資料識別碼、位置、長度（依位元組表示）、子功能位元組：defineByIdentifier、記憶體位置、長度（依位元組表示）、子功能位元組：defineByMemoryAddress、可以結合上述二種方式

0x2E｜0x6E｜根據識別碼寫入資料Write Data By Identifier｜可以更改資料識別碼中的數值，命令中除了資料識別碼外，也要同時提供要修改的數值

0x3D｜0x7D｜根據位址寫入到記憶體Write Memory By Address｜「根據位址寫入到記憶體」可以讓外面診斷工具寫資訊到ECU裡的特定位址，或特定的連續位址

儲存資料傳送｜0x14｜0x54｜清除診斷資訊Clear Diagnostic Information｜清除已儲存的診斷問題碼（Diagnostic Trouble Code，簡稱DTC）

0x19｜0x59｜讀取DTC資訊Read DTC Information｜DTC是診斷問題碼。每一個DTC對應一個控制單元的故障，會以其編碼儲存在錯誤記憶體中，可以在任意時候讀取。除了錯誤外，也可能會記錄一些相關的資訊，也可以一併讀取。

輸入／輸出控制｜0x2F｜0x6F｜根據識別碼的輸入／輸出控制Input Output Control By Identifier｜此服務可以讓外部系統介面透過診斷介面控制輸入／輸出信號 透過設定選擇位元組，可以設定有關請求的特殊條件，可以設定以下的值： ReturnControlToECU：設備需將信號的控制權送回 ResetToDefault：測試者試圖重置信號，回到系統的預設值 Freeze Current State：設備需凍結目前的信號，不允許變化 ShortTermAdjustment：設備需使用目前提供的信號值

遠端啟動程序｜0x31｜0x71｜遠端控制Routine Control｜此控制服務程序可以進行各種的服務，有三種不同的資訊種類：、配合啟始資訊，可以開始服務。可以定義此資訊來確認要執行各動作，或是提示服務已經完成。、配合停止資訊，運行中的服務可以在任何時間下中斷。、第三個選項是查詢服務狀態的資訊 可以特別標示啟始及結束的資訊參數，因此可以實現每一種專案特定的服務。

上傳／下載｜0x34｜0x74｜請求下載Request Download｜利用「請求下載」服務，可以下載新的軟體或是其他資料到控制單元內。需標示資料的位置以及長度，因此，控制器可以知道資料封包的大小。

0x35｜0x75｜請求上傳Request Upload｜「請求上傳」服務和「請求下載」服務是類似的，此服務可以將控制單元的軟體傳送給測試者。也需標示資料的位置以及長度，測試者需指定資料封包的大小。

0x36｜0x76｜傳送資料Transfer Data｜在真正傳送資料時，會用到此一服務，不論是上傳或是下載都是使用此一服務。傳送的方向則視之前是「請求上傳」服務或「請求下載」服務而不同。此一服務會用之前指定的最大封包長度傳送資料，若資料長度超過最大封包長度，需要用數個封包來傳送，直到傳送完成為止。

0x37｜0x77｜請求結束傳送Request Transfer Exit｜可以用此服務中止資料傳送。此服務用在測試著和控制單元比較時。在執行時，控制單元可以負面回應來中止資料傳送請求。若指定的資料量還沒傳送完，也可以用此服務中止傳送。

0x38｜0x78｜請求檔案傳送Request File Transfer｜此服務用來啟始客戶端到伺服器的檔案下載，或是伺服器到客戶端的檔案上傳。也可以提供一些檔案系統的相關資訊。

0x7F｜否定回應Negative Response｜此回應會在服務無法進行時回覆，例如不支援的資料識別符。此時會加上否定的回應碼。

## NRC: Negative response codes

來自 ECU 的否定回應(Negative Response)包含 SID 0x7F 和兩個有效負載位元組：請求的 SID 和錯誤代碼。

錯誤代碼(NRC)如下：

NRC｜Description

0x10｜General reject｜一般拒絕

0x11｜Service not supported｜不支援的服務

0x12｜Subfunction not supported｜不支援的子功能

0x13｜Incorrect message length or invalid format｜訊息長度不正確或格式錯誤

0x14｜Response too long｜反應時間太長

0x21｜Busy, repeat request｜忙碌/重複請求

0x22｜Conditions not correct｜條件不正確

0x24｜Request sequence error｜請求順序錯誤

0x25｜No response from subnet component｜子網路組件無回應

0x26｜Failure prevents execution of requested action｜阻止執行請求的操作失敗

0x31｜Request out of range｜請求超出範圍

0x33｜Security access denied｜安全存取被拒絕

0x34｜Authentication failed｜認證失敗

0x35｜Invalid key｜無效的金鑰

0x36｜Exceeded number of attempts｜超過嘗試次數

0x37｜Required time delay not expired｜要求的延遲時間未到

0x38｜Secure data transmission required｜需要安全的資料傳輸(SID=0x84)

0x39｜Secure data transmission not allowed｜不允許安全資料傳輸

0x3A｜Secure data verification failed｜安全資料驗證失敗

0x50｜Certificate validation failed, invalid time period｜證書驗證失敗，時段無效

0x51｜Certificate validation failed, invalid signature｜憑證驗證失敗，簽章無效

0x52｜Certificate validation failed, invalid chain of trust｜憑證驗證失敗，信任鏈無效

0x53｜Certificate validation failed, invalid type｜證書驗證失敗，類型無效

0x54｜Certificate validation failed, invalid format｜證書驗證失敗，格式無效

0x55｜Certificate validation failed, invalid content｜證書驗證失敗，內容無效

0x56｜Certificate validation failed, invalid scope｜證書驗證失敗，範圍無效

0x57｜Certificate validation failed, invalid certificate｜證書驗證失敗，證書無效

0x58｜Ownership verification failed｜所有權驗證失敗

0x59｜Challenge calculation failed｜挑戰計算失敗

0x5A｜Setting access right failed｜設定存取權限失敗

0x5B｜Session key creation/derivation failed｜會話金鑰建立/派生失敗

0x5C｜Configuration data usage failed｜配置資料使用失敗

0x5D｜Deauthentication failed｜取消認證失敗

0x70｜Upload download not accepted｜上傳下載不被接受

0x71｜Transfer data suspended｜傳輸資料暫停

0x72｜General programming failure｜一般程式設計失敗

0x73｜Wrong block sequence number｜錯誤的區塊序號

0x78｜Request correctly received, response pending｜請求已正確接收，回應待處理

0x7E｜Subfunction not supported in active session｜當前會話中不支援子功能

0x7F｜Service not supported in active session｜當前會話中不支援服務

0x81｜RPM too high｜轉速太高

0x82｜RPM too low｜轉速太低

0x83｜Engine is running｜引擎正在運轉

0x84｜Engine is not running｜引擎未運轉

0x85｜Engine run time too low｜引擎運轉時間太短

0x86｜Temperature too high｜溫度過高

0x87｜Temperature too low｜溫度太低

0x88｜Vehicle speed too high｜車速太高

0x89｜Vehicle speed too low｜車速太低

0x8A｜Throttle/pedal too high｜油門/踏板太高

0x8B｜Throttle/pedal too low｜油門/踏板太低

0x8C｜Transmission range not in neutral｜傳輸範圍不在空檔

0x8D｜Transmission range not in gear｜未掛檔的傳動範圍

0x8F｜Brake switch not closed｜煞車開關未閉合

0x90｜Shifter lever not in park｜變速桿不在停車位置

0x91｜Torque converter clutch locked｜變矩器離合器鎖止

0x92｜Voltage too high｜電壓過高

0x93｜Voltage too low｜電壓太低

0x94｜Resource temporary unavailable｜資源暫時無法使用

## 相關條目

- 車上診斷系統，廣義的車上診斷服務
- OBD-II PID，類似功能的美國標準

## 外部連結

- Unified Diagnostic Services - ISO 14229 (poster by softing.com)