我有一个复杂的GUI,包含许多控制和子VI。我将控件的值传递给子VI,当我需要更改控件的某些属性(即禁用它们)时,我传递了引用。
我的方块图太大了。所以我想使用全局变量。然后我可以将子VI显示为图标并在图表上节省大量空间(我的子VI有很多输入)。
但是我应该怎么做我想要更改其属性的控件(现在我传递对它们的引用而不仅仅是值)?当我使用全局变量时,我只能得到它的值,仅此而已。
我可以创建对所有控件的全局引用,并在我的子VI中使用它们,但是子VI很不清楚,我想避免它。
那么如何在Labview中创建全局控件?
编辑:我有一个名为" Motor ID"在我的主要VI中。当我想在子VI中连接到电机时,我传递一个对该控件的引用。在子VI中,我使用属性"禁用"如果已建立连接,则禁用该控件。
当我使用全局变量来保存电机ID时,我所能做的就是获取电机ID并连接电机。但是我无法在主VI中禁用控制。
答案 0 :(得分:2)
我会说你有几种选择,不幸的是,所有这些选项都可能需要对你的代码进行重大的重组,因此需要很多时间。其他人已经说过其中两个,但我会在这里重复。
深入了解每个选项......
使用全局引用只是意味着您将对所有控件的引用存储到它们自己的全局变量中,然后在VI中调用它们。使用全局引用,您可以修改任何属性,获取或设置值,实质上控制VI,就好像您可以从该VI访问前面板而无需通过输入节点传递引用。这可能会造成初始化的混乱,并且需要您为每个控件创建引用,但是它的功能和可读性可能是值得的。
将数据组织到集群中总是会在程序框图上看起来更好,我鼓励尽可能地做到这一点。始终寻找将数据放入集群的机会。但请注意,因为如果将群集传递到子vi中,则将所有数据从群集传递到子vi中,如果您有占用大量内存的项目,则会降低程序的速度。它们对于组织和清理图表非常有用,但请注意如何将它们传递给您的程序。
子面板基本上允许你有一个中央前面板,并在你想要的时候换掉VI。您可以通过调用节点来控制VI的执行,并通过将其引用传递给图上的子面板块来选择子面板中显示的VI。如果您有多个独立的操作并不是一次都必须显示,那么这非常有用。
X-Controls类似于子面板,除了冷却器。 X-Control本质上是一个集群和子面板的组合,可以放在前面板上。它在程序框图中表示为常规控件,但数据操作和处理在内部事件结构中独立处理。 X-Controls可能会有些混乱,如果使用不当,实际上可能会使代码复杂化,而不是清理它。在尝试将它们集成到代码中之前,请确保完全理解它们的行为。
如果您可以将代码划分为多个窗口,则可以使用控制VI来运行状态机,该状态机确定向用户显示哪个窗口。该方法与子面板方法密切相关。所有VI使用的任何数据都可以存储到全局变量中,并且可能与下面提到的CVT API一起使用。
我对CVT(当前值表)API没有多少经验,但我知道如果正确使用它会相当强大。从本质上讲,CVT允许您将所有值存储到全局变量中,但是您可以使用键来访问它们,而不是将全局变量放到图表上。键是在创建时分配给全局的字符串。 (它们可以在运行时创建,不必事先分配!)
除上述建议外,最快的实施方法是使用事件循环,根据需要响应前面板活动。创建表示数据所需的所有全局变量,并根据需要在VI中使用它们以删除输入。如果用户更新具有关联全局的前面板项,则更新全局。小心避免竞争条件,并尽可能尝试从一个位置写入全局变量(CVT库有助于避免竞争条件,因为它使用功能全局变量)。在并行循环中,从关联的全局变量中更新指标。
总之,有很多方法可以清理您的程序框图和前面板,但一般来说,最好考虑从一开始就以避免混乱的方式构建代码!
答案 1 :(得分:1)
根据您的评论,我会说您无法使用全局变量更改控件/指标的属性。
请记住,Globals仅传输控件的VALUE,而不是与之关联的属性。您必须将控制引用传递给子VI才能更改FP上的控件属性。
我建议您将所有控件分组到一个群集中,创建该群集的引用并将一个引用传递给子VI以避免代码复杂化。或者,您可以将控件的所有引用分组到集群中,并将一条线传递给子VI。
希望这会有所帮助。
答案 2 :(得分:0)
您可能只想调查子面板。顶级VI上的子面板是一个托管子VI面板的控件。您可以打开子VI的VI引用并将其面板放在子面板控件中。然后子VI必须更新自己面板上的控件......不涉及控件引用。