如何将变量类型作为参数传递到IEC61131-3结构化文本(TwinCAT3)中的函数?



这就是我想要的(这是一个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
  • 在这个方法中,我将传递给参数typeOfVariablefor以REAL为例,该方法将创建REAL变量数组size1.
  • 我需要知道我声明的type是什么typeOfVariable,所以它可以存储
  • 其他变量type的数据。

  • 工作示例是动态创建数组的__NEW()方法

  • 这个方法接受一个参数,如REALINT

这是它的代码:

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;

最新更新