シーケンサでの文字列の扱い方

シーケンサ

シーケンサは文字を扱うのが苦手!
なんて事を聞いた事があるかと思います。

 

はたして、本当にそうなのでしょうか?

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[$+   ]で結合させれば良いのですね。

 

 

これでもう、どんな要求が来ようとも、どうにかなりそうですね。

 

まとめ

文字の判断は、『 ” ” 』で囲まれた範囲

文字の結合は [ $+   ]が便利

文字コードは、行列を指定しているだけ

文字コードの、レジスタ格納順序は若番から

 

 

 

合わせて読みたい

シーケンサでシリアル通信をしよう