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.
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_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) | ||
---|---|---|---|
|
|
| |
|
| ||
|
|
| |
|
| ||
|
|
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);