社外部品・DIY前回、エンジン回転数以外の項目(PID)で取得してみたいとした項目の、個別でのELM327からの返信内容は確認できました。数値に計算してみると実際の状態とは合わなかったり、そもそも何を意味しているのか分からない項目もありますが、とりあえず次のステップとして個別ではなく複数項目を同時に要求するコマンドをELM327に要求し、その返信がどの様になるのかテストしてみます。スポンサーリンクELM327への情報要求これまでの記事で行ってきた車両のエンジン回転数を取得する場合、OBD2のコードで「010C(サービス+PID)」をELM327に送信する事で、ELM327が車両からエンジン回転数の情報を取得して返信してくれます。エンジン回転数以外のその他の項目も同時に取得する場合は、単純に「010C」の次に例えばエンジン水温で「0105」をELM327に送信し、その後もこの2つのコマンド送信を交互に繰り返せば良いだけです(厳密には同時ではありませんが)。ELM327のデータシート(リンク先はpdf、46ページ目に記載)には、同じサービスで複数の項目を同時に「6つ」までまとめて要求する事が出来るとあります。05」(スペースは不要)となり、サービスの後に各PIDを続けてELM327に送信します。複数のPIDをまとめて送信した場合にELM327から返信される内容は、サービスの01に40を足した41がレスポンスコードとして最初にあり、その後PID「0C」とその答えとなる2バイト、続いてPID「05」とその答えとなる1バイトとなっています。要求する項目が多くなるとELM327からの返信内容が長くなり、データシートでは複数行で返信されるとあります。00という形で返信される記載になっています。最初の「00A」は10進数で「10」ですが、これはその後の返信内容となる部分が10バイト(41~B8の10個)であることを示している様です。上記の例を見ると、41の後は単純に要求した項目(PID)の順に答えとなる値を付加して返信されています。行を示す「0:」や「1:」も含まれ、さらに改行はPIDとその答えの値の間であっても適当に行われる様です。テスト用コマンドまずは実際にELM327へ複数項目を要求するコマンドを送信し、その返信の内容を確認する事にしました。上記の様にPLCで前回確認した項目の中から適当に選んで組み合わせ、コマンドを送信出来る様にしました。0Dと、項目の数や順番などを色々変えて5つ用意しました。ELM327から返信される答えの数値は、各項目によって1バイトだったり2バイトだったりするので、その辺りも適当になる様に項目を並べています(0C、10、3Cが2バイト、その他は1バイト)。ELM327からの返信(アスキーコード)はこれまでと同様にデータデバイスに格納して、タッチパネルで用意されている文字入力器(表示も兼ねる)でそのまま文字として表示出来ますが、今回はかなりデータ数が多くなりそうなのでデータデバイスは別に設定しました。文字入力器で表示される内容以上に実際のアスキーコードの確認が必要なので、デバイスモニター画面も用意しています。表示されている内容は既に車両のOBD2ポートにELM327を接続してみた後なので、その時のデータが残っています。これまでは調査やテスト用なので正式な物は新たに作り直しますが、それでも段々画面が分からなくなってきました・・・。0B」については2つの項目しか無いので、その返信は複数行にはなりませんでした。複数行にならない為か最初に返信内容のバイト数を示す数値(この場合05?)が無く、行を示す「0:」もありませんでした。0B)がそのまま返信され、その後に「41」からの返信になる点は、これまでの1項目のみの要求コマンド時と変わりません。上記では「41」のレスポンスコード、続いてPID「05」の答えが「76」、PID「0B」の答えが「5E」です。0B」の返信は無く「41」から始まる返信だけになる点も1項目のみの時と同じでした。0B」以降のコマンドでは返信は複数行になりました。コマンド送信後、最初に同じコマンドがそのまま返信され、行を示す「0:」の後に「41」以降が続き、改行後の最初にも「1:」が追加されています。00」(エンジンは始動していなかったので回転数「0」)がその部分です。最後の「10」も答えとなる数値は2バイトです。2バイト目の「00」が上手く表示出来ていません。要求した項目順に答えとなる数値が付加されて返信される点、「CR」の場合は送信したコマンドと同じコマンドの返信の無い点は複数行にならない返信時と同じでした。上記では送信したコマンドの返信が改行されていたり、枠内に収まらない文字が次画面で残ってしまったりしていますが、タッチパネルの文字入力器ではコマンドラインの様な表示は想定していない為の結果です。データシートに記載されている、返信内容となる部分のバイト数を示す表記がありません。先の複数行にならない返信時は必要無い為かと思っていましたが、返信が複数行になってもありません。なる部分のバイト数表記はあります。上記上側の写真の「送信したコマンドの返信」内で最後の「00D」がそれです。コマンドとしても「0D」を送信しているので勘違いしていました。「00D」は10進数で「13」ですが、送信した項目(PID)数は「5」。この内の2つの項目(0Cと10)は答えは2バイトで返されるので、最初のレスポンスコード「41」も含めると「5(各項目)+5(各項目の答え1バイト分)+2(答えが2バイトとなる項目分)+1(レスポンスコード)=13」です。複数行にならない場合に返信内容のバイト数表記がありません。返信結果を見てみて基本的には要求した項目の順に答えが付加されて返信されることは分かりました。表示される「文字」を見る分には分かり易いのですが、実際にはELM327からの返信はアスキーコードなので上記の一文字ずつを表す16進数、さらにスペース(SP)や改行(CR)を表す16進数も含んでいます。上記は今回用意したモニター画面(画像は先の物と同じ)ですが、今回は確認なのでPLCのデータデバイス1つに対して2バイト(2文字)を格納して文字入力器で表示しています。それでもモニター画面で用意していたデバイス数を超えてしまいました。エンジン回転数を扱った時もそうでしたが、アスキーコードからの変換や数値計算は1つのデータデバイスに1バイトずつ格納した方が楽なのですが、複数項目の場合はかなりのデータデバイス数になってしまいます。この中から各項目で答えとなる数値を見つけなければなりません。これを考えると正直、返信内容のバイト数を示す表記(私のELM327にはありませんが)や、行を示す表記は邪魔なのですが・・・。ELM327に対して要求する項目は最初からPLC側で分かっている事なので、その要求順はPIDの先頭から近い順にする、答えとなる数値が1バイト及び2バイトでは1バイトの項目を先、2バイトの項目を後に、などとある程度法則を決めるしかないとは思っていますが、今現在その方法は全く思い付いていません。法則化し過ぎても汎用性が無くなってしまいますし、取得したいとした項目以外を後から追加した場合でも、少しのプログラム修正で上手く答えの数値を拾える様にしたい所です。以下は「OBD2」タグの記事一覧です(投稿順)。現在の記事とこれ以降に投稿した記事も含みます。OBD2の分岐ケーブルについてその他ブロック形式でプログラミングが行える、教育用「micro:bit」も始めてみました。micro:bitでもELM327と接続して車両OBD2ポートからの情報取得を試しています。車両からエンジン回転数を得るmicro:bit全体の記事は以下から始まります。micro:bitの購入2020年から小学校でのプログラミング教育が必修化されます。...https://hito-log.com/2019/12/02/post-11430/注記OBD2の仕様は各メーカーや車両で異なる部分があります。メーカーや車両によってはアフターマーケット製品による利用を推奨していない場合や、利用した場合による不具合発生の可能性を示している事があります。このブログ内で書いている内容はあくまで私の車両、私の利用する製品や機器での場合です。他メーカーや他の車両をはじめ、同じメーカーの車両または製品、機器であっても記事内容の保証、責任を負う事は出来ません。記事内で紹介している製品や、その他の類似製品を購入・利用する場合はそのメーカーや購入先で、利用する車両などへの適合を確認し、自己判断と自己責任の下で利用して下さい。OBD2やELM327、その他記事内容について個別の問合せや依頼を頂いても回答する事は出来ませんので、予め御了承下さい。Inc.の登録商標です。その他のブランド名または製品名は各所有者の商標です。