三菱シーケンサの Z(インデックスレジスタ)の使い方

シーケンサ

三菱シーケンサの Z(インデックスレジスタ)の使い方

 

大きなファイル操作も何のその
具体的な動きをみながら、一緒にインデックスレジスタへの理解を深めてみましょう

 

どうも! ずぶ です。今回は 三菱シーケンサのZ(インデックスレジスタ)の使い方

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

Zの扱い方を確認しよう

まずは、見て下さい

 

と を使った回路ですが、モニタ数値から同じである事が分かりますね。
(正確にはオカシイ回路です)

 

結果は同じでも、やってる事は決定的に違います。

CPU になったつもりで、コメントを書くと、こんな感じです

 

ご覧のように、の箇所にはアドレスの指定は一切出てきません

出てきませんが、

 

の正体は、適当なアドレスに放り込んで、その番地を覚えている、16ビットの箱 

概念はこうですが、難しく考える必要はありません。

 

 

を回路上で扱う場合、ただの数値 として考えると楽ちんです。

 

 

どうしても気になるまでは、こんなもんだ位で良いでしょう。(笑)

 

アドレス指定として使う

は色々な 内部デバイスと引っ付く ことができちゃいます
結果的に、アドレス指定の立役者として立ち回る事になります。

具体的には、このような感じで使います。

 

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足しなさい ですよね

 

等の狙い箇所に放り込む時は、この様にすると迷いません。

最初から16進数!

混乱しなくて良いですね。

 

 

どれだけ使えるの?

Qシリーズだと、使えるZはZ0~Z19までの20個 しかありません。

 

こんな少ない個数で、何ができるんでしょう?

答えは、『使いまわす』です

実際に、使いまわした動きを見てみましょう。

 

 

モニター数値から、どちらも Z1を経由 しているのに関わらず、
D0に10、D1に11 が格納されている事が分かりますね。

 

同じくモニターの Z1の数値 から、スキャンの最後は11で確定 されている事が分かります。

 

Zは、データレジスタのように、数値を格納していて、欲しい時に取り出して使う。
という使い方はしません。

なので、Zを使う時は必ず、使用したすぐ下で確定させる ようなコードを書きます。
(Dレジスタのような使用は可能ですが、使いまわされた時点で何が入ってくるか分からない状態になり、バグを生み出す元となります)

 

それでは、実際に を使用するプログラムを作ってみましょう

例)レシピの処理番号と名前を一覧表に表したい

(処理番号は1ワード、名前は2ワード、レシピ条件は7ワード)

 

データリストを表します

 

繰り返し処理なので、使うのは FOR~NEXT命令 ですね。

一覧表には条件は不要なので、番号と名前を抜き出して転送したい のですが、レシピ本体と、表示抜き出しのアドレス倍率が違うので、少し考えなくてはなりません。

そういう時は、いくつかの を組み合わせます

 

※間違いがありました。
[ MOV D1000Z2 D0Z3 ] ではなく [ BMOV D1000Z2 D0Z3 K3 ] が正しいです。

メインカウンターのZ1を使ってZ2とZ3を作り出しています。
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(ファイルレジスタ)の開放の仕方は↓

三菱シーケンサのレジスタの違いについて

まとめ

 

習うより慣れた方が良いデバイスです。
いろんな物を放り込んで、色んなデバイスにくっつけて

使い方をマスターすれば、強力な力になってくれますよ。

毛嫌いしたり、苦手意識を持つこともありません。ドシドシ使って行きましょう!
通らなければ、プログラム作成中にエラーになるだけです(笑)

 

 

合わせて読みたい

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

サブルーチンとCALL命令の使い方