数据类型:ANY、ANY_<类型>
数据类型 ANY 或者 ANY_<类型> 用于函数、功能块或方法的接口中,以便输入类型未知或未指定的输入参数:输入变量 (VAR_INPUT)具有通用数据类型。
编译器在内部用下面描述的数据结构替换输入变量的类型,从而不直接传递值。相反,指针被传递到实际值,因此只能传递变量。因此,只有在调用时才指定数据类型。因此,可以使用每个具有不同数据类型的参数来调用此类 POU。
提示
文字、替换常量以及函数调用或表达式的结果 不能 传递给输入变量(VAR_IN_OUT)。
ANY 和 ANY_ 的内部数据结构<类型>
编译代码时,输入变量 内部 和 ANY 数据类型由以下结构组成。当调用 POU 时(在运行时),参数将传递给引用参数。
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提示
您可以通过该结构体访问POU内的输入变量,例如查询传递的值。
这比较两个输入变量是否具有相同的类型和相同的值。
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;
宣言
语法描述指的是只有一个参数(输入变量)的 POU。
句法
<范围> <POU名称> : <返回值的数据类型> 变量输入 <变量名称> : <通用数据类型>; END_VAR
<范围> | 可能的范围:
|
<POU名称> | 项目单元名称 |
| 选修的 |
<变量名称> | 输入变量的名称 |
<通用数据类型> |
|
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提示
对于编译器版本 > 3.5.1.0,支持表中的通用 IEC 数据类型。
该表表示通用数据类型的层次结构,并提供有关形式参数(声明)的通用数据类型允许参数(调用)的基本数据类型的信息。
形式参数情况下的通用数据类型 | 实际参数(参数)情况下允许的基本数据类型 | ||
|---|---|---|---|
|
|
| |
|
| ||
|
|
| |
|
| ||
|
| ||
称呼
语法描述指的是只有一个参数的 POU,参数将传递到该参数。因此,参数的数据类型指定输入变量的通用数据类型。例如,类型的参数 BYTE, WORD, DWORD, LWORD 可以传递给一个类型 ANY_BIT 输入变量。
函数调用语法:
<函数名称> (<参数>)
功能块调用语法
<功能块实例的名称> (<输入变量的名称> := <参数>)
方法调用的语法
<功能块实例的名称> 。 <方法名称> (<输入变量的名称> := <参数>)
<参数> | 传递变量 |
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);