Skip to main content

変数: 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 name>

ファンクションブロックの名前

VAR_GENERIC CONSTANT

END_VAR

ジェネリック定数のスコープ

で任意の数のジェネリック定数を宣言できます VAR_GENERIC CONSTANT スコープ。

<generic constant name>

ジェネリック定数の変数名

: <integer data type>

ジェネリック定数をタイプするコンストラクト。

整数データ型または整数データ型のサブスコープを使用できます。

例:

maxlen1 : INT := 4;

maxlen2 : INT(5..10) := 5;

:= <initial value>

[オプション]

[初期化]

重要

初期値はコンパイルチェックにのみ必要です。実行時に、値は上書きされます

例:

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)>

      利点は、パラメータの転送が読みやすく、変更後も追跡可能で保守が容易であることです。

  • さらに多くの変数が宣言されている場合は、追加のパラメータをそれらに渡す必要があります。代入演算子を使用する :=、これらはまとめて括弧で囲まれています。

91.

ファンクションブロック 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


92.

ファンクションブロックのインスタンス化 FB パラメータを渡すだけです。

PROGRAM PLC_PRG
VAR
    MyFB1 : FB<5,10> := (SomeOtherParameter:=20);
END_VAR

VAR
    liArray1Size: LINT;
END_VAR
liArray1Size := UPPER_BOUND(MyFB1.MyArray1,1) + 1;


93.

パラメータを明示的に渡す関数ブロックインスタンス 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_VAR
Array1Size := 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) は、関数ブロック内のプリコンパイルチェックに使用されますが、それ以外の効果はありません。

94. 複数の汎用定数の使用例
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_VAR
PROGRAM PLC_PRG
VAR
    fbPou : FB_Pou<100, 1000>;
END_VAR


95. 例:サブスコープタイプの汎用定数

サブ範囲タイプをジェネリックパラメーターとして使用して、コンパイラーがチェックする値の許容範囲を指定できます。

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


96. 例:パラメーター化可能な配列変数を持つジェネリック関数ブロック

次のコードは、任意の長さの配列を処理できる関数ブロックを定義する方法を示しています。関数ブロックには、汎用であるが一定の長さの配列があります。 「一定」とは、各関数ブロックインスタンスの配列の長さが異なりますが、オブジェクトの存続期間中は一定であることを意味します。

この種の構成は、たとえば、ジェネリックライブラリーPOUを実装したいライブラリープログラマーにとって有益です。

FUNCTION_BLOCK FB_MyString 
VAR_GENERIC CONSTANT
    maxlen : UDINT := 1;
END_VAR
VAR
    test : ARRAY[0..maxlen-1] OF BYTE;
END_VAR
PROGRAM 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。慣れるには少し時間がかかりますが、その理由は、ジェネリック定数は基本クラスでも使用できるからです

97.

の定義 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');