シーケンサのCALL命令の種類と違いについて

シーケンサ

プログラムの見通しを良くするのに、CALL命令は有効な選択肢
けれど、キチンと使いこなすには、命令の特徴を捉えておく必要があります。

プログラムや説明を元に、使い方を一緒に見て行きましょう。
どうも!ずぶです。今回は シーケンサのCALL命令の種類と違いについて

 

一般的な使用は、こちらをご覧ください↓
サブルーチンとCALL命令の使い方

 

CALL の種類を確認しよう

同じ CALL でも、似たようなものが幾つかあります

CALL
ECALL
FCALL
FECALL
XCALL

この違いって何でしたっけね?

1つずつ確認して行きましょう。

 

CALL

同じファイル 内にある、ポインタP1 を CALL します。

異なるファイル 内のP1を指定した場合、エラー となります。

 

 

ECALL

違うファイル 内にある、ポインタP1を CALL します。

同じファイル 内のP1を指定した場合、エラー となります。

 

 

頭に 『 E 』 を付ける事により、他ファイルを指定する命令に変わる のですね。

 

FCALL

サブルーチンの 非実行処理 を行います。

 

……。

何のこっちゃですね。

 

FCALL を理解する為には、CALL 命令の再認識が必要みたいです。

条件分けした、プログラムを見てみましょう。

 

CALL命令の条件が通っているケース

P1内条件ON

 

P1内条件OFF

 

まぁ、そうですよね。

毎スキャンCALLされて、常に実行されている状態です。

CALL命令の条件が途中で切れたケース

 

CALL命令どころか、P1 内条件も OFF なのに、M1 ON していますね。

 

これは、サブルーチン内での 最後の出力状態が保持 されている事を意味します。

 

条件が通っているのケースのように、常時判定されている場合は良いのですが、パルス等で突入させた場合は、切れたケースのようになるのですね。

 

 

このような動きをして欲しくない場合、[ FCALL ] の出番です。

 

 

FCALL が実行された場合は、条件に関係なく ポインタ内の 出力は オフ します。

 

 

取説には『実行処理がOFFすると、非実行処理が行われます』とあります。

 

という事は、条件オフの時に命令実行という動きになりますので、

実際のプログラムは 

このように記述すると、CALL じゃない時は FCALL という動きになります。

 

頭に『 F 』を付ける事により、非実行処理命令 になるのですね。

XCALL

サブルーチンプログラムの 実行、非実行 を行います。

 

先ほど [ CALL ] と [ FCALL ] を引っ付けましたが、あれが 1つの命令 で済むようになったものです。

 

テストでタイミングを取るのにSM414を使用していますが、ご存知2n秒クロックです。
SD414に数値を入れると、入れた数値の2倍 のクロックタイマになるのでしたね。
ここでは、10秒タイマ(5秒毎にON/OFFが切り替わる)として使用しています。

 

使用直前で呼び出して、判定するようなサブルーチンだと問題ありませんが、
条件ONの間、動作させるようなサブルーチンだと出力に気を使わなければなりません。

そんな時、FCALL や XCALL の出番なのですね。

 

↓ XCALL実用例を取り上げています
シーケンサでのインスタンスについて

 

ローカルポインタとグローバルポインタ

ポインタには、

ローカルポインタ
グローバルポインタ

があるのでした。

 

特徴として

ローカルは、記述されているプログラムファイル内 だけで
グローバルは、全てのプログラムファイルを横断 して使用できます。

 

では、それぞれの動きを見て行きましょう。

 

ローカルポインタ

確認の為、2つのプログラムファイルに 同じポインタ番号 を使用してみます。

 

<MAIN1>

<MAIN2>

それぞれのファイル内の P1 を CALL しています。

 

MAIN1、MAIN2 の突入条件は分けています。
(赤囲みのB1とB2の箇所です。)

 

では、視認用のコードをぶら下げて、B0 を実行!

 

 

B0 を叩いて、返って来たのは M1 だけです。

 

MAIN1 プログラム内で P1 を CALL しても、

MAIN2 プログラム内の P1CALL されませんでした。

 

 

各々のプログラムファイル内で ローカルポインタとして存在 しているので、ポインタ番号が重なっていても関係がないのですね。

 

他プログラムのポインタは見えていない。
これが、ローカルポインタの概念 です。

 

なら、全て P0 から始めれば良いじゃん
と、なりますが

同名ポインタを使用した場合、コメントの問題が出てきます。

ローカルとはいえ、P1にコメントを付けた場合、他のプログラムの同名P1にもコメントが反映されますので、命名には工夫が必要となってきます。

 

プログラムを小分けにして、見やすいラダー図にしてみよう

 

グローバルポインタ

ローカル と違い グローバル は、他のプログラムから見えているポインタです。

とはいえ、

ローカル だと他プログラムから CALL できないか?といわれると、
先ほど見た [ ECALL ] を使用すれば良いのは分かっています。

 

じゃあ別にといった感じですが、グローバルポインタ を使用すると、CALLの 記述方法が楽 になるのです。

 

グローバルポインタの使い方を見て行きましょう。

まずは、設定

設定の仕方は、PCパラメータ の 共通パラメータ からでしたね。

 

これで、P100以降 が グローバルポインタ となりました。

(ポインタ数は、Qシリーズで4096個です。この設定だと P100~4095 がグローバルポインタとなった訳です)

 

では、プログラム

<MAIN1>

 

<MAIN2>

 

他プログラムファイルのポインタを[ CALL ]で指定したのに エラー を出さずに使用できました。

 

待機プログラム

再度MAIN2を見て下さい。

 

MAIN2 は スキャンプログラム に入れているので、これ以降のスキャンをしないように[ FEND ]が必要なのでした。

 

スキャンをするから、[ FEND ]が必要なのであって、

スキャンに関係ない 待機プログラム なら [ FEND ] は不要かもしれません。

 

さっそく MAIN2 を 待機プログラム にしてみましょう。

 

入れ方はこう

 

MAIN2 が 待機プログラム になりました。

でもって、頭に記述していた [ FEND ] を外します。

 

[ FEND ] も要らず、通常CALLで 待機プログラム 内のポインタが呼べるようになりました。

 

スタメン級のサブルーチンは、待機プログラム内にズラズラ並べて、通常CALLで呼び出せば、プログラムの見通しが良くなりますね。

 

注意点

グローバルポインタを使用する際、気を付けなければならないのは、ローカルポインタの合計よりも老番に設定 しなければならない事です。

 

「少ししか、ローカルポインタは使ってないから大丈夫!」

と言っているあなた

 

本当に?

 

取説を参照

 

P199 なんてポインタを1個だけ使用したとしても、ポインタ使用数は200個になるって事ですからね。

でも、4096個もあるから、多少無茶苦茶しても大丈夫そうです(笑)

まとめ

サブルーチン内 の出力状態は保持されているよ

FCALL はサブルーチン内の 出力をオフ する為のものだよ

ポインタには、ローカル と グローバル があるよ

ポインタの数は、Qシリーズで4096だよ

 

合わせて読みたい
サブルーチンとCALL命令の使い方
シーケンサプログラムのスキャン順序