シーケンサでの数値の扱い方

FA

シーケンサでの数値の扱い方

たかが数値を表すだけで、何でこんなにも形式があるんでしょうね。
もういっその事、10進だけで表記してしまえ~!ってやっても、全然OKなのです。
それが良いっていうのならね。

 

よく使う、BIN,H,BCD についてまとめましたので、理解を深めてみましょう。

 

どうも!ずぶ です。今回はシーケンサでの数値の扱い方

※シミュレータを使用しています
シーケンサでシミュレータの使い方

 

※※ ツブツブに注意!※※

レジスタ内の数値って何?

そんなもん、中に入ってる「」とか「126」とかの数値に決まってるじゃないですか

 

ですよね~

 

それじゃ、レジスタ内の数値を見てみましょう。

 

ご存知の通り、ビットの集まりでしたね。

 

ツールなら、数値が表示されていますが、今のところは置いておいて
数値って何なのかを、一緒に考えてみましょう。

 

上のビットの集まりは、2進表記で

[ 0000 0000 0110 0100 ]

と表せます。

 

それをふまえて、いつもの デバイス一括モニター で数値を見てみましょう。

10進表記です。

 

16進表記です。

 

表示の数値は変化していますが、中身のビットは変化していません

 

ビットが同じって事は、数値を取り扱うというのは、このビットをどう読むか
という事に他ならないのですね。

 

BIN

実際に画面を作って、2進数の [ 0101 ] と [ 0110 ] を足してみましょう。
(10進表記だと、5 と 6 ですね)

ケタも上がって、[ 1011 ] になりました。
(10進表記だと、11 ですね)

 

この位なら、何て事はないですが

こんなになったら、もう大変です。

 

 

なので、普段はツールのチカラを借りて、10進数で表示しているのですね。

ありがたいですね~

光っているランプの重みを全て足したものが右の10進表記です。

ランプの下に 1,2、4 ・・ と書いてあるのが、重み です。
(つまり 2進数 を 10進数 に翻訳したもの)

ちなみに全部ランプが点灯した場合は、65535 ですね。

このように、2進数の重みでそのまま計算できる ものが BIN という事になります。

 

中身は一緒なのですから、H64 でも K100 でも、自分にとって使い易い表記で良いのです。

閑話
自分で作って何ですが、ランプのツブツブを並べたらゾワッとしますね。
同じ物の並びに強い嫌悪感を感じてしまう、集合体恐怖症(トライポフォビア)というのがあるそうです。

10進数での取り扱い

10進数ならば、プログラム内での取り扱いは『K』ですよね。

 

四則演算も可能なので、特に 取り扱いに注意もない です。

 

なのですが、PLCも演算装置です。 丸め誤差には注意 しましょう。

ご覧のように、モニターを確認すると、演算結果がずれている事が判ります。

回避するには、最後に除算 を持ってくるなど、計算順序の工夫 が必要でしたね。

 

>> 2進数( BIN )<<

最大値 に気を付けよう

演算の丸め に気を付けよう

取扱いは 10進数 と同じ

16進数(H)

通常使用する 10進数 や 16進数 は BIN の上に成り立っている事が判りました。

ですが、ベースが2進数である以上、10進数をリンクさせる事は無理です。
(10や20が表示できないという意味ではなく、範囲ビットが全てONで10が出せないという意味です)

なので、10に一番近い2進数(8もしくは16)が良く使われるのですが、ここでは16進数で話を進めます。

 

16進数の「 F 」をビットで表した場合、4ビットが必要 になりますよね。

こういうこと

 

という事は、 4ビット毎に1つの数値 を割り振る事が出来るという事なので、ワードの単位である 16bitだと4つの数値(4ケタ)が表せるという事となります。

 

試しに、ワードデバイスに H1234 と入れてみましょう

入力した H1234 の 3ケタ目は2 ですが
3ケタ目 に対応するビット D0.8~11 だけを 4ビット として見た場合、重みが の場所が点灯していますよね。

この通り、16進数で表記した場合、4ビットで1つのケタ が表せるわけです。

 

では、H1234 に H766 を足してみましょう。

合計は H199A となりました。

そりゃそうですよね、16進数なのですから、9の次はA~F までが詰まっています。

 

どうやら、四則演算をそのまま表示するのには向いてなさそう ですね。

 

そうは言っても、65535 をわずか 4ケタ で表示することができるのですから、1ケタ辺りの情報量は大きなものがあります。
その性質から、通信や、エラーコード表示 に使用される事が多くなります。

 

ですが、

 

16進数の使い易さと言えば、やはり 論理演算 ではないでしょうか。

ついでなので、覚えておくと便利な論理演算と命令をご紹介します。

 

WAND命令

[ H0F ] この記述を何度か見掛けた事があると思います。

 

こういうビットの状態ですね。

なぜこの記述だけ、よく見かけるのでしょうか?

 

実は、HOF に数値としての意味は殆どありません。

穴の位置 を示しているだけです。

 

1ケタ全て、ビットON で埋まっているのですが、これを トコロテンの口金のような感覚で使用 します。
(よく考えたら、トコロテンを作るところを見た事がありませんでした。(笑)  板に開いたスリット でしょうか?)

 

 

さっそく、H1234 と H0F を WANDで演算 してみましょう。

 

ね、

穴の開いた1ケタ目 の数値だけが落ちて来て、H04 が取り出せました。

 

 

同じく、H1234 と HF0F を WANDで演算 してみます。。

 

今度は 穴が2つ なので、1ケタ目、3ケタ目 の数値が落ちてきて、H204 が取り出せました。

 

このように、D0 に対して、穴の開いた D1 を重ねて数値を取り出したりする事を、マスクを掛ける と言います。

 

 

馴染みのあるところでしたら、IPアドレス を設定する時に、サブネットマスク というのがありますよね。

「 255.255.255.0 」
って奴です。

あれが何をしているのか、試しに 16進数 と ビット に変換してみて下さい。

 

ROL、ROR命令

16ビットデータを、輪っか状に繋げて 右回転、左回転させる命令ですね。

こんなイメージ

 

プログラムはこんなの

 

↓これが、

 

[ ROL ] を起動させると、

 

↑こうなりました。

 

[ ROL ] の引数に K4 を指定しているので、ちょうど 1ケタづつ移動 するのですね。

 

なので、視覚的なイメージは、少し変わります。

↓これが

↑こうなる感じ。

凄くシンプルになるでしょ。

 

実際には、ローリングしてきた1ケタ目を取り出して実行 のように、この数値に意味を持たせて使用します。

例えば、搬送機の移動順だったり、リボルバー式の装填、なんかが良さそうですね。

 

これらを10進数で行おうとすると、計算式が必要となります。
それだと、書いている時は良いのですが、読み返す場合、ちとゴチャゴチャしてしまいます。

 

他にも色んな論理演算がありますから、色々組み合わせてみるとシンプルなコードが書けるかもしれませんね。

 

>> 16進数(H)<<

4ビット1括り で捉えよう

通信やコードでの使用が多い

四則演算よりも 論理演算 を多用する

BCD (2進化10進数)

16進数の紹介で、四則演算には向いていないと書きました。

 

これは、僕達が人だからです(笑)

 

H 2E0 とか書いても、咄嗟には分かり難くないですか?
けれど、コンピュータは、元より BIN で回しているので、表示など何でも良いのです。

 

例えば、

ツールが10進数に直してくれない状況で、データレジスタのビット状態を見て、紙に書き写す 場面を想定してみて下さい。

「00000000010・・・・・・・」

十中八九、間違えそうですよね。

 

 

4ビット毎なら何とか読めそうなので、

「2E0」

後から。電卓片手に変換すれば楽です。

 

じゃあ

「304」

結構な確率で、10進数と16進数がごっちゃになりそうですよね。

 

 

4ケタ一括り は、読むのに優しい事は判ります。
ですが、人様が見る場合、16進数 はちと邪魔くさい。

そうしたら、

A~Fまでを削って10進数って事 にしたら良いんじゃね?

 

ってのが、BCD です。(ぶん投げで申し訳ないですが(笑)

 

けれど、本当にそうなのです。

 

 

ね、

 

Hの欄が0~9以外が含まれている なら、BCDの欄で「—-」となっていますが、D1の数値「120」と合計値のD2「400」はそのままBCD欄にも反映されているでしょ。

 

ただ、普通に『+』して、BINとして計算されている ので、D2の合計値「400」は16進数の「H400」です。
BCDの欄にも「400」と表示されていますが、BCDの「400」ではありませんよね

たまたま 「H400」 がBCDで表示できる範囲にいた だけです。

 

 

なので、BCD演算 をかける時は、「これは BCD だよ」っていうのを教えてあげなくてはなりません。

 

やり方は簡単

 

BCD の頭文字 「 B 」をつけるだけ。

 

実際に、先ほどの演算 1234+766 を演算してみましょう。

 

 

答えは、199A ではなく、2000 と表示してくれました。
10進数として、計算してくれたのですね。

 

もうお分かりでしょうが、この「2000」を BIN として読んだところで、もはや意味が変わってしまっています。

なので、BINーBCD BCD-BIN と 変換する命令を経由 しての数値の取り扱いが必要となります。

 

7セグ表示や、計測器からのアンサー等、使用するケースは沢山ありますので、きっちり抑えておきたいですね。

 

2進化10進数( BCD )

16ビットを4ケタの10進数で扱います。

16進数のA~Fを削ったものがBCDです。

 

あわせて読みたい

シーケンサのラダーでの計算 

シーケンサのレジスタの違い

シーケンサの文字データの扱い方

ビットをレジスタのように扱いたい時は
K4X000(応用命令)の使い方