如何在结构化文本中对变量进行分组?
假设我有n 个用于灯的全局变量:
lamp1
lamp2
lamp3
... // and so on
然后我有一个按钮,按下它应该将所有变量设置为 TRUE:
IF buttonPressed Then
lamp1 := TRUE;
lamp2 := TRUE;
lamp3 := TRUE;
... // and so on
END_IF
如何以不必手动将每个变量设置为 TRUE 的方式对灯进行分组?
如何在结构化文本中对变量进行分组?
假设我有n 个用于灯的全局变量:
lamp1
lamp2
lamp3
... // and so on
然后我有一个按钮,按下它应该将所有变量设置为 TRUE:
IF buttonPressed Then
lamp1 := TRUE;
lamp2 := TRUE;
lamp3 := TRUE;
... // and so on
END_IF
如何以不必手动将每个变量设置为 TRUE 的方式对灯进行分组?
Codesys 有一个很好的例子,在互联网上的许多地方,为什么用 OOP 编程可以让这样的任务变得更容易。与其将灯视为变量,不如将其视为对象(即功能块)。
创建一个名为 ILamp 的接口,并有两个方法:TurnOn 和 TurnOff。然后创建一个名为 FbLamp 的 FB,它实现了 ILamp。
然后,您可以创建 ILamp 类型的数组,并将您的灯对象放入该数组中。从那里您可以像 Roald 的回答一样遍历数组。但我更喜欢创建一个也实现 ILamp 的主 AllLamps 对象。然后,当您调用 AllLamps.TurnOn() 时,AllLamps 被编程为遍历所有 Lamp 对象并调用 TurnOn。
要一次设置多个变量,您首先必须收集要在数组中设置的值:
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);
.
要纠正@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