【问题标题】:How do you group variables in Structured Text?如何在结构化文本中对变量进行分组?
【发布时间】:2021-12-10 06:49:49
【问题描述】:

如何对结构化文本中的变量进行分组?
假设我有 n 个用于灯的全局变量:

lamp1
lamp2
lamp3
... // and so on

然后我有一个按钮,按下它应该将所有变量设置为 TRUE:

IF buttonPressed Then
    lamp1 := TRUE;
    lamp2 := TRUE;
    lamp3 := TRUE;
    ... // and so on
END_IF

如何以不必手动将每个变量设置为 TRUE 的方式对灯进行分组?

【问题讨论】:

  • 嗨,李凯,欢迎来到 StackOverflow!您可以通过将代码放在三引号 ``` 之间来格式化代码,例如,请参阅 here。你的标题可以改进一点。如果我正确理解了这个问题,也许更好的标题是“如何使用结构化文本中的单个命令为多个变量设置相同的值?”。

标签: codesys structured-text


【解决方案1】:

Codesys 在互联网上的许多地方都有一个很好的例子,说明为什么在 OOP 中编程使这样的任务变得更容易。不要将灯视为变量,而应将其视为对象(即功能块)。

创建一个名为 ILamp 的接口,并有两个方法:TurnOn 和 TurnOff。然后创建一个名为 FbLamp 的 FB,它实现了 ILamp。

然后您可以创建 ILamp 类型的数组,并将您的灯对象放入该数组中。从那里您可以像 Roald 的回答一样对数组进行交互。但我更喜欢创建一个也实现 ILamp 的主 AllLamps 对象。然后,当您调用 AllLamps.TurnOn() 时,AllLamps 会被编程为遍历所有 Lamp 对象并调用 TurnOn。

【讨论】:

    【解决方案2】:

    要一次设置多个变量,您首先必须将要设置的值收集到一个数组中:

    VAR 
        lamp1 : BOOL;
        lamp2 : BOOL;
        lamp3 : BOOL;
        lamps : ARRAY[1..3] OF BOOL := [lamp1, lamp2, lamp3];
    END_VAR
    

    然后在 for 循环中设置值。

    FOR i := 1 TO 3 DO
        lamps[i] := TRUE;
    END_FOR
    

    结果

    功能

    如果你需要做很多,你也可以定义一个自定义函数:

    FUNCTION SetAllBools : BOOL
    VAR_IN_OUT
        bools : BOOL;
    END_VAR
    VAR_INPUT
        newValue : BOOL;
    END_VAR
    VAR
        i : INT;
    END_VAR
    

    然后可以用作SetAllBool(lamps, TRUE);

    【讨论】:

      【解决方案3】:

      更正@Roald的答案:

      如果您想要修改原始值而不是 ARRAY 中的副本,则可以使用数组开头:

      VAR 
          // lamp1 : BOOL; lamp2 : BOOL; lamp3 : BOOL;
          lamps : ARRAY[1..3] OF BOOL; // use "lamps[1]" instead of "lamp1" everywhere
      END_VAR
      

      或者不向 ARRAY 添加副本,而是添加它们的 POINTER:

      VAR 
          lamp1 : BOOL;
          lamp2 : BOOL;
          lamp3 : BOOL;
          lamps : ARRAY[1..3] OF POINTER TO BOOL := [ADR(lamp1), ADR(lamp2), ADR(lamp3)];
      END_VAR
      

      这样,如果您修改 ARRAY 中的任何值,原始值也会更改(尽管在修改 ARRAY 元素时不要忘记使用 ^ 取消引用!):

      FOR i := 1 TO 3 DO
          lamps[i]^ := TRUE;
      END_FOR
      

      【讨论】:

        猜你喜欢
        • 2022-12-06
        • 2021-12-01
        • 2017-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        相关资源
        最近更新 更多