TwinCATはVAR_INST宣言を使ったことありますか?VAR_INST内の変数はVARと同じですがFunction BlockのStack内だけに格納されます。つまり、VAR_INSTはFunction BlockのVAR変数と同じく使用できるし、Method Callされるたびに初期化しなくても済みます。
注意するのはVAR_INSTはMethod内だけ宣言とアクセスできます。
これはVAR_INSTの宣言方法です。先に書きましたがVAR_INSTは一般的なInstance内の変数と違います。その変数はFunction BlockのStack内で格納しMethodから定義するんです。
では、このVAR_INSTはどう使うでしょうか。たとえば、Method内のPulse検知Function Block P_TRIGやIEC_TIMER TONなどを定義するとしよう。本来はFunction BlockのVAR内で定義する必要があり、でも実際その P_TRIGやIEC_TIMERが使われているのはMETHOD内だけなので、わざわざ該当する変数をFunction BlockのGlobalに宣言しなくてもよいでしょう。
変数のScopesをできれば小さくしましょう。そうすることによりコードのメンテナンスもよくなります。
VAR_INST Variable : Type; END_VAR |
Example
では、実際Exampleを作成してみましょう。
POUs>Add>POUします。
Function Blockに名前を入れ、Openします。
次はMethodを追加します。
Add>Methodします。
Methodの名前を決め、Openします。
最初はVAR内で_iCounterという変数を追加し、bAddがTrueになるとずっと足す1のようなプログラムです。
次はMainのプログラムでMethodを呼び出します。
ですが、Methodから出力された変数はずっと1ですね。
それはMethodのVAR変数がサイクル完了したら変数値がリセットされたからです。
次はVAR_INSTを定義したMethodを作成しましょう。
やってることはVAR_INST内で同じのINT変数を定義し、Methodが呼び出すされるたびに足す1します。
では実際そのMethodもCallしてみましょう。
VAR_INSTが宣言されたMethodが、その結果はずっと加算されています。
それはVAR_INST内の変数がStack内でずっと保存されてるからです。
Sample Code
以下のLinkからSample Codeをダウンロードしてください。
TwinCAT3/TwinCAT Project_Example_VAR_INST.tnzip at main · soup01Threes/TwinCAT3 (github.com)