【问题标题】:Initialize Array of Custom Types in Structured Text Syntax在结构化文本语法中初始化自定义类型数组
【发布时间】:2019-02-01 15:06:52
【问题描述】:

在我的项目中,我有一个类似的类型:

TYPE myDataStruct :
STRUCT
    A : UINT;
    B : WORD;
    C : REAL;
    D : Custom_Obj;
END_STRUCT
END_TYPE

我需要为持久内存保留一个这种类型的数组。我不能只使用VAR RETAIN,因为这块特定的内存需要通过下载持续存在。我正在使用的控制器有办法做到这一点,但为了让它工作,我需要能够将数组设置为等于初始值。所以如果我声明了

myarray := ARRAY[0..20] OF myDataStruct;

然后如何将此数组初始化为空白数组? new 在其他语言中的等价物是什么?

我猜到了

myarray := [21(A := 0,
               B := '',
               C := 0.0,
               D := ??? )];

但这似乎不对。如果只有一层深度的自定义结构,它可以被简化,对于这个应用程序,我可以做到这一点。但是,我仍然认为我的语法不正确。

【问题讨论】:

  • 你得到答案了吗?

标签: plc st codesys


【解决方案1】:

new 在其他语言中的等价物是什么?

这个类比是

VAR
    EmptyArray  : ARRAY[0..20] OF myDataStruct;
END_VAR

如果你想用默认值预填充它

VAR
    EmptyArray  : ARRAY[0..20] OF myDataStruct := [
        (A := 100, B := 200, С := 0.0, D := ???),
        (A := 34, B := 45, С := 0.1, D := ???),
        ..... etc
    ];
END_VAR

对于 CoDeSys 2.3,删除 []

你要明白EmptyArray不是你需要的数据原型,而是已经初始化的变量。

【讨论】:

    【解决方案2】:

    无法以"x = new struct()" 方式对其进行初始化。据我所知,您也不能在代码中使用 myarray = [1, 2, 3] etc 之类的东西分配整个数组。

    如果你只想用 0、'' 等值将其设置为空,那么我会使用两种方法:

    1.使用MEMSET函数将所有字节设置为0

    Link to the online help

    //Something like
    MemSet(
        pbyBuffer   := ADR(myarray),    //Address of the variable
        byValue     := 0,               //Byte that address is filled with
        dwSize      := SIZEOF(myarray)  //How many bytes? (variable size)
    )
    

    2。创建一个虚拟变量并将其分配给myarray

    变量总是初始化为零,所以 EmptyArray 的值都是 0/empty 等等。

    VAR
        EmptyArray  : ARRAY[0..20] OF myDataStruct;
    END_VAR
    
    //In the code
    myarray := EmptyArray;
    

    希望我正确理解了您的问题。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      相关资源
      最近更新 更多