WRX OBD2で車両情報を取得する その11 アスキーコードを数値に変換

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

前回、ELM327から返信されるエンジン回転数について16進数の2バイトで表されるとしましたが、実際にはアスキーコード(文字列)で返信されているので、この文字列を読み取った上で数値として扱える様に変換する必要がある事が分かりました。当初はPLCで用意されている変換命令を使えばいいか、くらいの認識でいましたが、よくよく考えると少し面倒な事になりそうです。

スポンサーリンク

ELM327からのアスキーコードと問題点

前回「010C」コマンドで車両のエンジン回転数取得をELM327に要求し、その後の繰り返しのエンジン回転数取得の為の「CR」送信を行った場合に、ELM327から返信された内容は「0D 34 31 20 30 43 20 30 41 20 43 42 20 0D 0D 3E」でした。これをアスキーコード(16進数)として文字に変換すると「(CR) 4 1 (SP) 0 C (SP) 0 A (SP) C B (SP) (CR) (CR) >」となります。CRはリターン(改行)、SPはスペース、>はプロンプトです。エンジン回転数を示しているのは「0 A」と「C B」ですが、元のアスキーコードでは「30 41」と「43 42」です。ここまで理解した上で実際にエンジン回転数を得ようとすると、色々面倒な事があると分かります。

ちなみにPLCのタッチパネルでは「文字入力器(表示も兼ねる)」を使えば、アスキーコードから勝手に文字に変換して画面上に表示してくれます。CRやSPもリターンやスペースとして表示します。アスキーコードをそのまま表示したい場合は「数値入力器(表示も兼ねる)」を使います。

アスキーコードから数値へ変換

エンジン回転数を取得するために欲しいデータは、先のアスキーコードから文字に変換後の「0A」と「CB」なのですが、元のアスキーコードでは「30 41」と「43 42」です。「0A」や「CB」はその後はさらに2桁の16進数として扱うのですが、アスキーコードはあくまで1文字ずつを扱っています。「0A」は10進数で「10」という数値ですが、アスキーコード「30」と「41」は単なる「0」と「A」の文字なので、2桁の数値として組み合わせる必要があります。組み合わせると言っても単純にプラスするのではなく、「0」は十の位である事に注意が必要です。今回はたまたま「0A」なので「0+A=A」でも10進数で「10」になりますが、「1A」の場合は10進数で「26」、「1+A」は「B」であり10進数で「11」になってしまいます。

「CR」や「SP」などの特殊文字

アスキーコードでは文字以外に「CR(リターン)」や「SP(スペース)」といった、実際の文字ではなく機能を意味するコードもあります。データとして扱う上では邪魔になる場合がありますが、ELM327ではATコマンドで改行の有効無効(L0、L1)、スペースの有効無効(S0、S1)のオプション機能があります。ただし私が購入したスキャンツールのELM327のバージョンが「1.2A」と古く、スペースの有効無効のオプション機能はありませんでした(バージョン「1.3」から)。

データデバイスへの格納

現状、ELM327から返信されるデータは先頭からPLCのデータデバイスに2バイトずつ格納しています。先の「CR」や「SP」といった特殊文字も、返信されるデータが決まっていれば(データ長が一定であれば)必要なデータデバイスだけを使えば良いのですが、2バイトずつ格納してしまうと上位バイトと下位バイトを分けなければなりません。この場合はELM327から返信されるデータの格納方法を「1バイト」とする事で回避出来ます(必要なデータデバイス数は倍になりますが)。また下位バイトに格納する事で上位バイトの「00」は無視されますが、上位バイトに格納してしまうと例えばアスキーコード「30」ではなく、下位バイトを含めた「3000」になっていしまいます。

アスキーコードへの対応

利用しているPLCにはアスキーコードを実際の16進数の数値に変換する命令語があります。ただし変換できるアスキーコードは16進の数値文字(0~F)までですが、ELM327から返信される内容もエンジン回転数なので数値以外のアスキーコードは無い筈です。また変換後の数値は先の「0A」や「CB」として2桁の16進数となるので、十の位となる「0」や「C」は16倍した上で一の位の「A」および「B」に加えると、正しい1つの値になります。

上記ラダー回路図の9、10行目の「ATOH」は「アスキー to HEX(16進数)」の命令で、文字「1A」となるアスキーコード「31 41」をそれぞれ「31」は「1」、「41」は「A」に変換しています。11行目は十の位となる「1」に16を掛け、12行目で一の位となる「A」と足しています。各データデバイスの下に表示されている値は10進数ですが「1A」は10進数で「26」、上記の最終的な結果としてデータデバイスD46の下にも「26」と表示されています。これでアスキーコードから実際の数値に変換出来た形です。

アスキーコードが数値のみ(文字で0~F)と分かっている場合は、変換命令を使わなくても比較と計算のみでも可能です。例えばアスキーコードが16進数で39(文字で9)以下だった場合は30を引き、41(文字でA)以上だった場合は37を引きます。

上記の場合も各データデバイスの下に表示されている数値、およびアスキーコードから引く数値も10進数で書いていますが、結果としてのデータデバイスD46は同じく「26」になっています。

スポンサーリンク

エンジン回転数の計算式

エンジン回転数への計算については前回の記事で書いていますが、前回は「0ACB」を1つの16進数データ(4桁の数値)として扱いました。ただし実際にはアスキーコードからの変換を行っていないので間違えた結果になっています。今回はアスキーコードから「0A」と「CB」を分けて変換しているので、このままOBD2のWikiにある計算式で別々に扱います。

上記ではELM327のデータシート(リンク先はpdf、32ページ目)に例として記載されている「1AF8」を、「1A」と「F8」で分けて計算しています。1Aは10進数で「26」、F8は10進数で「248」です。Wikiの計算式の「(A*256+B)/4」で「A=26」、「B=248」として計算すると答えが「1726」になります。16進数で計算、あるいはデータシートに記載されている方法として4桁の16進数「1AF8」のまま4で割るだけでも答え(10進数)は同じです。

計算式によって算出された結果は最終的に10進数とすればエンジン回転数になります。利用しているPLCでは10進数と16進数は特に変換せずとも、「数値入力器(表示も兼ねる)」の方で選択する事が可能です。ただしラダープログラム上でモニターする場合は、各データデバイスに表示される数値は10進数です(先のラダー回路図の様に)。詳細モニターで16進数も確認出来ますが、通常表示される数値が10進数なので時々混乱してしまいます。

文字を表すアスキーコードの16進数、その後の文字でエンジン回転数を表す16進数、実際のエンジン回転数となる10進数。最初は何をどうしたら良いのかなかなか掴めませんでした。

その他

前回、実際に車両にELM327のスキャンツールを接続してテストした際に、「CR」送信で繰り返しのエンジン回転数取得を行うと内容が幾つか異なるパターンで表示されていました。これはELM327から返信されるデータの開始や終了の見分けがPLCで出来ていない為で、データデバイスに格納される内容が一定でない事が想像されます。

これを回避する為に受信コマンドの設定に「開始コード」と「終了コード」があります。上記ではELM327から返信される最初の「0D」を開始コード、最後となる「3E」を終了コードに設定しています。開始および終了コードを設定すれば返信されるデータは毎回同じデータデバイスに格納される、と思っていますがまだ試していません。次回はまた車両で確認してみての結果についてになると思います。

・・・ただしここまではエンジン回転数のみの取得なのでなんとかなりそうな感覚でいますが、同時に複数項目を取得する場合についての方法がまだ全く見えていません。またそろそろ車内にもノートPCを持ち込む必要がありそうです。車内ではあまり作業したくは無いのですが、確認が取れないと次に進めません。

「OBD2」関連記事

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

その他

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

注記

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