Generische konstante Variablen - VAR_GENERIC CONSTANT

Eine generische Konstante ist eine Variable im Deklarationsbereich VAR_GENERIC CONSTANT eines Funktionsbausteins, der erst bei der Deklaration der Funktionsbaustein-Instanz definiert wird.

Generische konstante Variablen - VAR_GENERIC CONSTANT 1:

Verfügbar ab TC3.1 Build 4026

Syntax

Deklaration des Funktionsbausteins:

FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
    <generic constant name> : <integer data type> := <initial value>; //Initialwert wird überschrieben
END_VAR

Die generische Konstante (ganzzahliger Datentyp) kann innerhalb eines Funktionsbausteins wie üblich verwendet werden. Beispielsweise können Sie die Konstante für die Definition der Größe von Arrays oder der Länge von Strings verwenden. Der Initialwert wird nur für Compile-Prüfungen benötigt. Zur Laufzeit wird der Wert überschrieben.

Deklaration des Funktionsbaustein-Instanz:

PROGRAM MAIN
VAR
    <fb instance name> : <function block name> < <literal> >;
    <fb instance name> : <function block name> <( <expression> )>;
END_VAR

Bei der Deklaration der Funktionsbaustein-Instanzen wird der Konstanten ein spezifischer Wert zugewiesen, der nur für diese Instanz gültig ist. Dafür wird dem als Datentyp fungierenden Funktionsbaustein der Wert (<literal>) in spitzen Klammern angehängt.

Alternativ dazu kann ein Ausdruck (<expression>) angehängt werden. Dieser muss allerdings in runden Klammern stehen, da es bei einem Ausdruck erlaubt ist, Symbole wie < oder > zu verwenden. Sonst ist die Eindeutigkeit des Codes nicht mehr gewährleistet.

Beispiel

Generischer Funktionsbaustein mit parametrierbarer Arrayvariable

Der folgende Code zeigt, wie ein Funktionsbaustein zu definieren ist, der Arrays beliebiger Länge verarbeiten kann. Der Funktionsbaustein verfügt über ein Array mit einer generischen, aber konstanten Länge. Mit "konstant" ist gemeint, dass, obwohl jede Funktionsbaustein-Instanz in ihrer Arraylänge variiert, diese während der Lebensdauer des Objekts konstant ist.

Ein solches Konstrukt ist beispielsweise für einen Bibliotheksprogrammierer von Vorteil, der einen generischen Bibliotheksbaustein implementieren möchte.

FUNCTION_BLOCK FB_Sample
VAR_GENERIC CONSTANT
    nMaxLen : UDINT := 1;
END_VAR
VAR
    aSample : ARRAY[0..nMaxLen-1] OF BYTE;
END_VAR
PROGRAM MAIN
VAR CONSTANT
    cConst    : DINT := 10;
END_VAR
VAR
    fbSample1 : FB_Sample<100>;
    fbSample2 : FB_Sample<(2*cConst)>;
    aSample   : ARRAY[0..5] OF FB_Sample<10>;
END_VAR

Vererbung

Ein Funktionsbaustein mit generischen Konstanten kann auch die Vererbungskonstrukte EXTENDS und IMPLEMENTS verwenden.

Achten Sie beim Implementieren darauf, dass erst die Deklaration der generischen Konstanten eingefügt wird und dann EXTENDS und IMPLEMENTS nachfolgen. Das hat den Grund, dass generische Konstanten auch bei Basisklassen verwendet werden können.

Beispiel

INTERFACE I_Sample
FUNCTION_BLOCK FB_Sample
VAR_GENERIC CONSTANT
    nMaxLen   : UDINT := 1;
END_VAR
IMPLEMENTS I_Sample
VAR
    aSample   : ARRAY[0..nMaxLen-1] OF BYTE;
END_VAR
FUNCTION_BLOCK FB_Sub_1 EXTENDS FB_Sample<100>
FUNCTION_BLOCK FB_Sub_2
VAR_GENERIC CONSTANT
    nMaxLen2  : UDINT := 1;
END_VAR
EXTENDS FB_Sample<nMaxLen2>
PROGRAM MAIN
VAR
    fbSample1 : FB_Sample<10>;
    fbSub1    : FB_Sub_1;
    fbSub2    : FB_Sub_2<20>;
END_VAR