ASCII→数値変換

シリアル通信などで受信したデータは基本的にASCIIコード(アスキーコードと読みます)となります。文字コードということで、難しそうに思えますが、簡単に扱えますので使う機会があれば気軽に使用してみてください。 まずASCIIコードということでもちろん数値です。ここでは16進数で扱います。数値の組み合わせで「文字」を表現するのです。各文字にはそれぞれ文字コードが設定してあります。 例えば”A”という文字は16進数で”41”となります。16進数なのでHEXの頭文字を利用して”H41”と表現します。これがASCIIコードとなります。

ASCIIコードは2文字でデータレジスタ1個使用します。10文字扱うにはデータレジスタが5個必要です。注意しなければいけないのはシーケンサーでは文字の並びが反対になることです。 例えば”AB”という文字は”H4241”となります。”42”が”B”です。つまりそのまま読むと”BA”となりますが、実際は後ろの文字から読みます。 このことは1個のデータレジスタに対してなので、”ABCD”という文字は、”H4241”と次のデータレジスタに”H4443”となります。

実はQシリーズ以上のクラスのシーケンサーになるととても簡単に使用できます。”$”を指定します。例えば「D0」に”AB”を書きたいときは、
[$MOV "AB" D0]
と命令するだけです。外部機器接続例のDL−RS1で実際に使用したプログラム例がありますので、参考にしてください。

測定値などをRS−232Cなどの通信で受信すると、基本的にはASCIIコードで受信されます。測定値は数値でも、受信した段階でASCIIコードの数値になっています。 (同じ数値でも、文字としての数値なのでコードになっています。)例えば”1”という数値を受信すればASCIIで”H31”となります。最近のシーケンサーではこのような文字から実際の16ビット整数に変換することも容易にできます。 指数フォーマットで受信しても簡単に変換できます。詳しくは外部機器接続例のDL−RS1を参考にしてください。

しかし少し古いシーケンサーだと、数値に変換する命令が存在しないため自力で1文字ずつ変換する必要があります。「DL−RS1」という機器からデータを受信し、便利な命令を使用せず変換を行ってみます。

まずはデータを受信するプログラムです。

これは一般的な受信方法で、マニュアルに書いてあるとおりの方法です。受信データは「D200」〜に書き込まれてきます。受信完了後に「M160」がパルスで出力されます。

正常に受信されたレスポンスコマンドは次のようになります。
M0,+123,456
最初に”M0”の文字が入ってきます。”123、456”の部分に実際の測定値が入ってきます。複数のセンサーの場合は”,”区切りで次の値が入ってきます。

「D200」は先頭文字を見ています。「DL−RS1」が正常にデータを受信すると、先頭文字は”M0”となります。先頭文字「D200」が”M0”であれば次の条件にうつります。上の回路で
[= k12365 D200]の部分です。(すみません本来はkではなくHの16進数で指定したほうが分かりやすいですね。そのままモニタした値をかいてしまったので・・・)

次は符号を見ています。「DL−RS1」はマイナス符号のときはセンサーが反応していないときです。そのため符号がマイナスなら強制的に受信値を”0”にするようにしています。

データが正常なら「M161」がパルスで入ります。次の工程で1文字ずつ変換していきます。

ここではストローク10mmのセンサヘッドを使用しています。そのため9.999mm以上の測定は想定していません。5桁目と6桁目は削除します。 次に測定値は最終的に16ビット整数にします。そのため小数点も省きます。MAX”9999”です。

データレジスタの中身は次のようになります。
「D200」:M0
「D201」:,+
「D202」:12
「D203」:3.
「D204」:45
「D205」:6

4桁のみしか使用しないため「D203」から処理をします。プログラムの最初でまず「D203」を「D220」へ転送します。 そして「WAND」の命令で”H0FF”を掛けています。これは論理演算命令で、論理積です。D203は16ビットです。”H0FF”で必要な8ビットのみ”1”をたてて、必要ない8ビットは”0”にして掛けています。 これにより”3.”→”3”となります。必要ない”.”を消しています。このような処理をビットマスクとも言います。

次の処理も同じことをしています。「D221」には”4”が残ります。そして次に「SFR」という命令が出てきました。これはビットシフトで、「D222」の中のビットを8個右にずらしています。 これで「D222」の値は”5”になります。最後も同じようにします。この処理は、データレジスタ1個に対して1文字をいれています。データレジスタの中身は次のようになります

「D220」:3
「D221」:4
「D222」:5
「D223」:6

次はASCIIコードを数値に変換します。

変換方法ですが、数値に変換する場合は、16進数で”H30”をひけばいいのです。例えば”4”という文字はASCIIで”H34”です。そこから”H30”をひけば”H4”となります。 16進数で4という数値ですが、9以下なのでそのまま10進数として使用できます。これが変換方法です。1桁目〜4桁目まですべて変換します。

次は分解された数値の結合処理です。

4桁目は1000の桁なので1000を掛けています。同じように3桁目は100の桁なので100を掛けます。ここまでくればもう少しです。

最後にすべての桁の数値を足せば完了です。受信した数値は「D240」に転送されるようになっています。

このような処理を始めて経験される方はすごく複雑に感じるかもしれません。実際データ処理は複雑になります。しかし、この部分が正常に動くことを確認したら基本的にはこの部分を今後修正することはほとんどありません。 これはプログラムの組み方にもよるのですが、この部分はプログラムの動作部分から外し、最後の辺りに書きます。データを受信すれば「D240」に値が入ってくるので、この値を転送して使うのです。

例えばメインプログラムから「DL−RS1」に対してデータ要求信号を出します。そして「M163」が入ったらデータ受信完了とし、「M240」からデータを転送します。つまりデータ処理の内容は特に気にすることもなく、「D240」と「M163」のみを気にすればいいのです。 このようにプログラムを構造化しておけば、複雑な処理は一度書いてしまえば後は使うだけです。回路全体もシンプルに見えると思います。



PCによるシーケンス制御の活用

シーケンス制御を短期間で理解するには通信講座がお勧めです。シーケンス制御講座(このサイト)ではシーケンス制御をできるだけわかりやすく説明していますので、一度目を通していただければ通信講座も短期間で身につくと思います。


わかりやすい電気保全

シーケンス制御講座(このサイト)ではシーケンス制御について詳しく解説していますが、実際の保全業務となるともう少し広い範囲の知識も必要です。故障した設備を素早く原因を探して素早く直す。実際はなかなか難しいことです。 浅くてもいいので少し広く知識を持っていれば、役にたつと思います。


図解入門 よくわかる最新 シーケンス制御と回路図の基本はKindle版(電子書籍)です。単行本ご希望の方は、フォーマットで単行本を選択してください。または、トップページよりご購入ください。

Copyright (C) 2010 シーケンス制御講座, All rights reserved.