シーケンサでのインスタンスについて

FA

プログラマーには、馴染みの言葉かもしれませんが、
シーケンサ屋にとっては、ちょっと取っつき難い

そんな インスタンス を、普段使いのラダープログラムからの視点で一緒に理解を深めてみましょう。

 

どうも!ズブです。今回は シーケンサでのインスタンスについて

インスタンスとは

インスタンスとは IT用語辞典e-Words

 

要約すると

 

「数値を、与えるだけで動くプログラムを作ろうぜ!」って事です。

そんなの一言も書いていないですけど(笑)

 

インスタンス とは、プログラムを使いまわす時に必要な『 認識 』って事ですね。

 

 

この図は何も、コピー&貼り付けして プログラム を作って行くという事ではありません。
どちらかというと、僕たちが普段使っている サブルーチンそのもの 

けれど普段は、二重起動に気を付けてサブルーチンを書いているでしょうから、インスタンスからは遠くなっているケースが多い。

 

時間経過を伴うようなコードの場合、インスタンス化し易い傾向がありますので、今回はそのようなコードを作成して一緒に考えてみましょう。

ラダープログラム

ちょっとイケてるコードが書けました。(笑)

特に内容は無いようなので、コメントは飛ばします。

 

 

引数でセット する、自在クロック です。

これに手を加えて、使い回せるようにしてみましょう。

XCALL を使用しているのは、サブルーチン内をリセット させる為です。

合わせて読みたい
サブルーチンとCALL命令の使い方
シーケンサのCALL命令の種類と違い

 

変数化させよう

先程のプログラムを、使いまわせるように加工していきます。

実デバイスが使われていると使い回せない ので、変数化させる必要があるのですね。

 

 

これで下ごしらえは完了!

ここで一旦、〔 CALL 〕命令の引数 について復習しておきましょう。

 

CALL 命令の引数について

CALL命令

CALL命令は、引数を5個まで使用 できるのでした。(FX系などは使えない)

 

〔 CALL  S1 S2 S3 S4 S5 〕

 

引数 5個まで なら、サブルーチンに持って行けるよ って意味ですね。

サブルーチン

CALLで持ってきた 引数 は、サブルーチン内では ファンクションデバイスに割り振りなおして 使用します。

 

ファンクションデバイス とは、

入力ビットとして使う なら、 FX 
出力ビットとして使う なら、 FY
ワード なら、        FD

このように、用途によって決まっている、サブルーチン内だけで使えるデバイス です。
いつも使ってるデバイスに、ファンクションの F を引っ付けただけですね。

 

例えば、

〔 CALL P1 X0 Y10 〕この場合、サブルーチン内では

X0  = FX0
Y10 = FY1

 

〔 CALL P1 D20 D30  D40 D50 D60〕の場合

D20 = FD0
D30 = FD1
D40 = FD2
D50 = FD3
D60 = FD4

 

〔 CALL  P1 M0 〕の場合

M0を サブルーチンへの入力に使うなら
M0  = FX0

M0を サブルーチンからの出力に使うなら
M0 = FY0

 

 

決まっているのは、第一引数からの、0、1、2 ~という 番号 だけ。

それを サブルーチン内で使いたい役割( FX とか FD )に割り付けるイメージですね。

 

 

先ほどのプログラムは タイマ(T) が降ろせなかった(ファンクションブロックに無い)ので、
Z0 に受けて降ろしていた のでした。

 

合わせて読みたい
シーケンサのZ(インデックスレジスタ)の使い方

再度プログラムに戻ります

後は、Z0 に代入している数値をスライドさせて量産 して行くだけです。

 

 

で?インスタンスって?

さて、やっと本題ですが、すでに終了 です。

 

このプログラムの

コピー元 は、P1であり
コピー先 は、〔 CALL 〕である事がわかると思います。

ちょっと違うけど(笑)

 

上のプログラムを走らせたら

( T1 K16 )
( T2 K56 )
( T3 K105 )

これらが現れます。

 

書いてはないけれど、Z0 K20 とかを代入すると

( T20 K〇〇 )

こういうのも現れてくるでしょう。

 

 

CALLされる事で初めて、サブルーチン 内の コード と同一で、使用デバイスの違うものが姿を現わす。

この 認識 こそが、インスタンス です。

最初の図の通りでしょ?

 

 

これらを、関連コメントに当てはめて行くと

オブジェクト は P1
インスタンス は 〔 CALL 〕

更に言えば

インスタンス名 は Z0 に代入している数値
プロパティ   は CALL 時の引数

に該当します。

 

ただ、このままのコードだと T0,T1,T2 は姿を現していないだけでCALLされた瞬間、必ず使用するデバイスという事になってしまいますので、何とかしたいですね。

 

まとめ

せっかく作ったプログラムを無駄にしない為にも、構造化は視野に入れておきたい。
しかし、ラダーだけをやって来た人は、難しげな横文字だけでやられてしまう人が多いのも現実。

けれど、

自分達がやってきた事と、そう大差ないよって事を感じて欲しかったのでまとめました。

厳密な意味でのインスタンスではないかもしれませんが、今後の予備知識としては十分だと思います。

 

使用するデバイスを、重ならない場所に自動で当てはめてくれるのが ラベル であり
それらを使用して、パッケージングしたものが FB(ファンクションブロック)となるのです。

 

合わせて読みたい
シーケンサでのラベル使用1