如何在结构化文本中对变量进行分组?
假设我有灯具的n全局变量:
lamp1
lamp2
lamp3
... // and so on然后我有一个按钮,按下它应该将所有变量设置为TRUE:
IF buttonPressed Then
lamp1 := TRUE;
lamp2 := TRUE;
lamp3 := TRUE;
... // and so on
END_IF我怎样才能把灯分组成一种不用手动设置每一个战士的方式呢?
发布于 2021-12-10 08:52:30
要同时设置多个变量,首先必须收集要在数组中设置的值:
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-10 18:25:47
Codesys有一个很好的例子,就是在互联网上许多地方,为什么用OOP编程使这样的任务变得容易得多。不要把灯看作变量,而是把它看作一个对象(即函数块)。
创建一个名为ILamp的接口,并有两个方法: TurnOn和TurnOff。然后创建一个名为FbLamp的FB来实现ILamp。
然后,您可以创建ILamp类型的数组,并且可以将lamp对象放在该数组中。在那里,您可以像Roald的答案那样在数组中进行交互。但是我更喜欢创建一个也实现了AllLamps的主ILamp对象。然后,当您调用AllLamps.TurnOn()时,AllLamps会被编程来迭代所有照明灯对象并调用TurnOn。
发布于 2021-12-13 13:36:53
纠正@Roald的答案
如果您想要的是修改原始值,而不是修改数组中的副本,那么首先使用一个数组:
VAR
// lamp1 : BOOL; lamp2 : BOOL; lamp3 : BOOL;
lamps : ARRAY[1..3] OF BOOL; // use "lamps[1]" instead of "lamp1" everywhere
END_VAR或者,与其向数组添加副本,不如添加它们的指针:
VAR
lamp1 : BOOL;
lamp2 : BOOL;
lamp3 : BOOL;
lamps : ARRAY[1..3] OF POINTER TO BOOL := [ADR(lamp1), ADR(lamp2), ADR(lamp3)];
END_VAR这样,如果您修改数组中的任何值,原始值也会发生变化(尽管不要忘记在修改数组元素时使用^来取消引用!):
FOR i := 1 TO 3 DO
lamps[i]^ := TRUE;
END_FORhttps://stackoverflow.com/questions/70300715
复制相似问题