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_TYPESugerencia
Puede acceder a la variable de entrada dentro de la POU a través de esta estructura y, por ejemplo, consultar el valor pasado.
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:
|
<nombre de la POU> | Nombre de la POU |
| Opcional |
<nombre de la variable> | Nombre de la variable de entrada |
<tipo de datos genérico> |
|
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_VARSugerencia
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) | ||
|---|---|---|---|
|
|
| |
|
| ||
|
|
| |
|
| ||
|
| ||
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 |
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);