WRX OBD2で車両情報を取得する その10 その他のPIDとエンジン回転数の取得

2018年11月4日OBD2, 社外部品・DIY

前回「0100」コマンドで車両がサポートしているPID(01~20の範囲)を調べましたが、今回はそれ以外の範囲にあるPIDのサポート状況を「0120」~「01C0」コマンドを使って調べてみました。また「010C」コマンドで現在のエンジン回転数を実際にPLCから要求し、車両から正しく読み取れるかのテストも行いました。

スポンサーリンク

PID01~20以外のサポート状況

OBD2の各サービスとPIDの関係と、実際に車両がサポートしているPIDを調べる方法については前回の記事に書いています。ここでは前回の「0100」で調べる事の出来たPID範囲(01~20)以外の内容を見ていきます。PLCでは前回用意していなかった「0120」~「01C0」までのコマンドを追加しています。

0120(PID:21~40)

「0120」によって車両から取得出来た内容は「41 20 90 07 B0 11」でした。「41 20」はレスポンスコードなので「90」からの各文字を2進数に変換して順番に並べます。すると下記の様に「1」はサポートする、「0」はサポートしないPIDとして分かります。

0140(PID:41~60)

「0140」で取得出来た内容は「41 40 FE DC 80 40」です。「41 40」を除く「FE」から2進数に変換します。下記がその結果です。

「0140」では最後のPID「60」がサポートしないとなっています。

0160~01C0(PID:61~E0)

「0160」では「NO DATA」となってしまいました。先の「0140」でPID「60」自体がサポートされていない為と思われます。またこれ以降の「0180」~「01C0」も同様に全て「NO DATA」です。PID「60」がサポートされないので、PID「80」のサポート状況も知る事が出来ない、さらにそれ以降も・・・という事でしょうか。

従って私の車では、サービス「01」内ではPID「01」から「60」までの範囲に限ってサポート状況を調べる事が出来ました。メーカーやディーラーで使用する診断ツールであれば、PID「60」以降を有効にするコマンドか何かがありそうですけれど。またWikiによるとサービス「01」以外では「05」や「09」でもそのサービス内のサポート状況を調べるPIDがありますが、そこまで調べてもあまり意味は無さそうなので、サービス「01」のみでやめておきます。

エンジン回転数の取得と計算

「0100」で調べたPID範囲内で「0C」はエンジン回転数になっています。前回の記事で「0C」はサポートされているので、「010C」コマンドで車両からエンジン回転数を取得して、PLCで正しく認識(表示)出来るか試してみます。

送信するコマンドと返信される内容

ELM327へコマンドを送信すると、ELM327からは最初にレスポンスコードが返信されます。レスポンスコードの後に続く内容が送信したコマンドに対する「答え」なのですが、ELM327のデータシート(リンク先はpdf、12ページ目)によると同じコマンドで繰り返しのデータ取得を行う場合は、新たにコマンドを送信しなくてもキャリッジリターン(CR)を送信する事で、前回と同じコマンドを繰り返すとあります。

またWikiによると「010C」で返信されるエンジン回転数の答えは2バイトで、さらに計算式に基づいて計算を行う必要があると書かれています。計算式は2バイトの前の値を「A」、後の値を「B」とすると「(256A+B)/4」となっています。

ELM327のデータシート(32ページ目)にも例としてエンジン回転数が記載されています。PLC内で計算プログラムも作成して試す事が出来るので、テストとしてエンジン回転数を選びました。

テスト用のPLC画面とプログラム

エンジン回転数の取得用に新たに画面とプログラムを作成しました。上記の「送信」ボタンはELM327に「010C」を1回送信します。右側の「0.5S」~「0.02S」はいずれかを選択するとその時間間隔で「CR」を送信します。最初に「送信」ボタンで「010C」を送信しておき、その後は時間間隔で「CR」を送り続ける事で、繰り返しのデータ取得を行う考えです。

また取得出来たデータの計算はWikiでは先の計算式ですが、ELM327のデータシートでは単純に16進数となっている取得データを2バイトのまま10進数にし、「4」で除算するだけの記載になっています。データシートでは取得データの例を「1AF8」としていますが、16進数「1AF8」=10進数「6904」、これを4で割った「1726」が回転数となっています。

一方のWikiの計算式に合わせると1バイト目の16進数「1A」=10進数「26」、2バイト目の16進数「F8」=「248」となり、「(256*26+248)/4=1726」で同じ値になります。結局は2バイトを一緒に扱うか個別に扱うかの違いだけでした。

PLCのプログラム(ラダー)については特に載せませんが、DMは2バイト格納出来るので(※1)ELM327のデータシートの方法で計算を行っています。ただし16進数のまま4で割って、数値表示の際に10進数として表示しているだけです。(1AF8)/4=6BE、16進数「6BE」=10進数「1726」。

スポンサーリンク

実際の車両での結果

実際に車両のOBD2コネクターにELM327を繋いでテストを行いましたが、先に結果を書いてしまうと全くダメでした。PLCから最初の「010C」の送信とその後の「CR」の繰り返しの送信は出来ていて、ELM327からもデータの返信はあるのですが、実際の回転数とは異なる値で5種類くらいがパラパラと表示されています。

上記写真はその時にPLCに格納されたデータですが、内容をアスキーで順番に見ていくと(CR)・4・1・(SP)・0・C・(SP)・0・A・(SP)・C・B・(SP)・(CR)・(CR)・(>)と読み取れます。実際に文字表示してみると下記になります。

・・・ここで間違いに気が付きました。ELM327から返信される「2バイト」の意味はアスキーで表される「0A」と「CB」です。私はてっきり「0ACB」がそのまま返信されると思っていました。さらに「CR」による繰り返しでの返信では、ATコマンドの時はレスポンスコードは付かなかったので、OBD2へのコマンド時も付かないと思っていました。上記では「010C」に対するレスポンスコード「410C」が付いています。

現状のPLCでは「0ACB」だけが返信されると思っていたので、単純に格納されるDMを4で割るだけの計算式になっています。この事から先の(※1)になっています。ちなみに「0ACB」は10進数で「2763」、4で割ると「690」になります。

上記は実際の車両のタコメーターと、普段OBD2に接続しているトラストのインフォメータータッチです。インフォメーターはさすがに正しい値を示しています(誤差は写真撮影のタイミングによる)。現状のPLCでは「845~4200」の間で適当な値になっています。

さて、どうしたものか。今回の様にエンジン回転数だけを扱うのであればレスポンスコードは無視すれば良いのですが、複数のPID項目を扱う場合はレスポンスコードを認識して、後に続く文字を返信(結果)とする必要があります。

「CR」の送信時間間隔(スキャンタイム)

今回「CR」の送信時間の間隔で、用意した「0.5S」と「0.2S」はELM327本体のLEDでそれなりの速さで点滅しますが、「0.05S」と「0.02S」は明らかにその速さでの点滅ではありません。さすがに早すぎるのかと思いましたが、時々LEDがほぼ点灯状態となって「0.05S」や「0.02S」で通信出来ている様な状態にもなりました。ただしそのきっかけが分かりません。ちなみにPLC自体のスキャンタイムは現時点で10~12ミリ秒(0.010~0.012S)です。PLCとELM327間のRS232Cは9600bpsと遅めですが、データが少ないので間に合っていると思います(根拠は無し)。

「OBD2」関連記事

以下は「OBD2」タグの記事一覧です(投稿順)。現在の記事とこれ以降に投稿した記事も含みます。

その他

PLCよりも手軽にプログラムが組める「micro:bit」も始めてみました。以下の記事から始まります。

注記

  • OBD2の仕様は各メーカーや車両で異なる部分があります。メーカーや車両によってはアフターマーケット製品による利用を推奨していない場合や、利用した場合による不具合発生の可能性を示している事があります。
  • このブログ内で書いている内容はあくまで私の車両、私の利用する製品や機器での場合です。他メーカーや他の車両をはじめ、同じメーカーの車両または製品、機器であっても記事内容の保証、責任を負う事は出来ません。
  • 記事内で紹介している製品や、その他の類似製品を購入・利用する場合はそのメーカーや購入先で、利用する車両などへの適合を確認し、自己判断と自己責任の下で利用して下さい。
  • OBD2やELM327、その他記事内容について個別の問合せや依頼を頂いても回答する事は出来ませんので、予め御了承下さい。
  • ELM327はElm Electronics Inc.の登録商標です。その他のブランド名または製品名は各所有者の商標です。