今回の記事ではBeckhoff 4026で新たに追加されたVAR_GENERIC CONSTANT・__POUNAME・__POSITIONの機能を説明します。
さ、FAを楽しもう。
VAR_GENERIC CONSTANT
GENERIC定数は、ファンクション・ブロックのVAR_GENERIC CONSTANT宣言セクションにある変数で、ファンクション・ブロックのインスタンスが宣言されるまで定義されません。
ファンクション・ブロックのインスタンスが宣言されると、定数にはこのインスタンスでのみ有効な特定の値が割り当てられます。 このため、データ型として機能するファンクション・ブロックには、角括弧で囲まれた値(<literal>)が付加されます。
コードの一意性は保証されなくなる。
Statements
こちらはVAR_GENERIC CONSTANTのStatementになります。
FUNCTION_BLOCK <function block name> VAR_GENERIC CONSTANT <generic constant name> : <integer data type> := <initial value>; //Initialwert wird überschrieben END_VAR PROGRAM MAIN VAR <fb instance name> : <function block name> < <literal> >; <fb instance name> : <function block name> <( <expression> )>; END_VAR |
用途
VAR_GENERIC CONSTANTを活用することにより、パラメータ化可能な配列変数を持つ汎用ファンクションブロックを作成することができます。このような構成は、汎用的なライブラリ機能ブロックを実装したいライブラリプログラマーに役に立ちます。
Example
次のコードは、任意の長さの配列を処理できる関数ブロックを定義する方法の例です。 ファンクションブロックのインスタンスごとに配列の長さは異なりますが、オブジェクトのライフタイム中は一定であるという意味です。
FUNCTION_BLOCK FB1 VAR_GENERIC CONSTANT nMaxLen:INT:=10; END_VAR VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR _arr:ARRAY[0..nMaxLen-1]OF INT; END_VAR PROGRAM OB111 VAR myFB1:FB1<100>; myFB2:FB1<(2*30)>; myFB3:ARRAY[0..99]OF FB1<21>; END_VAR VAR arrInt:ARRAY[0..9]OF UDINT; END_VAR |
このように各FB1のInstanceの_arr配列の長さは可変になりました。
Result
Done!下図のように各FB1のInstanceにも異なる長さの_arr配列が定義されました。
__POUNAME
__POUNAMEはIEC 61131-1規格の拡張版であり、、実行時に__POUNAME演算子を含むプログラム(POU)の名前を返します。 これを行うには、宣言部または実装部でSTRING型の変数に演算子を代入する必要があります。
また、__POUNAMEの結果は、それぞれ使われる場所によって異なります。
- プログラム内:プログラム名を返します
- Function内:Function名を返します
- ファンクションブロック内:ファンクションブロック名を返します
- メソッド内:メソッド名、ファンクションブロック名を返します
- プロパティ内の Get/Set アクセサの内部: プロパティ名、ファンクション・ブロック名を返します
- GVL内:GVLの名前を返します
- 構造体内:構造体名を返します
- UNION:UNIONの名前を返します
Example
こちらは実際__POUNAME を使用したプログラム例になります。
PROGRAM OB1 VAR myPOUName:STRING; myPOUName_Init:STRING:=__POUNAME(); END_VAR myPOUName:=__POUNAME(); |
また、そのプログラムはOB1というPOUで呼ばれています。
Result
Done!OB1という文字列が取得しました。
__POSITION
__POSITIONはIEC 61131-1規格の拡張版であり、実行時にプログラミング・ブロックの宣言部または実装部における変数の位置を返します。 これを行うには、、__POSITION演算子は宣言部または実装部でSTRING型の変数に代入する必要があります。
Example
こちらは実際__POSITION を使用したプログラム例になります。
PROGRAM OB110 VAR str2:STRING:=__POSITION(); str3:STRING:=__POSITION(); str4:STRING:=__POSITION(); str5:STRING:=__POSITION(); END_VAR VAR str1:ARRAY[0..9]OF STRING; END_VAR str1[0]:=__POSITION(); str1[1]:=__POSITION(); str1[2]:=__POSITION(); str1[3]:=__POSITION(); str1[4]:=__POSITION(); |
Result
Done!__POSITIONを使用する度に、該当するプログラムのLine数を取得できました。