【问题标题】:Symbolic adressing of array elements数组元素的符号寻址
【发布时间】:2018-04-16 18:08:22
【问题描述】:

我有一个对象数组,比如说 MyArray[1..x] 的对象。

在编程时,我希望有一种更“可读”的方式来寻址每个对象。而不是说MyArray[1] := ...etc。我想说MyReadableName :=...

我查看了引用,但我有点担心整个指针的东西。我怎样才能以一种好的方式做到这一点并支持在线更改?我应该把引用的声明和分配放在哪里,可能有好几百个,我不想在在线模式下弄乱主 VAR 窗口?

我看到的另一件事是有一个具有可读名称的枚举并将其用作数组的索引。然后查找是MyArray[Enum.MyReadableName] :=..。但我不确定这是否是一个好的解决方案。

非常欢迎任何解决方案或提示!谢谢!

【问题讨论】:

    标签: arrays enums st iec61131-3 structured-text


    【解决方案1】:

    您已经提到了所有可能的方法。

    指针

    你不应该担心他们。指针不是 IEC-61131 的一部分,因此它的实现因制造商而异。如果您提及您正在使用的 IDE 以及数组元素的结构,那就太好了。

    我处理此类任务的最佳方式是创建 ACTION,然后将所有变量映射到数组或数组外。我只在 PLC 负载时运行此任务一次并将此操作称为映射。

    VAR
        aA: ARRAY [1..2] OF StructureName;
        stMyName1: POINTER TO StructureName;
        stMyName2: POINTER TO StructureName;
        xInit: BOOL;
    END_VAR
    
    ACTION actMap
        stMyName1 := ADR(aA[1]);
        stMyName2 := ADR(aA[2]);
    END_ACTION
    
    IF NOT xInit THEN
        actMap();
        xInit := TRUE;
    END_IF
    

    但通常,在 IDE 中创建操作的方式不同,而不是使用 ACTION 关键字。在 Codesys 中右键单击 POU。

    我会选择指针,因为这是不合逻辑的方式。它需要更多的应用程序设置,但后来节省了编码时间。

    枚举

    你描述的这个。在 Codesys 中,您应该使用 #,如 Color#red。但是,如果您使名称唯一,则可以在没有枚举名称的情况下使用它们。此外,如果您将数组的名称设为短名称,它可能看起来像 a[MyArrayName] 这样的信息丰富。

    【讨论】:

    • 其实第三种方式是使用引用,而不是指针。如果可能的话,我会建议。据我所知,它们使用起来更安全,如果它们有效,也可以使用__ISVALIDREF 来检查引用。但是如果您记得每个周期或至少不时地初始化它们,那么指针自然也可以工作。如果仅在 PLC 启动时分配指针,则可能导致在线更改后的 PLC 异常。
    • @Quirzo 指针是参考。这是相同的 tерштпю在 ST 中没有其他方法可以创建引用。
    • 嗯,是的,REFERENCE 在窗帘后面使用指针。但是对于程序员来说,它不是指针。使用引用时,您不需要 ^ 来访问变量(必须使用指针)。此外,您还可以通过__ISVALIDREF 函数检查有效性。更多信息:Beckhoff
    • 谢谢你们。参考文献是否在在线更改时自动更新?如果它们不再有效,或者就在第一次使用之前,引用是否设置为 0?我再等几天,然后我会选择你的答案 Sergey。
    • @krakers 引用不在线。我的意思是他们在线,但这是不正确的术语。当您创建point to 时,您的变量引用变量的相同内存位置,作为原始变量。就像您有 2 个变量但实际上指向相同的值。
    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 2010-11-17
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多