本日はOBDIIの複数PID同時通信についてです
OBDIIの通信方法としてまず参考にするのがWikipediaの記事
https://en.m.wikipedia.org/wiki/OBD-II_PIDs
です。
ここにCAN通信を行ったときのプロトコルが書いてありますが、
ここに書いてある例では一回のECUへの問い合わせ(Query)で使うPID(車両センサ情報の種類)は一つのみになっております。
よって複数のPIDを問い合わせる場合には、PIDの数だけ問い合わせを発行しなくてはならず、結果PIDの数だけ通信が遅くなってしまいます。(例えば1回の通信の応答時間が20msだとすると6種類の PID を問い合わせるのに20*6=120ms要し、fpsに換算すれば10fps以下とコマ送りになってしまいます。)
一方ELM327のデータシートにはMultiple PID requestという項目があり、通信先の ECUが条件を満たせば、最大で6つのPIDを同時に問い合わせることができるとあります。
(
ここのデータシートの45ページ目参照。)
というわけでこれの実装トライしてみます。
ELM327→ECUへの通信はELM327のデータシートにある通り、問い合わせたいPIDをまとめてELM327に送れば良いようです。データシートの例にもありますが、エンジン負荷(PID:04)、水温(PID:05)、インマニ圧(PID:0B)、エンジン回転数(PID:0C)を一度に問い合わせるならば、
01 04 05 0B 0C
とELM327に投げれば良いことになります。(同時問い合わせをしないならば01 04, 01 05, 01 0B, 01 0Cの5回要求を投げ、各々1回毎にECUからの返答を待たなくてはなりません)
ただ、ECUからの返信に関しては注意が必要で、データとしては「問い合わせたPID」+「PIDに対応したデータ(センサ値)」の組(上の例なら4組分)がまとめて返ってくるわけですが、このPIDとデータ組の合計が6バイトを超えると、(データシートの例にある通り)通常とは変わった複数行フォーマットでELM327は読み取りデータを返すことになります。
例えば、
エンジン負荷(04)と水温のみ(05)の問い合わせならば、どちらもデータは1バイトであり、PIDと合わせても合計2*2=4バイトなので、ELM327の応答は
41 04 3F 05 44
(PID04 のデータが3F、PID05のデータが44)
となるわけですが、これにインマニ圧(PID:0B)、エンジン回転数(PID:0C)を加えた場合は
00A
0: 41 04 3F 05 44 0B
1: 21 0C 17 B8 00 00 00
と返信のフォーマットが変わるので、これを考慮したプログラムが必要です。
(実のところこのようにフォーマットが変わるのは、ECUが返信を2回に分けて行っているからなのですが、これについては次のECU編で書きます。)
ブログ一覧 |
メーター | 日記
Posted at
2023/03/05 14:49:39