Skip to main content

Tipo de datos: ANY, ANY_<tipo>

Los tipos de datos ANY o ANY_<tipo> se utilizan en interfaces de funciones, bloques de funciones o métodos para escribir parámetros de entrada cuyo tipo es desconocido o no está especificado: Las variables de entrada (VAR_INPUT) tienen un tipo de datos genérico.

El compilador reemplaza internamente el tipo de variable de entrada con la estructura de datos que se describe a continuación, por lo que el valor no se pasa directamente. En su lugar, se pasa un puntero al valor real para que solo se pueda pasar una variable. Por lo tanto, el tipo de datos sólo se especifica cuando se llama. Como resultado, las llamadas de dichas POU se pueden realizar utilizando argumentos, cada uno de los cuales tiene diferentes tipos de datos.

Sugerencia

Literales, constantes reemplazadas y resultados de llamadas o expresiones a funciones. no puedo pasarse a variables de entrada (VAR_IN_OUT).

Estructura de datos interna para ANY y ANY_<tipo>

Cuando se compila el código, las variables de entrada se escriben internamente con ANY tipo de datos mediante la siguiente estructura. Cuando se llama a la POU (en tiempo de ejecución), el argumento se pasa a un parámetro de referencia.

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

Sugerencia

Puede acceder a la variable de entrada dentro de la POU a través de esta estructura y, por ejemplo, consultar el valor pasado.

ejemplo 210. Ejemplo

Esto compara si dos variables de entrada tienen o no el mismo tipo y el mismo valor.

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;


Declaración

Las descripciones de sintaxis hacen referencia a una POU con exactamente un parámetro (una variable de entrada).

Sintaxis

<ámbito> <nombre de la POU> : <tipo de datos del valor de retorno> VAR_INPUT <nombre de la variable> : <tipo de datos genérico>; END_VAR

<ámbito>

Posibles alcances:

  • FUNCTION

  • FUNCTION_BLOCK

  • METHOD

<nombre de la POU>

Nombre de la POU

: <tipo de datos del valor de retorno>

Opcional

<nombre de la variable>

Nombre de la variable de entrada

<tipo de datos genérico>

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

ejemplo 211. Ejemplo
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


Sugerencia

Con versiones del compilador > 3.5.1.0, se admiten los tipos de datos IEC genéricos de la tabla.

La tabla representa la jerarquía de los tipos de datos genéricos y proporciona información sobre qué tipo de datos genéricos del parámetro formal (declaración) permite qué tipos de datos elementales del argumento (llamada).

Tipo de datos genérico en el caso de un parámetro formal

Tipo de datos elemental permitido en el caso de un parámetro real (argumento)

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

Llamar

Las descripciones de sintaxis hacen referencia a una POU con exactamente un parámetro, al que se le pasa un argumento. Como resultado, el tipo de datos del argumento especifica el tipo de datos genérico de la variable de entrada. Por ejemplo, argumentos del tipo BYTE, WORD, DWORD, LWORD se puede pasar a un tipo ANY_BIT variable de entrada.

Sintaxis de llamada a función:

<nombre de la función> (<argumento>)

Sintaxis de la llamada al bloque de funciones

<nombre de la instancia del bloque de funciones> (<nombre de la variable de entrada> := <argumento>)

Sintaxis de llamada al método

<nombre de la instancia del bloque de funciones> . <nombre del método> (<nombre de la variable de entrada> := <argumento>)

<argumento>

Variable de transferencia

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