Beckhoff#VAR_GENERIC CONSTANT/__POUNAME/__POSITIONを使ってみよう

今回の記事ではBeckhoff 4026で新たに追加されたVAR_GENERIC CONSTANT・__POUNAME・__POSITIONの機能を説明します。

さ、FAを楽しもう。

前書き

いつも私の技術ブログとYouTubeチャンネルをご覧いただき、心より感謝申し上げます。また、いまFullさん(full@桜 八重 (@fulhause) / X)と共に毎週水曜日の夜にお届けしている「高橋クリス」ラジオ番組を運営しています。

現在、私達の活動はほぼ無償で続けており、より多くのコンテンツを提供するためには、皆様の温かいご支援が大変重要です。もし可能であれば、以下のリンクから応援していただけると大変嬉しく思います。

高橋クリスのメンバーシップ

こちらはFullさん(full@桜 八重 (@fulhause) / X)と共にやっているラジオにメンバーシップを登録いただけます。

https://note.com/fulhause/membership/join

AMAZON ギフトリスト

こちらは自分のブログのコンテンツ制作や設備の充実に大いに役立てさせていただきます。

https://www.amazon.co.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share

Patreon

こちらは自分のブログのコンテンツ制作や設備の充実に対する小さな応援の気持ちのPatreonです。

https://www.patreon.com/user?u=84249391

皆様のサポートが、私たちの活動をより充実させる力となります。

どうぞよろしくお願いします。

メールアドレス(*=@)

soup01threes*gmail.com

X

https://x.com/3threes2

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数を取得できました。

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする