Skip to main content

数据类型: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内的输入变量,例如查询传递的值。

210. 例子

这比较两个输入变量是否具有相同的类型和相同的值。

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

<范围>

可能的范围:

  • FUNCTION

  • FUNCTION_BLOCK

  • METHOD

<POU名称>

项目单元名称

: <返回值的数据类型>

选修的

<变量名称>

输入变量的名称

<通用数据类型>

ANY, ANY_BIT, ANY_DATE, ANY_NUM, ANY_REAL, ANY_INT, 或者 ANY_STRING

211. 例子
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 数据类型。

该表表示通用数据类型的层次结构,并提供有关形式参数(声明)的通用数据类型允许参数(调用)的基本数据类型的信息。

形式参数情况下的通用数据类型

实际参数(参数)情况下允许的基本数据类型

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

称呼

语法描述指的是只有一个参数的 POU,参数将传递到该参数。因此,参数的数据类型指定输入变量的通用数据类型。例如,类型的参数 BYTE, WORD, DWORD, LWORD 可以传递给一个类型 ANY_BIT 输入变量。

函数调用语法:

<函数名称><参数>

功能块调用语法

<功能块实例的名称><输入变量的名称> := <参数>

方法调用的语法

<功能块实例的名称><方法名称><输入变量的名称> := <参数>

<参数>

传递变量

212. 例子
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);