変数: VAR_GENERIC CONSTANT
一般的な定数変数
概要
ザ・ VAR_GENERIC エクステンションは次のものをサポートします。 コンパイル時の一般定数 ファンクションブロック内。これにより、さまざまな構成 (バッファサイズや固定範囲など) に適応できる、柔軟で再利用可能なファンクションブロックを作成できます なし 動的メモリ割り当てに依存しています。
この機能は、配列やその他のメモリ構造を管理する関数ブロックに特に役立ちます。さらに、タイプセーフでコンパイル時に完全に解決される、パフォーマンスを最適化した設計が可能になります
ジェネリック定数は、内の変数です VAR_GENERIC CONSTANT ファンクションブロックのスコープ。変数はファンクションブロックインスタンスが宣言されたときにのみ定義されます。
ジェネリック定数はメソッドで使用できます。これは、次のような場合に特に役立ちます。VAR_IN_OUT または VAR_IN_OUT CONSTANT スコープ。
型宣言の構文
デクラレーション
ジェネリック定数を含むファンクションブロックの型宣言の構文
FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
<generic constant name> : <integer data type> := <initial value> ; //Initial value will be overwritten
END_VAR
| ファンクションブロックの名前 |
| ジェネリック定数のスコープ で任意の数のジェネリック定数を宣言できます |
| ジェネリック定数の変数名 |
| ジェネリック定数をタイプするコンストラクト。 整数データ型または整数データ型のサブスコープを使用できます。 例:
|
| [オプション] [初期化] 重要初期値はコンパイルチェックにのみ必要です。実行時に、値は上書きされます |
例:
FUNCTION BLOCK FB
VAR_GENERIC CONSTANT
size : INT;
END_VAR
VAR
buffer : ARRAY[0..size] OF BYTE;
END_VARインスタンス化
ジェネリック定数を含む関数ブロックは、式として明示的に渡すか、リテラルを使用して暗黙的に渡すパラメータを介してインスタンス化できます。
以下が適用されます。
パラメータの受け渡しに影響する部分
VAR_GENERIC CONSTANTスコープは山括弧で囲まれています。ジェネリック関数ブロックは、次のパラメータを使用してインスタンス化する必要があります。 すべて 汎用変数。パラメーターの受け渡しは完了していなければなりません。部分的な指定は許可されず、エラーになります。
すべてのパラメーターを明示的に指定するか、すべてを暗黙的に指定します。明示的な指定と暗黙的な指定を混在させることはできません
暗黙
複数のジェネリック変数にパラメータを渡す場合、必要な値をリテラルとしてまとめ、宣言されている順序でカンマで区切る必要があります。
VAR_GENERIC CONSTANTスコープ。<5,10>
名前で明示
複数のジェネリック変数にパラメーターを渡す場合、必要なすべてのパラメーターを括弧で囲んだ式としてカンマで区切る必要があります。 無料 注文。通常どおり、式は括弧で囲まれます
式は、代入演算子を使用して、指定されたジェネリック定数にリテラル、変数、または式を割り当てます。
:=。この明示的なパラメータ転送は括弧で囲むことが重要です<(Array2Size := 10), (Array1Size := 5)>
利点は、パラメータの転送が読みやすく、変更後も追跡可能で保守が容易であることです。
さらに多くの変数が宣言されている場合は、追加のパラメータをそれらに渡す必要があります。代入演算子を使用する
:=、これらはまとめて括弧で囲まれています。
ファンクションブロック FB ジェネリック定数付き
FUNCTION_BLOCK FB
VAR_GENERIC CONSTANT
Array1Size : INT := 0;
Array2Size : INT := 0;
END_VAR
VAR_INPUT
MyArray1 : ARRAY[0..Array1Size-1] OF REAL;
MyArray2 : ARRAY[0..Array2Size-1] OF REAL;
END_VAR
VAR
SomeOtherParameter : INT;
END_VARファンクションブロックのインスタンス化 FB パラメータを渡すだけです。
PROGRAM PLC_PRG
VAR
MyFB1 : FB<5,10> := (SomeOtherParameter:=20);
END_VAR
VAR
liArray1Size: LINT;
END_VARliArray1Size := UPPER_BOUND(MyFB1.MyArray1,1) + 1;
パラメータを明示的に渡す関数ブロックインスタンス myFB2
PROGRAM PLC_PRG
VAR
MyFB1 : FB<5,10> := (SomeOtherParameter:=20);
MyFB2 : FB<(Array2Size:=10), (Array1Size:=5)> := (SomeOtherParameter := 10);
END_VAR
VAR
Array1Size, Array2Size : LINT;
END_VARArray1Size := UPPER_BOUND(MyFB1.MyArray1,1) + 1; Array2Size := UPPER_BOUND(MyFB1.MyArray2,1) + 1;
ジェネリック定数による継承
ジェネリック定数は、継承によって基本関数ブロックに渡すこともできます。
ファンクションブロックでの定数の使用
この定数は、他の定数と同様に関数ブロックで使用できます (たとえば、配列や文字列宣言など)。関数ブロックのメソッド、プロパティ、またはアクションでは使用できますが、外部からアクセスすることはできません。つまり、プライベート変数のように振る舞うということです。
プリコンパイルチェック
汎用定数の最終値は関数ブロックでは使用できないため、コンパイル前のチェックは限られています。初期化値は次のように定義できます
FUNCTION_BLOCK FB
VAR_GENERIC CONSTANT
size : INT := 1;
END_VAR
VAR
buffer : ARRAY[0..size] OF BYTE;
END_VARこの初期化値 (例では値 1) は、関数ブロック内のプリコンパイルチェックに使用されますが、それ以外の効果はありません。
例
FUNCTION_BLOCK FB_Pou
VAR_GENERIC CONSTANT
lnstring : DINT := 10;
numstring : DINT := 100;
END_VAR
VAR
arraystring : ARRAY[0..numstring-1] OF STRING(lnstring);
END_VARPROGRAM PLC_PRG
VAR
fbPou : FB_Pou<100, 1000>;
END_VARサブ範囲タイプをジェネリックパラメーターとして使用して、コンパイラーがチェックする値の許容範囲を指定できます。
FUNCTION_BLOCK FB_SrString
VAR_GENERIC CONSTANT
maxlen2 : INT(5..10) := 5; //subrange data type
END_VAR
VAR
arrTest : ARRAY[0..maxlen-1] OF BYTE;
END_VAR
;PROGRAM SrMain
VAR CONSTANT
cconst: INT(5..10) := 5;
END_VAR
VAR
fbMyString1 : FB_SrString<5>;
fbMyString2 : FB_SrString<(2 * cconst)>;
fbMyString3 : FB_SrcString<123>;
// ERROR: An error is reported here because 123 is not within the value range 5..10.
arrMyString : ARRAY [0..5] OF FB_SrString<6>;
END_VAR次のコードは、任意の長さの配列を処理できる関数ブロックを定義する方法を示しています。関数ブロックには、汎用であるが一定の長さの配列があります。 「一定」とは、各関数ブロックインスタンスの配列の長さが異なりますが、オブジェクトの存続期間中は一定であることを意味します。
この種の構成は、たとえば、ジェネリックライブラリーPOUを実装したいライブラリープログラマーにとって有益です。
FUNCTION_BLOCK FB_MyString
VAR_GENERIC CONSTANT
maxlen : UDINT := 1;
END_VAR
VAR
test : ARRAY[0..maxlen-1] OF BYTE;
END_VARPROGRAM PLC_PRG
VAR CONSTANT
cconst: DINT := 1000;
END_VAR
VAR
fbMyString1 : FB_MyString<100>;
fbMyString2 : FB_MyString<(2 * cconst)>;
arrMyString : ARRAY[0..5] OF FB_MyString<6>;
END_VAR継承
汎用モジュールは、汎用定数 () を使用して基本汎用モジュールから派生できます。(EXTENDS) 継承。継承する汎用モジュールには独自の汎用定数が必要です。これにより、特定の値を外部から転送できます
構文:
FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
<generic constant name> : <integer data type> ;
END_VAR
EXTENDS <function block base> < <generic constant name> >
汎用定数を持つ汎用モジュールは、インタフェースを実装できます (IMPLEMENTS)。インターフェイスはプロパティ () を宣言します。(PROPERTY) を使用すると、外部から指定された値にアクセスできます。インターフェイス自体にジェネリック定数やローカル変数を宣言してはいけません。インターフェースには実装がありません。
構文:
FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
<generic constant name> : <integer data type> ;
END_VAR
IMPLEMENTS <interface name>
重要
コーディング時には、ジェネリック定数の宣言が最初に挿入され、その後に以下が挿入されていることを確認してください EXTENDS そして IMPLEMENTS。慣れるには少し時間がかかりますが、その理由は、ジェネリック定数は基本クラスでも使用できるからです
の定義 IString ジェネリック関数ブロック用のインターフェイス。
ジェネリック関数ブロック用のインターフェイスを定義することを強くお勧めします。このインターフェースは、ジェネリック定数の知識がなくてもジェネリック関数ブロックインスタンスを使用できるようにする必要があります
ザル Length プロパティはジェネリック定数へのアクセスを可能にします。
INTERFACE IString
METHOD Append : BOOL
VAR_INPUT
strAppend : IString;
END_VAR
METHOD Assign : BOOL
VAR_INPUT
stringIn : STRING;
END_VAR
METHOD ToString : STRING
VAR_INPUT
END_VAR
PROPERTY Length : DINTファンクションブロックの宣言 FB_MyString ジェネリック定数を使って maxlen
FUNCTION_BLOCK FB_MyString
VAR_GENERIC CONSTANT
maxlen : UDINT;
END_VAR
IMPLEMENTS IString
ファンクションブロック FB_LongString は指定されたファンクションブロックの拡張です。 FB_MyString。
FUNCTION_BLOCK FB_LongString EXTENDS FB_MyString<1000>
ファンクションブロックの宣言 FB_MySpecialString ジェネリック定数を使って maxlen2 指定されたファンクションブロックの拡張として FB_MyString。ファンクションブロックはメソッドによって拡張されます。 METH_ToLatin。
FUNCTION_BLOCK FB_MySpecialString
VAR_GENERIC CONSTANT
maxlen2 : UDINT:= 1;
END_VAR
EXTENDS FB_MyString<maxlen2>
METHOD METH_ToLatin : STRING VAR_INPUT END_VAR
特定の定数によるファンクションブロックのインスタンス化
PROGRAM PLC_PRG
VAR CONSTANT
cconst: DINT := 1000;
END_VAR
VAR
string1 : FB_MyString<100>;
string2 : FB_MyString<(2 * cconst)>;
derived1 : FB_LongString;
derived2 : FB_MySpecialString<100>;
END_VAR
通話
string1.METH_Assign ('Welt');
string2.METH_Assign ('Hallo ');
string2.METH_Append(string1);
derived2.METH_ToLatin('Hello World');