首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在结构化文本中对变量进行分组?

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

Stack Overflow用户
提问于 2021-12-10 06:49:49
回答 3查看 403关注 0票数 0

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

假设我有灯具的n全局变量:

代码语言:javascript
复制
lamp1
lamp2
lamp3
... // and so on

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

代码语言:javascript
复制
IF buttonPressed Then
    lamp1 := TRUE;
    lamp2 := TRUE;
    lamp3 := TRUE;
    ... // and so on
END_IF

我怎样才能把灯分组成一种不用手动设置每一个战士的方式呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-10 08:52:30

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

代码语言:javascript
复制
VAR 
    lamp1 : BOOL;
    lamp2 : BOOL;
    lamp3 : BOOL;
    lamps : ARRAY[1..3] OF BOOL := [lamp1, lamp2, lamp3];
END_VAR

然后在for循环中设置值。

代码语言:javascript
复制
FOR i := 1 TO 3 DO
    lamps[i] := TRUE;
END_FOR

结果

函数

如果您需要做大量的工作,也可以定义一个自定义函数:

代码语言:javascript
复制
FUNCTION SetAllBools : BOOL
VAR_IN_OUT
    bools : BOOL;
END_VAR
VAR_INPUT
    newValue : BOOL;
END_VAR
VAR
    i : INT;
END_VAR

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

票数 0
EN

Stack Overflow用户

发布于 2021-12-10 18:25:47

Codesys有一个很好的例子,就是在互联网上许多地方,为什么用OOP编程使这样的任务变得容易得多。不要把灯看作变量,而是把它看作一个对象(即函数块)。

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

然后,您可以创建ILamp类型的数组,并且可以将lamp对象放在该数组中。在那里,您可以像Roald的答案那样在数组中进行交互。但是我更喜欢创建一个也实现了AllLamps的主ILamp对象。然后,当您调用AllLamps.TurnOn()时,AllLamps会被编程来迭代所有照明灯对象并调用TurnOn。

票数 1
EN

Stack Overflow用户

发布于 2021-12-13 13:36:53

纠正@Roald的答案

如果您想要的是修改原始值,而不是修改数组中的副本,那么首先使用一个数组:

代码语言:javascript
复制
VAR 
    // lamp1 : BOOL; lamp2 : BOOL; lamp3 : BOOL;
    lamps : ARRAY[1..3] OF BOOL; // use "lamps[1]" instead of "lamp1" everywhere
END_VAR

或者,与其向数组添加副本,不如添加它们的指针:

代码语言:javascript
复制
VAR 
    lamp1 : BOOL;
    lamp2 : BOOL;
    lamp3 : BOOL;
    lamps : ARRAY[1..3] OF POINTER TO BOOL := [ADR(lamp1), ADR(lamp2), ADR(lamp3)];
END_VAR

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

代码语言:javascript
复制
FOR i := 1 TO 3 DO
    lamps[i]^ := TRUE;
END_FOR
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70300715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档