三菱シーケンサの Z(インデックスレジスタ)の使い方
大きなファイル操作も何のその
具体的な動きをみながら、一緒にインデックスレジスタへの理解を深めてみましょう
どうも! ずぶ です。今回は 三菱シーケンサのZ(インデックスレジスタ)の使い方
※GX simulator2を使用しています
シーケンサでシミュレータの使い方
Zの扱い方を確認しよう
まずは、見て下さい
D と Z を使った回路ですが、モニタ数値から同じである事が分かりますね。
(正確にはオカシイ回路です)
結果は同じでも、やってる事は決定的に違います。
CPU になったつもりで、コメントを書くと、こんな感じです
ご覧のように、Z の箇所にはアドレスの指定は一切出てきません
出てきませんが、
Z の正体は、適当なアドレスに放り込んで、その番地を覚えている、16ビットの箱
概念はこうですが、難しく考える必要はありません。
Zを回路上で扱う場合、ただの数値 として考えると楽ちんです。
どうしても気になるまでは、こんなもんだ位で良いでしょう。(笑)
アドレス指定として使う
Zは色々な 内部デバイスと引っ付く ことができちゃいます。
結果的に、アドレス指定の立役者として立ち回る事になります。
具体的には、このような感じで使います。
Dレジスタ に引っ付いていますね。
この場合 K123 は、どこに飛んで行ってしまったのでしょう?
順を追って、一緒に考えてみましょう
D0Z1 という記述ですが
D(0+Z1)という意味になります。
先ほど、Zは数値 と書いたので、代入します
D(0+200)
よって、上の応用命令は
〔 MOV K123 D200 〕
という、いつもの命令となります。
123をD200に格納しなさい の意味ですね。
それでは、確認します
ここに入っていました
では、D205 に数値を入れたい場合 はどうしましょう?
先の説明にあてはめて、D(5+200)の形にすれば良いですね。
D5Z1
これで、D205 を指定している事となります。
もちろん、
Z1 に 205 を代入しておいて
D0Z1 と記述しても同じです。
D(0+205)= D205 ですからね
けれども、後に出てきますが
Zは可変させてナンボ ですから、可変したZに対して幾つ っていうプログラムを組むよう心がけます
気を付けるべきポイント
同じように、
W0Z1 と記述してみた場合はどうなるでしょうか。
言うまでもありませんよね。
W(0+200)= W200 に決まってるじゃないですか。
本当に?
では、確認してみましょう。
む?いない!
ちょっと考えてみましょう。
Wは16進表記 でしたよね。
10進数の200は、16進数の C8です。
確認してみます。
いたいた~!
引っ掛かりませんでしたか?(笑)
W(0+200)というのは、W0から200足しなさい ですよね
W 等の狙い箇所に放り込む時は、この様にすると迷いません。
最初から16進数!
混乱しなくて良いですね。
どれだけ使えるの?
Qシリーズだと、使えるZはZ0~Z19までの20個 しかありません。
こんな少ない個数で、何ができるんでしょう?
答えは、『使いまわす』です
実際に、使いまわした動きを見てみましょう。
モニター数値から、どちらも Z1を経由 しているのに関わらず、
D0に10、D1に11 が格納されている事が分かりますね。
同じくモニターの Z1の数値 から、スキャンの最後は11で確定 されている事が分かります。
Zは、データレジスタのように、数値を格納していて、欲しい時に取り出して使う。
という使い方はしません。
なので、Zを使う時は必ず、使用したすぐ下で確定させる ようなコードを書きます。
(Dレジスタのような使用は可能ですが、使いまわされた時点で何が入ってくるか分からない状態になり、バグを生み出す元となります)
それでは、実際に Z を使用するプログラムを作ってみましょう
例)レシピの処理番号と名前を一覧表に表したい
(処理番号は1ワード、名前は2ワード、レシピ条件は7ワード)
データリストを表します
繰り返し処理なので、使うのは FOR~NEXT命令 ですね。
一覧表には条件は不要なので、番号と名前を抜き出して転送したい のですが、レシピ本体と、表示抜き出しのアドレス倍率が違うので、少し考えなくてはなりません。
そういう時は、いくつかの Z を組み合わせます
※間違いがありました。
[ MOV D1000Z2 D0Z3 ] ではなく [ BMOV D1000Z2 D0Z3 K3 ] が正しいです。
Z1に対して、Z2は10の倍数、Z3は3の倍数で動いていきます。
こんな回路がメインにあると邪魔でしょうがないので、サブルーチンに放り込んでおくと良いですね。
あわせて読みたい
こんな使い方もあるよ
例えば、DMに 状態変数 を放り込んで、歩進していくような回路を考えたとします。
D200の中身が
2なら、Aの条件
132なら、Bの条件
といった具合です。
条件式だけで散らすと、プログラムが重くなりますから、フラグをビット化 したい場合
こんな感じでしょうか?
ページの都合上2つの条件ですが、フラグ個数が 100個 とか 1000個 あると、もう大変です。
こういう時も Z を使うと便利です。
ほら、たった2行!
本当に動いているのか、確かめます
ね、ご覧の通り
モニター値で D200 に 123 が入っていて、対応する M123 のビットが立ちました
本当に数値として振る舞っているでしょう?
Zを大きくしたい
Z は 16ビット と書きました
という事は、数値で 32000 ちょろしか、入らないという事ですね
ですが、最初の『計算仮置き場』のような使い方の場合は、普通に使えます
Zはもらった数字が入るようなアドレスを探して、放り込んでくるのが仕事ですからね
DMOV で D0には大きな数字 が入ってきてますね。
けれど、アドレス指定に使う場合、代替する命令がありません。
ファイル操作 というのは大きなものを扱う事が多く、30000程度では全く届かない事も多いのです。
そんな時は、大きな「 Z 」すなわち 「 ZZ 」 を使っちゃいましょう。
(僕たち世代は、ZとかZZって言葉だけでザワついてしまいます)
やり方は簡単
設定をするだけで、インデックス修飾 のサイズが 32ビットで使用 できるようになるのです。
↓ココ
Zを使用 □に、例えば 16 を入れたなら、Z16、Z18が 32ビットインデックス修飾 として振舞います。
ZZを使用 ZZと記述するだけで、32ビットインデックス修飾 として振舞います。
あくまでも ファイルレジスタZR(R)を使用する際のへのインデックス修飾 ですよ。
さっそく、ぶっ込んでみます。
Rレジスタは解放済みです。
はたして、ZR1000000 番地に数値は入っているのでしょうか?
無事、ぶっ込む事ができました!
R(ファイルレジスタ)の開放の仕方は↓
まとめ
習うより慣れた方が良いデバイスです。
いろんな物を放り込んで、色んなデバイスにくっつけて
使い方をマスターすれば、強力な力になってくれますよ。
毛嫌いしたり、苦手意識を持つこともありません。ドシドシ使って行きましょう!
通らなければ、プログラム作成中にエラーになるだけです(笑)
合わせて読みたい
最近のコメント