シーケンサでの数値の扱い方
たかが数値を表すだけで、何でこんなにも形式があるんでしょうね。
もういっその事、10進だけで表記してしまえ~!ってやっても、全然OKなのです。
それが良いっていうのならね。
よく使う、BIN,H,BCD についてまとめましたので、理解を深めてみましょう。
どうも!ずぶ です。今回はシーケンサでの数値の扱い方
※シミュレータを使用しています
シーケンサでシミュレータの使い方
※※ ツブツブに注意!※※
レジスタ内の数値って何?
そんなもん、中に入ってる「5」とか「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も演算装置です。 丸め誤差には注意 しましょう。
ご覧のように、モニターを確認すると、演算結果がずれている事が判ります。
回避するには、最後に除算 を持ってくるなど、計算順序の工夫 が必要でしたね。
最大値 に気を付けよう
演算の丸め に気を付けよう
取扱いは 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ビット として見た場合、重みが 2 の場所が点灯していますよね。
この通り、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(応用命令)の使い方
最近のコメント