这就是我想要的(这是一个FB对象的构造函数):
METHOD FB_init : BOOL
VAR_INPUT
bInitRetains : BOOL;
bInCopyCode : BOOL;
//My variables:
typeOfVariable : TYPE; // This obviously doesn't work
END_VAR
size := 1;
myArray := __NEW(typeOfVariable, size); // Create dynamic array with 'typeOfVariable' variables.
END_METHOD
- 在这个方法中,我将传递给参数
typeOfVariable
for以REAL
为例,该方法将创建REAL
变量数组size1
. - 我需要知道我声明的
type
是什么typeOfVariable
,所以它可以存储 其他变量
type
的数据。工作示例是动态创建数组的
__NEW()
方法这个方法接受一个参数,如
REAL
或INT
。
这是它的代码:
myArray := __NEW(REAL, 10); //Create array with type REAL variables with the size of 10
好的,这里有一个如何解决这个问题的小示例:
先创建一个Enum:
TYPE E_Type :
(
eNO_TYPE := 0,
eINT,
eREAL
);
END_TYPE
在开关箱中使用:
METHOD createArray : POINTER TO BYTE
VAR_INPUT
eType : E_Type;
size : UINT;
END_VAR
CASE eType OF
eINT:
//Remember to __DELETE
createArray := __NEW(INT, size);
eREAL:
createArray := __NEW(REAL, size);
END_CASE
检查null指针,当你不再需要这个数组时,记得__Delete。
令我惊讶的是(而且是偶然的),我发现有一个名为ETcloEcPredictDataType
的文件包含以下代码:
{attribute 'TcTypeSystem'}
{attribute 'signature_flag' := '33554432'}
{attribute 'checksuperglobal'}
{attribute 'show'}
{attribute 'no-analysis'}
{attribute 'GUID' := '6FFE9C73-9040-49AE-8731-5485B8A3A604'}
{attribute 'Namespace' := 'IO'}
TYPE ETcIoEcPredictDataType : (_SINT:=1, _USINT:=2, _INT:=3, _UINT:=4, _DINT:=5, _UDINT:=6, _LINT:=7, _ULINT:=8, _REAL:=9, _LREAL:=10) UDINT;
END_TYPE
注意,我甚至不需要包含这个文件。我只写了
_REAL
,点击它,选择Go to definition
。然后打开ETcloEcPredictDataType
文件。
所以在@Filippo Boido的回答之后,你可以用CASE
语句创建函数:
//_SINT:=1, _USINT:=2, _INT:=3, _UINT:=4, _DINT:=5, _UDINT:=6, _LINT:=7, _ULINT:=8, _REAL:=9, _LREAL:=10
CASE _type OF
1: myArray := __NEW(SINT, size);
2: myArray := __NEW(USINT, size);
3: myArray := __NEW(INT, size);
4: myArray := __NEW(UINT, size);
5: myArray := __NEW(DINT, size);
6: myArray := __NEW(UDINT, size);
7: myArray := __NEW(LINT, size);
8: myArray := __NEW(ULINT, size);
9: myArray := __NEW(REAL, size);
10: myArray := __NEW(LREAL, size);
END_CASE
并按如下方式调用FB构造函数:
array : dynamicArray(_REAL);
请使用ANY数据类型(或ANY_)作为输入变量。它会给你指向变量的指针,它的大小和数据类型(如果你传递结构或fb,它只会说&;user_defined&;)如果你想比较数据类型,使用"ibaselibrary . typeclass";类型。)
如果您想将ANY变量传递给另一个函数,也要注意。ANY返回结构体:
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
…这样另一个函数将不得不接受AnyType变量而不是ANY。ANY以某种方式为编译器工作,它知道它应该用填充的AnyType结构体替换变量。
参见infosys https://infosys.beckhoff.com/english.php?content=../content/1033/tc3_plc_intro/2529388939.html&id=
PLC_ReadSymInfoByName()是为功能块做到这一点的可能性,属性'instance-path'>PLC_ReadSymInfoByName祝辞"FB_Test">
也可以用Struct来实现。ST_Real: fValue: Real;