Tipo di dati: ANY, ANY__<tipo>
I tipi di dati ANY
o ANY_<tipo>
vengono utilizzati nelle interfacce di funzioni, blocchi funzione o metodi per digitare parametri di ingresso il cui tipo è sconosciuto o non specificato: Le variabili di ingresso (VAR_INPUT
) hanno un tipo di dati generico.
Il compilatore sostituisce internamente il tipo della variabile di ingresso con la struttura dati descritta di seguito, per cui il valore non viene passato direttamente. Viene invece passato un puntatore al valore effettivo in modo che sia possibile passare solo una variabile. Pertanto il tipo di dati viene specificato solo quando viene richiamato. Di conseguenza, le chiamate a tali POU possono essere effettuate utilizzando argomenti che hanno ciascuno tipi di dati diversi.
Suggerimento
Letterali, costanti sostituite e risultati di chiamate o espressioni di funzioni non può essere passato alle variabili di input (VAR_IN_OUT
).
Struttura dati interna per ANY e ANY_<tipo>
Quando il codice viene compilato, le variabili di input vengono digitate internamente con ANY
tipo di dati dalla seguente struttura. Quando viene richiamata la POU (in fase di runtime), l'argomento viene passato a un parametro di riferimento.
TYPE AnyType : STRUCT // Type of the current parameter typeclass : __SYSTEM.TYPE_CLASS ; // Pointer to the current parameter pvalue : POINTER TO BYTE; // Size of the data to which the pointer points diSize : DINT; END_STRUCT END_TYPE
Suggerimento
Attraverso questa struttura è possibile accedere alla variabile di ingresso all'interno del POU e interrogare ad esempio il valore passato.
Questo confronta se due variabili di input hanno o meno lo stesso tipo e lo stesso valore.
FUNCTION funGenericCompare : BOOL // Declaration VAR_INPUT any1 : ANY; any2 : ANY; END_VAR VAR pTest : POINTER TO ARRAY [0..100] OF POINTER TO DWORD; diCount: DINT; END_VAR // Implementation pTest := ADR(any1); Generic_Compare := FALSE; IF any1.typeclass <> any2.typeclass THEN RETURN; END_IF IF any1.diSize <> any2.diSize THEN RETURN; END_IF // Byte comparison FOR iCount := 0 TO any1.diSize-1 DO IF any1.pvalue[iCount] <> any2.pvalue[iCount] THEN RETURN; END_IF END_FOR Generic_Compare := TRUE; RETURN;
Dichiarazione
Le descrizioni della sintassi si riferiscono a una POU con esattamente un parametro (una variabile di ingresso).
Sintassi
<ambito> <Nome POU> : <tipo di dati del valore restituito> VAR_INPUT <nome variabile> : <tipo di dati generico>; END_VAR
<ambito> | Possibili ambiti:
|
<Nome POU> | Nome della POU |
| Opzionale |
<nome variabile> | Nome della variabile di input |
<tipo di dati generico> |
|
FUNCTION funComputeAny : BOOL VAR_INPUT anyInput1 : ANY; // For valid data type see table END_VAR FUNCTION_BLOCK FB_ComputeAny VAR_INPUT anyInput1 : ANY; END_VAR FUNCTION_BLOCK FB_ComputeMethod METHOD methComputeAnny : BOOL VAR_INPUT anyInput1 : ANY_INT; // Valid data types are SINT, INT, DINT, LINT, USINT, UINT, UDINT, ULINT END_VAR
Suggerimento
Con le versioni del compilatore > 3.5.1.0 sono supportati i tipi di dati IEC generici nella tabella.
La tabella rappresenta la gerarchia dei tipi di dati generici e fornisce informazioni su quale tipo di dati generico del parametro formale (dichiarazione) consente quali tipi di dati elementari dell'argomento (chiamata).
Tipo di dati generico nel caso di un parametro formale | Tipo di dati elementare consentito nel caso di un parametro attuale (argomento) | ||
---|---|---|---|
|
|
| |
|
| ||
|
|
| |
|
| ||
|
|
Chiamata
Le descrizioni della sintassi si riferiscono a una POU con esattamente un parametro a cui viene passato un argomento. Di conseguenza, il tipo di dati dell'argomento specifica il tipo di dati generico della variabile di input. Ad esempio, argomenti del tipo BYTE, WORD, DWORD, LWORD
può essere passato a un tipo ANY_BIT
variabile di ingresso.
Sintassi della chiamata di funzione:
<nome della funzione> (<argomento>)
Sintassi della chiamata del blocco funzione
<nome dell'istanza del blocco funzione> (<nome della variabile di input> := <argomento>)
Sintassi della chiamata al metodo
<nome dell'istanza del blocco funzione> . <nome del metodo> (<nome della variabile di input> := <argomento>)
<argomento> | Trasferisci variabile |
PROGRAM PLC_PRG VAR byValue : BYTE := 16#AB; iValue : INT := -1234; xResultByte : BOOL; xResultInt : BOOL; fbComputeAnyByte : FB_ComputeAny; fbComputeAnyInt : FB_ComputeAny; fbComputeM1 : FB_ComputeMethod; fbComputeM2 : FB_ComputeMethod; byN : BYTE := 1; wBitField1 : WORD := 16#FFFF; wBitField2 : WORD := 16#0001; xInit : BOOL; xResult : BOOL; END_VAR //Implementation xResultByte := funComputeAny(byValue); xResultInt := funComputeAny(iValue); xResult := funGenericCompare(wBitField1, wBitField2); fbComputeAnyByte(anyInput1 := byValue); fbComputeAnyInt(anyInput1 := iValue); fbComputeM1.methComputeAnny(anyInput1 := byValue); fbComputeM2.methComputeAnny(anyInput1 := iValue);