バックナンバーはこちら。
https://www.simulationroom999.com/blog/diagnostic-communication-backnumber/
はじめに
車両診断通信のネットワーク層の話。
メッセージを構築するための各種フレーム詳細。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
各種フレーム
じゃ、各種フレームの詳細に行こうか。
確か、この4種類だったね。
- SF(Single Frame)
- FF(First Frame)
- FC(Flow Control)
- CF(Consecutive Frame)
前回も言ったけど、アドレッシングフォーマットがDataFieldまで侵食していない、
Normal fixed addressingを前提にするからね。
うん。
僕もそっちの方が理解し易いかも。
各種フレーム詳細
まずN_PCI(Network Protocol Control Information)と実データの切り分けだけで表現するとこんな感じ。
フレーム | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
SF | N_PCI | Data | ||||||
FF | N_PCI | Data | ||||||
FC | N_PCI | – | ||||||
CF | N_PCI | Data |
うーん、このN_PCIがポイントなんだろうなーとは思った。
まぁN_PCI以外は送りたいデータそのものだからね。
SFのN_PCI
じゃ、各種フレームのN_PCIの説明に入ろう。
まずはSF。
SFのN_PCI
bit7-4 | bit3-0 |
0x0 | メッセージ長 |
ちなみにメッセージ長の最大値は7になる。
ん?bit7-4は0固定?
だったら、普通に先頭byteの1byte分は「メッセージ長」ってことで良くない?
実は先頭Byteのbit7-4はN_PCItypeって名前がついてて、
これでSF、FF、FC、CFを識別できる。
SFはたまたま0ってだけ。
あーそれそれ。
どうやって各種フレームを識別するのかなーって思ってたんだけど、
先頭byteのbit7-4を見て判断できるんだね。
そして、メッセージ長はSF_DL(Single Frame Data Length)という名前が付いている。
FFのN_PCI
次はFFのN_PCIだ。
FFのN_PCI
1byte目 | 2byte目 | 3byte目~ | |
---|---|---|---|
bit7-4 | bit3-0 | bit7-0 | bit7-0 |
0x1 | メッセージ長 | Data |
先頭4bitはN_PCItypeってことでいいと思うけど、
メッセージ長が12bit?
うん。
よって、4095byteのメッセージが最大となる。
なるほど。
4095という数値を入れようと思うと12bit必要ってことになるのか。
FFもメッセージ長はFF_DL(First Frame Data Length)という名前が付いている。
FCのN_PCI
そしてFCのN_PCI。
こいつが一番ややこしい。
FCのN_PCI
1byte目 | 2byte目 | 3byte目 | 4byte目~ | |
---|---|---|---|---|
bit7-4 | bit3-0 | bit7-0 | bit7-0 | bit7-0 |
0x3 | FS | BS | STmin |
やたらとパラメ―タっぽいのがあるな。
FSはFlow Status。
BSはBlock Size。
STminはSeparationTime minimum。
BSとSTminは前回聞いたね。
BSがCFを受信して何回目に再度FCを送るかのパラメータで、
STminが送信してもらうCFとCFの間の時間を指定するパラメータ。
正解。
で、FSは?
以下の定義になってるよ。
値 | 名称 | 説明 |
---|---|---|
0x0 | CTS(ContinueToSend) | FCに続いてCF送信許可 |
0x1 | WAIT(Wait) | 再度のFC待ち指示(タイムアウトはN_Bs値) |
0x2 | OVFLW(Overflow) | 受信バッファ不足。送信中止 |
0x3~0xf | 予約 | 予約 |
基本はCTSなんだけど、
ちょっと待って欲しい時はWAIT、
FFのFF_DLを見て、メッセージ長が想定よりも長いと判断されたらOVFLWって感じかな。
いいね。
なかなか感が働くね。
久々に褒められた!
ただ、N_Bsという新しいパラメータは分からないな。
文脈としてはタイムアウト値っぽいけど。
N_BSについては次回以降に説明するよ。
車両診断通信はタイムアウトの種類がかなりあって、N_Bsはそのなかの一つ。
かなりってことは相当数あるってことなのか・・・。
CFのN_PCI
最後にCFのN_PCI
CFのN_PCI
1byte目 | 2byte目~ | |
---|---|---|
bit7-4 | bit3-0 | bit7-0 |
0x2 | SN | Data |
これはまたシンプルだね。
SNが何者か分かればOKな感じか。
SNはSequence Numberというパラメータで、
初期値が1であとはCF送信毎にインクリメント。
最大値は0xFで0xFの次は0x0に戻る。
受信漏れ検知みたいなのが目的なのかな?
そうだね。
SNが2だと思ってたところに3が来たら、取りこぼしているということでそのメッセージは破棄することになる。
ちなみに途中にFCは入った場合はどうなるの?
SNはリセットされるとか?
リセットはされない。
FCの前に送ったCFのSNをインクリメントした値が次のSNになる。
各種フレーム所感
たった4種類だけど、
これを実装するとなると結構手間がかかりそうだなぁ。
そうだね。
メッセージの分解や結合する処理、
不正フレームの検知、
BSやSTminのハンドリング、
まだ説明してないけどタイムアウトエラーがあるね。
でも思ったよりかは明確なんでなんとかなりそうかな。
まとめ
まとめだよ。
- 4種類のフレームの説明。
- 先頭N_PCItypeがあるので、受信時に即判定ができる。
- それぞれ固有のパラメータを持っている。
- SF。
- SF_DL。
- FF。
- FF_DL。
- FC。
- FS。
- BS。
- STmin。
- CF。
- SN。
- SF。
バックナンバーはこちら。
コメント