シーケンサは文字を扱うのが苦手!
なんて事を聞いた事があるかと思います。
はたして、本当にそうなのでしょうか?
GOTを使い、文字列がどのように動くかを一緒に見て行きましょう。
どうも!ずぶ です。今回は シーケンサでの文字列の扱い方
文字列入力オブジェクトを使ってみよう
GOTで文字列といえば、文字列入力オブジェクト
貼り付けて設定するだけで簡単に使えますよね。
それだけだとつまらないので、
番号に紐づけして、文字列を格納できるプログラムを作ってみます。
プログラム
画面
番号に入力文字列を 紐づけして、登録/読み出し を行います。
文字列を格納できるプログラム!なんて言っちゃったりしましたけれど
お分かりのように、このプログラム
数値入力 であろうと 文字入力 であろうと、関係ありません 。
レジスタ内データを丸ごと交換 しているだけです。
Dレジスタとして扱う分には、中身が何であろうと関係ない のですね。
とは言え
タッチパネル - シーケンサ 間でやりとりする場合、何の障害もありません。
登録名称やオペレータIDの記録など、普段使いでは、特に扱いに困るようなことはなさそうですね。
合わせて読みたい
レシピとデータマップの作り方
文字を結合してみよう
しかしながら、文字を扱うとなればレジスタの入れ替えだけでは、ちと不便。
通信等の場合、定型文 に 変数 を結合させて送信 などといった動作が必要となってきますものね。
そこでまず、文字を結合する ってのを考えてみましょう。
文字を結合させる場合は、[ $+ ]命令 を使うと楽ちんなのでしたね。
結合させたい文字を入れ込むだけ。
『 ” 』で囲む事が、文字ですよ~のサイン でした。
結果はこう
順番に引っ付いてくれて、とても扱い易いです。
ただ、決め打ちだと潰しが効かないので
タッチパネルで入力した文字を結合 させてみることにします。
文字入力オブジェクトを貼り付けて
ここでは、表示桁数だけを合わせて、後はデフォルトです。
先程のプログラムを変数化
文字列を変数に変えただけなので、入力した文字が結合されるはずですね。
では、ド~ン!
ありゃ?
何だか間の抜けた表示になっちゃいましたよ?
何が起こっているのか、デバイス一括で見てみましょう。
見事に間が空いていますね。
表示形式を変更してみましょう。
どうやら、間にいる『 2020 』が原因のようですね。
今回『 2020 』が引っ付いて来たのは、 タッチパネルの機能 です。
↑コレ
なるほど、
デフォルトでは、文字列入力オブジェクトで確保した領域を、スペース(0x20) で埋めてしまうのですね。
今回の使用では邪魔になるので、NULL(0x00) 側にチェックを入れておきます。
無事引っ付いてくれました。
スペース やら NULL やら出てきましたが、今は流しておきましょう(笑)
↓0x についての、分かり易い解説サイトです。
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
文字コード
そもそも文字って何でしたっけね?
ご存知の通り、シーケンサ内はビットの羅列しかありませんよね。
言い方を変えてみますね。
『 レジスタの中には、文字は入りません 』
レジスタ内のビットの羅列を、
ココからのデータは、文字として扱ってね!
って時だけ 文字コード に従って、表示しているのです。
文字コード というのは、よく聞く
ASCII コード とか、シフトJIS とかです。
先ほどの画面で『 A 』と登録して、デバイス一括で確認します。
表示形式ASC を選択して確認
D0に『 A 』 が格納されています。
『 さっき言ったばかりなのに、おもいっきり文字が入っとるやんけ!』
って声が聞こえてきそうですが、
表示形式ASC を選択した事が、ココからのデータは、文字として扱ってね!
って言ったのと同じ事です。
表示形式を 16bit に変更して確認
D0に『 0x41 』 が格納されています。
これこそが、現在の D0 の 中身 です。
ただの数値 なので、四則演算も出来れば、応用命令も可能な ただの数値 です。
勿論 D0 の中身は同じなのですから、
ASCIIの『 A 』は
0x41 である、という事が分かります。
ここで、ASCIIコード表 を見て下さい。
三菱電機さんの シリアルコミュニケーションの取説 から参照
この手のコード表は、使用するユニット、リーダー、プリンター等の取説の最後に大抵記述されています。
さて、
ASCIIコード表で『 A 』を探すと、
列4行1の交点に『 A 』が記載されていますよね。
(この表だと、MSDが4 LSDが1)
先ほどの 0x41 は、この行列のポイントを指していた訳です。
表から、1つの文字を表示するのに、8ビット(16進2ケタ)が必要なので
2桁目を上位指示
1桁目を下位指示 として使っていただけなのですね。
一旦、纏めます。
1文字は 8ビット(1バイト)
でもって、
1ワード は 16ビット
という事は、
1ワード に 2文字 が格納できるって訳ですね。
こんな感じ
ただ単に、文字コード上のポイントを指しているだけなのですから、
文字コードが変われば、そのポイントに登録されている文字が表示されるだけ って訳です。
例えば、KOI8コード を使った場合
KOI8-Rーウィキペディア
0x41だと『 A 』
0xC6だと『 Ф 』
と表示される事が分かります。
僕は、KOI8コード を見た事も使った事もありませんし、
そもそも、Фが文字なのか記号なのかも分かりませんが(笑)
文字コードとは、50音表のような物を行列で指定しているだけの事 なのですね。
ところで、コード表を見て、何か思いませんか?
そうですね、
指定エリアに、1ビットでもデータが入っていたら、何かしらの文字コードを指定する事になりますよね
なので、
シーケンサが、というよりもコンピューター全般ですが
文字列の終わり を認識する場合は、データが無い状態
即ち ( 0x00 ) NULL でなければ 文字列の終わりが認識出来ない のです。
最初のタッチパネル入力を取り込んだ時に、シーケンサが間を取っていたのはこういう事なのですね。
文字の格納順序
先ほどの画面に、16進数を扱える数値入力オブジェクトを追加します。
さっそく『0x42』を打ち込んでみます。
数値入力 オブジェクトに『0x42』を打ち込んだ瞬間、
文字入力 オブジェクトに『 B 』が表示されました。
文字コードを打ち込んで、文字が呼び出せるようになりました。
では、数値入力に文字コードを打ち込んで、『 BC 』を表示させてみて下さい。
『 4243 』と入れちゃいませんでした?
僕は 入れちゃった 訳なんですけど (笑)
文字表示が、ひっくり返って表示されてしまいましたね。
デバイス一括で確認してみましょう。
当然の如く、『 4243 』が格納されています。
先程の、ASCIIの箇所での概念図を思い出してください。
D0.0~.7が1文字目
D0.8~.Fが2文字目
なのでしたね。
シーケンサの場合、レジスタ内での文字順序は 若番から となっています。
通信で考えた場合、1ビットづつ送られて来る データ を順序良く納めて行くのですから、b0 を最初のデータとするのが理にかなっていますよね。
それを、16ビット である レジスタ に格納するのですから、シーケンサでの数値読みとは変わってしまうのは当然です。
シーケンサは文字の扱いが苦手 等と言われるのは、この辺りが原因かもしれません。
仕組みさえ分かれば、普通に扱っているのが分かりますよね。
制御コード
数値で入れると、ひっくり返る
それなら、
「 文字結合[ $+ ]を使えば、数値で入れる必要ないじゃん! 」
って感じなのですが、
正にその通り!
文字ですよ~ の『 ” 』で囲んでやれば良いのですものね。
ですが、文字の中には
文字になっていない文字 というものが存在するのです。
何のこっちゃですが、
再度、コード表を見てみましょう。
ASCIIコード表の、赤で囲んだ箇所ですが、
これらは、制御文字 制御コード 等と呼ばれます。
タッチパネルの箇所で引っ付いてきた
スペース(0x20) 、NULL(0x00) などが正にそれですよね。
例えば、表にある 制御コード『 ETX 』を使おうにも、
[ $+ ”ETX” ]
だと、制御コードではなく、ETXという文字がひっついて終わりです。
話は反れますが、
文字を最初に扱い出したのは、パソコン でも PLC でも無く、恐らくは タイプライター でしょう。
アナログの タイプライター を想像して下さい。
『 カチャ カチャ カチャ チ~ン 』って感じで使っていますよね。
『 カチャカチャ 』の部分は文字を打っているのでしょうけど、
『 チ~ン 』の部分は、何をしているかっていうと
タイプして紙が端っこまで行ってしまったので、
打点を紙の『 最初に戻して』『 改行 』 動作をしているのですね。
それは動作であって、文字では無い。
けれど、タイプライターを自動化しようとすれば、その動作命令は必要となってきますよね。
そこで 制御コード の出番です。
プリンター等をやる場合
行の最後に『 CR+LF 』が要求される事があります。
ちなみに、
『 最初に戻して 』が CR
『 改行 』が LF
なのでしたね。
例え、指定された文字列がどんな物でも、僕達はもうへっちゃらです。
文字コード を調べて
制御コードの場合は順序を考えて
ドッキングさせる!
それだけです。
文字コードを調べて
CR は 『 0x0D 』
LF は 『 0x0A 』
順序を考えて
CR+LF は2文字指定です。ワードに放り込むと 順序がひっくり返る のでしたね。
ドッキングさせる入れ物に入れるとすれば、こんな感じ。
ドッキング
D110 を[$+ ]で結合させれば良いのですね。
これでもう、どんな要求が来ようとも、どうにかなりそうですね。
まとめ
文字の判断は、『 ” ” 』で囲まれた範囲
文字の結合は [ $+ ]が便利
文字コードは、行列を指定しているだけ
文字コードの、レジスタ格納順序は若番から
合わせて読みたい
最近のコメント