こちらは、CAN通信をある程度理解している方向けの記事となっております。
-
-
CAN通信とは?規格やプロトコルについて解説
近年の自動車、産業機械、医療機器、家電製品に至るまで、さまざまな分野でCAN(Controller Area Network)が採用されています。このブログ記事では、CANの規格や動作の仕組みについて ...
本記事の内容は、「CAN通信」の解説記事の「データフィールド」の中身の一種です。
UDSはCAN通信を使った、比較的新しい規格です。一体どんなものなのか、見ていきましょう
UDS が生まれた背景と OBD-II との違い
クルマの電子制御ユニット(ECU)は年々高機能化し、診断項目も桁違いに増えました。従来の OBD-II(SAE J1979) は診断用コネクタの規格と思われがちですが、実際は主に排ガス関連を対象とした規格で、サービス(機能)数は十数個しかありません。そこで各社が独自の拡張フレームを量産して診断ツールが乱立し、混沌としていました。この“混沌”を統一するために ISO 14229 (UDS: Unified Diagnostic Services) が策定されました。
こういった経緯により、UDSは次の特徴を持っています。
- サービス ID(SID)を 1 バイトで共通化
- 要求(Request)と応答(Response)のパターンを厳密に規定
- OBD を包含しつつフラッシュ書き込みやセキュリティまで網羅
こうして「ツール 1 本でメーカー横断的に診断できる世界」が現実になったわけです。
プロトコル階層 ― CAN の上に ISO-TP、その上に UDS
CANは通信規格ですが、UDSを解説するにはいくつかの規格を押さえておく必要があります。まずは階層を見てみましょう。
階層 | プロトコル | 役割 |
---|---|---|
物理層 | CAN 2.0B | 11/29bit ID、125 kbps〜1 Mbps |
ネットワーク層 | ISO-TP (ISO 15765-2) | 8 バイトを超えるペイロードの分割再結合 |
セッション/アプリ層 | UDS (ISO 14229-1) | 診断サービスの集合(SID 0x10〜0x3E など) |
ISO-TPにはフレームタイプがあります(後述します)。
要するに、CANは電気的な「通路」であり、そこを「輸送車」であるISO-TPが利用し、さらに「品物(ペイロード)」をUDSが担うイメージです。Ethernetの階層構造と同じような考え方で、上位層の内容を下位層は知りません。UDSの通信は、相手に正しく届いてからようやく、内容を読み解けるようになります。
ISO-TP のフレーム構造とアドレッシング
フレームタイプ
フレームタイプは次の4種類です。データ長は、データ長を示すデータそのものは含みません。
- Single Frame (SF): 最大7バイト。1 パケットで完結
- First Frame (FF): マルチフレームの1通目。全長を宣言
- Consecutive Frame (CF): マルチフレームの2通目以降
- Flow Control (FC): 受信側が送る「OK/待って/窒息しそう😫」を知らせるための信号
これにより、UDSという「品物」を分割してやりとりすることができます。
アドレッシング
アドレッシングには次の2通りの決め方があります。IDはECU毎に固有です。(この概念はCANの物理層の概念です)
- 物理アドレッシング:1つのECUに対し1つのテスターで通信を行います。
- 機能アドレッシング:全ECUへのブロードキャスト(一斉送信)です。
ID規則はOEMごとに細則がありますが、0x7E0/0x7E8 ペアは業界で半ば慣例化しています。
UDSの開始 ー Diagnostic Session Control(SID 0x10) ー
なぜ最初に DSC を叩くのか
UDSは、ECUの状態を切り替えます。ECUの状態を「サブファンクション」と呼びます。代表的なサブファンクションは次のとおりです。
サブファンクション | 名称 | 主用途 |
---|---|---|
0x01 | Default Session | 通常動作、アクセス最小 |
0x02 | Programming Session | ファーム更新許可 |
0x03 | Extended Diagnostic Session | 詳細診断、パラメータ変更 |
0x04 | Safety System Session | エアバッグ系など安全関連 |
これらのサブファンクションによって、ECUが通信に対してどこまでを許すかが決まります。デフォルトは0x01のデフォルトセッションで、このままでは診断機能も限定的になるため、まず0x02のプログラミングセッションに切り替える必要があります。
そのため、UDSの開始時にはDSCを使ってECUの状態を変える通信が行われます。
CAN-ID : 0x7E0
Data : 02 10 02 00 00 00 00 00
↑ ↑ ↑
│ │ └ サブファンクション 0x02 = Programming
│ └ SID 0x10 = DSC
└ SF(ISO-TP), データ長2バイト
図は簡単な例です。CAN IDを頼りにISO-TPが届き、「荷物の中身」がDataの内容だった、というイメージです。図中の「SID」は「サービスID」です。これは「何をしたいのか」を伝えるためのIDなので「コマンド」のようなイメージで結構です。
DSCの応答には、P2やP2★(後述)が含まれることがあります。
セッション維持
ECUが、あるサブファンクションにある状態のときに行われる通信を「セッション」と呼びます。ECUは、ある一定期間、特定の「セッション維持のためのデータ」が来なかった場合は自動的にデフォルトセッションに戻ることになっています。
そのため、セッションを維持するためにはTesterPresent (0x3E) を 200–500 ms 間隔でECUに送り続けねばなりません。
UDSのセキュア
実際に診断やパラメータ変更などを行うためには、上述したDSCは「開始」に過ぎず、その後も手順に従って「第三者が読み取れない」情報をやりとりする必要があります。悪意ある第三者のアクセスを許すと、自動車は凶器に変わってしまう(などする)からです。
つまりUDS通信は暗号化されています。旧来も暗号化はされていましたが、UDS規格と比較すると脆弱なものです。こういった意味でも、新規格であるUDSへの移行は重要になっています。
旧式 Seed&Key 0x27 | 新式 PKI 0x29 |
---|---|
Seed を ECU→テスター送信 | X.509 証明書交換 |
テスターがKeyを算出し返送 | 非対称署名で相互認証 |
アルゴリズムがバレると破られる | チップセット連携のハードウェア Root-of-Trust |
個々の用語に触れていると長くなりすぎるので、本記事では割愛します。
これらを踏まえた通信の手順は、大まかに次のようになります。
代表的サービスと応答規則
サービス(SID)に対し、応答は大きく分けて「OK」を示すPositive Response(PosRsp)と「NG」を示すNegative Response(NegRsp)があります。PosRspはSIDに対応しますが、NegRspはまず固定で0x7Fが返り、その後に要因を示すコードが返ってきます。
代表的なSIDを表にしてみました。
SID | PosRsp | 名称 | 主用途 |
---|---|---|---|
0x10 | 0x50 | DSC | セッション切り替え |
0x11 | 0x51 | ECU Reset | ソフト/ハードリセット |
0x14 | 0x54 | Clear DTC | 故障コード消去 |
0x19 | 0x59 | Read DTC | DTC 列挙 |
0x22 | 0x62 | ReadDataByID | DID 読取り |
0x27 | 0x67 | Security Access | Seed & Key認証 |
0x29 | 0x69 | Authentication | 2020 追加の PKI 認証 |
0x2E | 0x6E | WriteDataByID | DID 書込み |
0x31 | 0x71 | Routine Control | CRC 計算, Erase Flash 等 |
0x34 | 0x74 | Request Download | ファーム転送 |
0x36 | 0x76 | Transfer Data | データブロック送信 |
0x3E | 0x7E | Tester Present | セッション延命 Ping |
本記事ではそれぞれを深堀りまではしませんが、「こういった機能がある」ということは押さえておきましょう。
VIN(Vehicle Identification Number)を読んでみる
VINは車両固有の識別子で、同じ識別子を持つ他の車両は存在しません。この識別子にはメーカーや車種を識別する内容も含まれ、各種診断をする前にまずVINを読み、必要な情報がどこにあるのかを区別するのが一般的です。
セキュアを確保するやりとりは複雑になるので、それを省いてVINを取得する手順を見てみましょう。
step.1 DSCでExtended Sessionに切替
02 10 03 …
を送信 ⇨ 50 03 …
が返信され、ECUがExtended Sessionに切り替わる
step.2 DID読み取りを使ってVINを指定する
DIDはデータIDのことで、「DID読み取り」は指定されたIDのデータを読み取ることを意味します。これをECU(0x7E0)に送信します。
CAN-ID 0x7E0 : 03 22 F1 90 55 55 55 55
↑ ↑ ↑ ↑
│ │ │ └ パディング
│ │ └ DID = 0xF190 (VIN)
│ └ SID 0x22
└データ長3バイト (SF)
step.3 返信を解析する
送信時はシングルフレームSFを使っていますが、返信は8バイトを超えるためマルチフレーム(FF+CF)になっていることに注意してください。
CAN-ID 0x7E8 : 10 14 62 F1 90 57 50 30 …
↑ ↑ ↑ ↑ ↑ ここからASCIIコードでVINデータ
│ │ │ └ DID = 0xF190(VIN)
│ │ └ PosRsp
│ └ 全体バイト数(20バイト)
└ マルチフレーム先頭の意味(FF)
21 39 31 4B 33 52 58 30 …
↑ ↑
│ └ VINデータの続き
└ マルチフレームの2つめの返信の意味(CF)
step.4 VINを取り出す
最終的に受け取った返信からVINの部分をつなぎ合わせて、ASCIIコードで読むとWP0ZZZ99ZTS392124のようなVINが得られます。
タイムアウトの仕組み
通信を「これ以上待たない」というラインが2種類あります。この時間を超えて通信が途絶えてしまうと、タイムアウトと呼ばれるエラーになってしまいます。
P2とP2★
後者の「P2★」は「P2 Star」とも呼ばれ、前者と後者は違うものです。
用語 | どこで使う? | 何を測るタイミング? | 典型値 |
---|---|---|---|
P2_Server_max (一般に「P2」と呼称) | ECU(=サーバ側)が持つ | リクエスト受信完了 → 最初の応答 | 20~50 ms 程度 |
P2★_Server_max (「P2★」または「P2 Star」) | ECU が持つ | 0x78 “ResponsePending” を返した後 → 最終応答 | 1,000~ 5,000 ms 程度 |
P2_Client_max / P2★_Client_max | テスター(=クライアント側)が持つ | 上記 ECU タイマに“通信遅延マージン”を乗せた待ち時間 | ECU 値 + α 目安:ECU 値 + 5 ms(P2)、+50 ms(P2★) |
まとめると、
- P2 以内に ECU が応答できなければ、
- 0x78 “ResponsePending” を返して「待って」と告知
- その後 P2★ 以内に本応答を必ず出す。
というような流れになり、もし P2★ を超えれば 0x7F 10(General Reject) などの否定応答に切り替えるか、通信そのものをリセットするという動作になることがあります(ECU依存で、無応答のこともあります)。
P2だけでは処理速度的に厳しい場合の救済がP2★というイメージです。救済があるとはいえ、P2★のタイムアウトの挙動はECU依存なので、0x78が何度も返ってくるようであれば200msごとに0x3E(Tester Present)を送信すれば安全です。
これがUDSの「タイマー健全性」になります。
トラブルシューティング
ハマりがちなポイントと、対策の例を示します。
症状 | まず疑うポイント | 対策 |
---|---|---|
0x7F 11 | SID間違い | サービス表と照合 |
0x7F 78 無限ループ | ECU内処理が長い | 200 ms 待って再ポーリング or TesterPresent |
受信タイムアウト | P2★が長い | ECU が返すP2★値をコードに反映 |
CF 取りこぼし | STmin/BlockSize 無視 | FC を解析して送信ペースを合わせる |
セッション落ち | TesterPresent 送信忘れ | 100–300 ms 周期で送信 |
まとめ
- UDS は「SID」と「セッション」で構造化されており、流れを追えばシンプル。
- DSC (0x10) → Security (0x27/0x29) → 各種サービス、という順序を体に叩き込む。
- Pythonツールチェーンを使えば、自宅のテーブル上でも ECU 診断フローを再現できる。
- 今後は DoIP (Diagnostics over IP) や AUTOSAR Adaptive といった Ethernet/POSIX ベースの新潮流が車載診断をアップデートしていく。
CANという規格自体が見直されつつあります。今後の動向には注意が必要でしょう。