Skip to main content

Variabile: VAR_GENERIC CONSTANT

Variabile costante generica

Una costante generica è una variabile in VAR_GENERIC CONSTANT ambito di un blocco funzionale. La variabile è definita solo quando viene dichiarata l'istanza del blocco funzione.

costanti generiche possono essere utilizzate nei metodi. Ciò può essere particolarmente utile in VAR_IN_OUT o VAR_IN_OUT CONSTANT ambito.

Sintassi della dichiarazione del tipo

Sintassi della dichiarazione del tipo di un blocco funzionale con costanti generiche

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>

Nome del blocco funzionale

VAR_GENERIC CONSTANT

END_VAR

Ambito per costanti generiche

È possibile dichiarare un numero qualsiasi di costanti generiche nel VAR_GENERIC CONSTANT ambito.

<generic constant name>

Nome variabile delle costanti generiche

: <integer data type>

Costruisci quale digita la costante generica.

È consentito un tipo di dati intero o il sottoscopio di un tipo di dati intero.

Esempio:

maxlen1 : INT := 4;

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

:= <initial value>

Facoltativo

Inizializzazione

Importante

Il valore iniziale è necessario solo per i controlli di compilazione. In fase di esecuzione, il valore viene sovrascritto

La costante generica può essere utilizzata come di consueto nell'implementazione del blocco funzione. Questi tipi di costanti possono essere utilizzati, ad esempio, per gli indici degli array o le lunghezze delle stringhe

Sintassi della dichiarazione della variabile

Sintassi della dichiarazione della variabile (istanziazione del blocco funzione) con una costante specificata

Sono possibili le seguenti opzioni:

PROGRAM <program name>
VAR
    <fb instance name> : <function block name> < <literal> > ;
    <fb instance name> : <function block name> <( <expression> )> ;
    <fb instance name> : ARRAY [ <index start > .. <index end> ] OF <function block name> < <array length> > ;
END_VAR
Tabella 9. Dichiarazione variabile

<scope>

END_...

Ambito

<fb instance name>

Variabile; nome dell'istanza del blocco funzionale

: <function block name>

Digita la variabile con il blocco funzione

Si tratta di un blocco funzione con costanti generiche.

< <literal> >

Facoltativo

Assegna un valore specifico al tipo di dati valido solo per questa istanza del blocco funzione. Il valore viene inserito formalmente in angle brackets come suffisso del tipo di dati.

Esempio: fbMyString1 : FB_MyString<100&>;

Se multiplo sono state dichiarate costanti generiche per il blocco funzionale che definisce il tipo, quindi viene passato un elenco di valori separati da virgole tra parentesi angolari.

Example: fbPou : FB_Pou<100, 1000>;

<( <expression> )>

Facoltativo

Assegna un'espressione specifica al tipo di dati valida solo per questa istanza del blocco funzione. L'espressione viene inserita in angle brackets come suffisso del tipo di dati. L'espressione stessa deve essere racchiusa tra parentesi tonde .

Le parentesi tonde sono necessarie perché è consentito l'uso di simboli come < o > in un'espressione. Altrimenti, l'unicità del codice non è più garantita

Example: fbMyString2 : FB_MyString<(2 * cconst)>;

ARRAY [ <start index start> .. <end index> ] OF <function block name>

Facoltativo

Digita la variabile con una serie di blocchi funzione. La lunghezza dell'array è:

<end index> - <start index> + 1

Si tratta di un blocco funzione con costanti generiche. Le costanti vengono utilizzate come indici di matrice

Esempio: arrMyString

< <array length> >

Assegna una lunghezza specifica dell'array al tipo di dati, valida soprattutto per questa istanza del blocco funzione.

La lunghezza dell'array specificata viene formalmente inserita tra parentesi angolari come suffisso del tipo di dati. Il valore specificato deve corrispondere alla lunghezza dell'array definita dall'indice iniziale e dall'indice

Example: arrMyString : ARRAY[0..5] OF FB_MyString<6>;



Esempi

Esempio 92. Esempio di utilizzo di più costanti generiche
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


Esempio 93. Esempio: costante generica di un tipo di sottoscopio
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)>;
    arrMyString : ARRAY [0..5] OF FB_SrString<6>;
END_VAR


Esempio 94. Esempio: blocco funzione generico con variabile di matrice parametrizzabile

Il codice seguente dimostra come definire un blocco funzione in grado di elaborare array di lunghezza arbitraria. Il blocco funzionale ha una matrice con una lunghezza generica ma costante. «Costante» significa che, sebbene ogni istanza del blocco funzione vari nella lunghezza dell'array, è costante per tutta la durata dell'oggetto.

Questo tipo di costrutto è utile, ad esempio, per un programmatore di librerie che desidera implementare una POU di libreria generica.

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
;


Eredità

Un blocco funzione può ereditare da un blocco funzione di base con una costante generica (EXTENDS). Il blocco funzione ereditario richiede una propria costante generica. Un valore specifico può quindi essere trasferito esternamente

Sintassi:

FUNCTION_BLOCK <function block name> 
VAR_GENERIC CONSTANT        
    <generic constant name> : <integer data type> ; 
END_VAR 
EXTENDS <function block base> < <generic constant name> >

Un blocco funzione con una costante generica può implementare un'interfaccia (IMPLEMENTS). L'interfaccia dichiara una proprietàPROPERTY) con cui è possibile accedere esternamente al valore specificato. L'interfaccia stessa non deve dichiarare costanti generiche o variabili locali. Le interfacce non hanno alcuna implementazione

Sintassi:

FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
    <generic constant name> : <integer data type> ;
END_VAR
IMPLEMENTS <interface name>

Suggerimento

Durante la codifica, assicurati che la dichiarazione delle costanti generiche sia inserita per prima, seguita da EXTENDS e IMPLEMENTS. Ci vuole un po' di tempo per abituarsi, ma il motivo è che le costanti generiche possono essere utilizzate anche con le classi base

Esempio 95. Esempio

Definizione di IString interfaccia per un blocco funzione generico.

It is strongly recommended to define an interface for generic function blocks. The interface should allow the generic function block instance to be used without knowledge of the generic constants.

Le Length la proprietà consente l'accesso alla costante generica.

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

Dichiarazione del blocco funzionale FB_MyString con la costante generica maxlen

FUNCTION_BLOCK FB_MyString 
VAR_GENERIC CONSTANT        
    maxlen : UDINT; 
END_VAR 
IMPLEMENTS IString 

Il blocco funzionale FB_LongString è un'estensione del blocco funzione specificato FB_MyString.

FUNCTION_BLOCK FB_LongString EXTENDS FB_MyString<1000>

Dichiarazione del blocco funzionale FB_MySpecialString con la costante generica maxlen2 come estensione del blocco funzione specificato FB_MyString. Il blocco funzionale viene esteso con il metodo 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

Istanziazione dei blocchi funzionali con costanti specifiche

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 

Chiamate

string1.METH_Assign ('Welt'); 
string2.METH_Assign ('Hallo '); 
string2.METH_Append(string1); 
derived2.METH_ToLatin('Hello World');