数据类型: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);