0

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

lamp1
lamp2
lamp3
... // and so on

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

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

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

4

3 回答 3

1

Codesys 有一个很好的例子,在互联网上的许多地方,为什么用 OOP 编程可以让这样的任务变得更容易。与其将灯视为变量,不如将其视为对象(即功能块)。

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

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

于 2021-12-10T18:25:47.293 回答
0

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

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

于 2021-12-10T08:52:30.013 回答
0

要纠正@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
于 2021-12-13T13:36:53.047 回答