如何将变量类型作为参数传递给 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
  • 在这方法中,我将传递给参数 typeOfVariable 示例 REAL 并且该方法将创建 REAL 变量数组 尺寸 1
  • 我需要知道我声明的 type 是什么 typeOfVariable 以便它可以存储 关于另一个变量的 type 的数据。

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

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

这是它的代码

myArray := __NEW(REAL,10); //Create array with type REAL variables with the size of 10

解决方法

好的,这是一个如何解决这个问题的小例子:

首先创建一个枚举:

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

检查空指针并记住当您不再需要数组时__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,_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);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...