プログラムの見通しを良くするのに、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 プログラム内の P1 は CALL されませんでした。
各々のプログラムファイル内で ローカルポインタとして存在 しているので、ポインタ番号が重なっていても関係がないのですね。
他プログラムのポインタは見えていない。
これが、ローカルポインタの概念 です。
なら、全て 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命令の使い方
シーケンサプログラムのスキャン順序
最近のコメント