Skip to main content

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.

Esempio 210. Esempio

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:

  • FUNCTION

  • FUNCTION_BLOCK

  • METHOD

<Nome POU>

Nome della POU

: <tipo di dati del valore restituito>

Opzionale

<nome variabile>

Nome della variabile di input

<tipo di dati generico>

ANY, ANY_BIT, ANY_DATE, ANY_NUM, ANY_REAL, ANY_INT, O ANY_STRING

Esempio 211. Esempio
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)

ANY

ANY_BIT

  • BYTE

  • WORD

  • DWORD

  • LWORD

ANY_DATE

  • DATE

  • DATE_AND_TIME, DT

  • TIME_OF_DAY, TOD

  • LDATE

  • LDATE_AND_TIME, LDT

  • LTIME_OF_DAY, LTOD

ANY_NUM

ANY_REAL

REAL, LREAL

ANY_INT

USINT, UINT, UDINT, ULINT

SINT, INT, DINT, LINT

ANY_STRING

STRING, WSTRING

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

Esempio 212. Esempio
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);