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
| Nome del blocco funzionale |
| Ambito per costanti generiche È possibile dichiarare un numero qualsiasi di costanti generiche nel |
| Nome variabile delle costanti generiche |
| Costruisci quale digita la costante generica. È consentito un tipo di dati intero o il sottoscopio di un tipo di dati intero. Esempio:
|
| Facoltativo Inizializzazione ImportanteIl 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
| Ambito |
| Variabile; nome dell'istanza del blocco funzionale |
| Digita la variabile con il blocco funzione Si tratta di un blocco funzione con costanti generiche. |
| Facoltativo Assegna un valore specifico al tipo di dati valido solo per questa istanza del blocco funzione. Il valore viene inserito formalmente Esempio: 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: |
| Facoltativo Assegna un'espressione specifica al tipo di dati valida solo per questa istanza del blocco funzione. L'espressione viene inserita Le parentesi tonde sono necessarie perché è consentito l'uso di simboli come Example: |
| Facoltativo Digita la variabile con una serie di blocchi funzione. La lunghezza dell'array è:
Si tratta di un blocco funzione con costanti generiche. Le costanti vengono utilizzate come indici di matrice Esempio: |
| 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: |
Esempi
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
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
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
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');