数据类型ANY
或ANY_<type>
用于函数、功能块或方法的接口,以便对类型未知或未指定的输入参数进行类型化:输入变量 (VAR_INPUT
) 采用通用数据类型。
编译器会在内部用下面描述的数据结构替换输入变量的类型,从而不直接传递值。而不是传递一个指向实际值的指针,因此只能传递一个变量。因此,只有在调用时才会指定数据类型。因此,在调用此类 POU 时,可以使用各自具有不同数据类型的参数。
字面量、替换常量、函数调用结果或表达式不能 传递给输入变量 (VAR_IN_OUT
)。
ANY' 和 'ANY_<type>' 的内部数据结构
编译代码时,输入变量的内部类型为 ,数据类型为ANY
,结构如下。当调用 POU 时(运行时),参数会传递给一个引用参数。
TYPE AnyType : STRUCT // the type of the actual parameter typeclass : __SYSTEM.TYPE_CLASS ; // the pointer to the actual parameter pvalue : POINTER TO BYTE; // the size of the data, to which the pointer points diSize : DINT; END_STRUCT END_TYPE
您可以通过该结构访问 POU 中的输入变量,例如查询传递的值。
示例
这将比较两个输入变量是否具有相同类型和相同值。
FUNCTION funGenericCompare : BOOL VAR_INPUT any1 : ANY; any2 : ANY; END_VAR VAR pTest : POINTER TO ARRAY [0..100] OF POINTER TO DWORD; diCount: DINT; END_VAR 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; // END_FUNCTION
声明
语法说明指的是带有一个参数(输入变量)的 POU。
语法
FUNCTION | FUNCTION_BLOCK | METHOD <POU name> ( : <return data type> )? VAR_INPUT <input variable name> : <generic data type>; END_VAR <generic data type> = ANY | ANY_BIT | ANY_DATE | ANY_NUM | ANY_REAL | ANY_INT | ANY_STRING
示例
FUNCTION funComputeAny : BOOL VAR_INPUT anyInput1 : ANY; // valid data type see table END_VAR // END_FUNCTION FUNCTION_BLOCK FB_ComputeAny VAR_INPUT anyInput1 : ANY; END_VAR // END_FUNCTION_BLOCK 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 //END_METHOD
编译器版本 > 3.5.1.0 时,支持表中的通用 IEC 数据类型。
该表显示了通用数据类型的层次结构,并提供了形式参数(声明)的通用数据类型允许参数(调用)的基本数据类型的信息。
形式参数情况下的通用数据类型 |
在实际参数(参数)的情况下允许使用的基本数据类型 |
||
---|---|---|---|
|
|
|
|
|
|
||
|
|
|
|
|
|
||
|
|
致电
语法说明指的是带有一个参数的 POU。因此,参数的数据类型指定了输入变量的通用数据类型。例如,可以将BYTE, WORD, DWORD, LWORD
类型的参数传递给ANY_BIT
类型的输入变量。
函数调用语法
<variable name> := <function name> ( <argument name> ); <argument name> : variable with valid data type
功能块调用语法
<function block name> ( <input variable name> := <argument name> );
方法调用语法
<function block name> . <method name> ( <input variable name> := <argument name> );
示例
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 xResultByte := funComputeAny(byValue); xResultInt := funComputeAny(iValue); xResult := funGenericCompare(wBitField1, wBitField2); fbComputeAnyByte(anyInput1 := byValue); fbComputeAnyInt(anyInput1 := iValue); fbComputeM1.methComputeAnny(anyInput1 := byValue); fbComputeM2.methComputeAnny(anyInput1 := iValue); // END_PRG