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

シーケンサ

『シーケンサなら計算も簡単でしょ?』

 

使用者にとって、中身がパソコンだろうがシーケンサだろうが基盤だろうが
コンピュータなのだから、計算はお手の物!

なんて考えているのでしょうね、きっと

 

何かと面倒くさいラダーでの計算を、ポイントを絞って見て行きましょう。

どうも!ずぶです。 今回は シーケンサのラダーでの演算、計算

 

※四則演算の説明は、特にはしません。

ポイント

ラダーで、演算を行うに当たってのポイントは、2つ 

 

箱の大きさ
その中身

 

これらを念頭に、演算式を構築して行けば良かったのですね。

 

復習がてら、それぞれの意味を考えてみましょう。

箱の大きさ

計算を行うには、数値を扱える入れ物 が必要でしたね。

その為に、Dレジスタ 等を用意してくれています。

まずは、レジスタにどの位の数値が入るのかをおさらいしましょう。

 

1ワード 16ビットに格納できる数値は

 

10進数 -32,768~32,767
16進数 0000h~FFFFh

 

2ワード 32ビットの場合は

 

10進数 -2,147,483,648~2,147,483,647
16進数 00000000h~FFFFFFFFh

 

の数値が格納できるのでした。

 

マニュアルにはこのように記載されています。

 

実際に数値を入れ込むとこんな感じ

 

10進数の場合

16進数の場合

 

勿論、2ワード だと更に数値が入るのですが

結局、数値の限界 とは 箱の限界 に他なりません。

 

 

 

閑話

ご覧のように、マイナス表記は2の補数になっています。

2の補数表現

補数自体は、コンピュータの都合になりますので、一般の計算では、特に補数を気にする必要はありません。

符号付き10進数の場合、最上位にビットが立っていたらマイナスだ。位の認識で十分です。

 

他の中身

先程の説明に出てきたのは、bin形式 の 10進定数、16進定数 でした。

頭に とか とかつける、いつもの奴です。

 

他にも計算で使う物としては、BCD と 実数 がありましたね。

 

BCD

0000~9999

 

4ケタの10進数 を格納しています。

普段は、16進定数のフリをしています。

 

 

 

実数定数

2^-126~2^128

 

通常で 2ワード占有 している、浮動小数点データ の事です。

小数点を基点に勝手に計算 してくれるので、計測器などが相手の場合は重宝します。

 

2^128 なんて難しげに書いていますが、
桁数 10の±38乗 って事です。

 

ちなみに、10の±38乗って、この位

-100000000000000000000000000000000000000

100000000000000000000000000000000000000

とにかく、たくさんって事です(笑)

 

同じダブルワードでも bin の10進数表示だと

2,147,483,647 でしたよね。

 

じゃあ、全ての計算を実数でやりゃ良いじゃん!と考えますが

 

精度が出ません

 

そりゃ、同じ箱を使ってやり繰りしてるのですから、こっちを立てたらあっちが立たなくなりますよね。

 

マニュアルを見てみましょう。

 

単精度の場合、このような形で格納されています。

仮数部 に リアルな数値 を格納して、指数部 は 桁数表示 に使用しているという事です。

 

仮数部23ビットを10進数で表すと、有効桁数 は 7ケタ となります。

1.234567 × 100000000000000000000000000000000000000

こういう事ですから、扱える範囲は大きくても精度が悪い のですね。

 

先ほどの、ダブルワード10進と比べると

32bit vs 23bit+桁数

となり、これがそのまま精度の差となるのです。

 

ちなみに、8ケタ目が四捨五入 されます。

 

 

 

それぞれ見てきましたが、
正確に範囲を覚えてね、といった類のものではありません。
忘れたらマニュアルを見れば良いだけです。

 

 

覚えて欲しいのは、たった1点

扱うデータによって、格納形式が違う

これだけです。

 

 

こちらも参照

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

 

乗算除算

四則演算 の説明はしないと書きましたが、
入れ物の把握には 乗除算 を考えると分かり易いので、ついでに動きだけ再確認してみましょう。

 

乗算

掛け算の事ですよね。読み方はジョウザン

 

ヘルプより

 

1ワード × 1ワード = 2ワード

って事ですよね。

 

先程の最大値 32,767 が放り込まれた場合、

32,767 × 32,767 = 1,073,676,289

このようになりますから、答えには 2ワード の用意が必要だよって事ですね。

 

解は 2ワード と言えど、1ワードで収まる解なら [ MOV ] で飛ばして 下位の1ワード だけを使いまわす事も日常茶飯事。

 

 

演算したものを、表示エリアに飛ばしたりとかですね。

 

除算

割り算の事ですよね。読み方はジョザン

 

ヘルプより

 

1ワード ÷ 1ワード = 2ワード

 

乗算と同じく、解は 2ワード なのですが、

商1ワード 余り1ワード に格納されます。

 

最大値 32,767 が放り込まれた場合、

32,767 ÷       1 = 商 32,767 余り 0

1       ÷ 32,767 = 商       0 余り 32,767

このようになりますから、答えは 商と余り 1ワード ずつで良いのですね。

 

0 で割るとエラー になりますから、注意が必要でした。

 

計算をしてみよう

それでは、先程までのおさらいを元に、実際に計算をしてみましょう。

※お使いのシーケンサで、命令語の違いはあるかもしれませんが、適当に読み替えて下さいね。

 

まずは、普通の掛け算です。

 

割って戻してみましょう

 

 

戻らなくなっちゃいました。

 

掛け算の解が、32767 を超えているので、D10 は 2ワード で正しい値を持っているのでしたね。

 

 

ならば、D10 を ダブル で割ってみましょう。

 

 

ぐちゃぐちゃになっちゃいました(笑)

 

ダブルにした事で、被除数 除数 両方をダブルと認識 しますから、

除数が D0+D1 の 2ワードで割った 事になったのですね。

 

 

ならばならば、使用エリアを離してみましょう。

 

 

D0 が戻りませんね

先程使用した D1 にゴミが残っているのですね。

 

 

ならば×3、D0 をダブルに変更しましょう。

デバイスや、タッチパネルからのデータを加工する時に起こり得る状況ですね。

先もって箱の大きさを把握しておくことで、こういう事態に陥らないような工夫も出来るようになるのです。

 

BCDの計算

先程の結果 D12 に対して、BCD の掛け算 をしてみましょう。

 

まずは、データ形式が違う ので、形式合わせが必要です。

 

BCD は、16進定数の仲間ですから、定数の場合は頭に を付ければ良かったのですね。

 

 

D22 の値が凄い事になっていますが、今回は、ぐちゃぐちゃになっている訳ではありません。

表示形式を切り替えます。

 

 

正しく表示されました。

掛け算だったので、解が BCD2ワード となっていたのですね。

 

解はダブルですので、 D22 + D23 

0090 0000 h

このように格納されています。

 

つまり、

D22 から ダブル の視点で見れば、900000h

D23 から シングル の視点で見れば、90h

が格納されているように見える訳です。

 

 

試しに、上位の D23 だけを抜いてみましょう。

 

 

実数の計算

先程抜いた D30 に対して、実数の足し算をしてみましょう。

 

 

データ形式が違う ので、形式合わせが必要でしたね。

BCD から実数変換の命令は無いので、一度 BIN に変換した後 実数 に変換します。

 

 

実数定数は、頭に を付けるのでしたね。

 

計算が終わったら、bin に戻して扱いやすい形にしてあげると良いですね。

 

 

binは少数点を扱わないので、少数点以下は無かった事になっちゃいました。

 

 

中身の形式を把握しておかなければ、予期しない演算結果になるのは想像できるかと思います。

 

演算時のデータミス等を防ぐ為に、コメント等が有効なのですが、ついつい忘れがち。

演算を通す為に四苦八苦して、それどころでは無いのは分かるのですが、例えば、INTBCD などデータ形式だけをコメントに書くだけでも、デバッグや修正が随分変わってきます。

 

まとめ

ラダーでの計算は、全てを想定してコードを書くと、ガチャガチャと面倒くさい事になりがちです。

けれど、箱のサイズと中身さえ把握しておけば、入れて欲しくない数値をタッチパネルで誘導したり、小技を効かせて弾くなんて事も出来ます。

実際、ゴミ避けで DBL に変換など書きませんしね(笑)

 

計算に受け身になるのではなく、シンプルなコードに誘導するにはどこを使うか等を考えると、楽しくなるかもしれませんよ。

 

合わせて読みたい

三菱シーケンサのK4X000(応用命令)の使い方

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