如何在结构化文本中对变量进行分组?

How do you group variables in Structured Text?

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

lamp1
lamp2
lamp3
... // and so on

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

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

我怎样才能以某种方式对灯进行分组,而不必手动将每个变量设置为 TRUE?

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

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);

Codesys 在 Internet 的许多地方都有一个很好的例子,说明为什么在 OOP 中编程使这样的任务变得容易得多。与其将 lamp 视为变量,不如将其视为对象(即功能块)。

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

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

更正答案 :

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

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

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

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