プログラマーには、馴染みの言葉かもしれませんが、
シーケンサ屋にとっては、ちょっと取っつき難い
そんな インスタンス を、普段使いのラダープログラムからの視点で一緒に理解を深めてみましょう。
どうも!ズブです。今回は シーケンサでのインスタンスについて
インスタンスとは
要約すると
「数値を、与えるだけで動くプログラムを作ろうぜ!」って事です。
そんなの一言も書いていないですけど(笑)
インスタンス とは、プログラムを使いまわす時に必要な『 認識 』って事ですね。
![](https://zubu.jp/wp-content/uploads/2020/12/インスタンスイメージ1.png)
この図は何も、コピー&貼り付けして プログラム を作って行くという事ではありません。
どちらかというと、僕たちが普段使っている サブルーチンそのもの 。
けれど普段は、二重起動に気を付けてサブルーチンを書いているでしょうから、インスタンスからは遠くなっているケースが多い。
時間経過を伴うようなコードの場合、インスタンス化し易い傾向がありますので、今回はそのようなコードを作成して一緒に考えてみましょう。
ラダープログラム
ちょっとイケてるコードが書けました。(笑)
特に内容は無いようなので、コメントは飛ばします。
![](https://zubu.jp/wp-content/uploads/2020/12/プログラム2-1.png)
引数でセット する、自在クロック です。
これに手を加えて、使い回せるようにしてみましょう。
合わせて読みたい
サブルーチンとCALL命令の使い方
シーケンサのCALL命令の種類と違い
変数化させよう
先程のプログラムを、使いまわせるように加工していきます。
実デバイスが使われていると使い回せない ので、変数化させる必要があるのですね。
![](https://zubu.jp/wp-content/uploads/2020/12/プログラム3.png)
![](https://zubu.jp/wp-content/uploads/2020/12/プログラム4.png)
これで下ごしらえは完了!
ここで一旦、〔 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 に代入している数値をスライドさせて量産 して行くだけです。
![](https://zubu.jp/wp-content/uploads/2020/12/プログラム5.png)
で?インスタンスって?
さて、やっと本題ですが、すでに終了 です。
このプログラムの
コピー元 は、P1であり
コピー先 は、〔 CALL 〕である事がわかると思います。
ちょっと違うけど(笑)
上のプログラムを走らせたら
( T1 K16 )
( T2 K56 )
( T3 K105 )
これらが現れます。
書いてはないけれど、Z0 に K20 とかを代入すると
( T20 K〇〇 )
こういうのも現れてくるでしょう。
CALLされる事で初めて、サブルーチン 内の コード と同一で、使用デバイスの違うものが姿を現わす。
この 認識 こそが、インスタンス です。
最初の図の通りでしょ?
これらを、関連コメントに当てはめて行くと
オブジェクト は P1
インスタンス は 〔 CALL 〕
更に言えば
インスタンス名 は Z0 に代入している数値
プロパティ は CALL 時の引数
に該当します。
ただ、このままのコードだと T0,T1,T2 は姿を現していないだけでCALLされた瞬間、必ず使用するデバイスという事になってしまいますので、何とかしたいですね。
まとめ
せっかく作ったプログラムを無駄にしない為にも、構造化は視野に入れておきたい。
しかし、ラダーだけをやって来た人は、難しげな横文字だけでやられてしまう人が多いのも現実。
けれど、
自分達がやってきた事と、そう大差ないよって事を感じて欲しかったのでまとめました。
厳密な意味でのインスタンスではないかもしれませんが、今後の予備知識としては十分だと思います。
使用するデバイスを、重ならない場所に自動で当てはめてくれるのが ラベル であり
それらを使用して、パッケージングしたものが FB(ファンクションブロック)となるのです。
合わせて読みたい
シーケンサでのラベル使用1
最近のコメント