统一诊断服务

统一诊断服务（，簡稱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)

Category:汽车工程技术
Category:嵌入式系统
Category:CAN bus