2015-09-25 170 views
0

我在LabView中遇到了一个任务问题,我认为它很简单,很标准,但是我仍然无法完成它。打开SubVI,多次更新,关闭它

任务:我有一个测量VI,在循环中获取数据。这可能需要一段时间,所以我想将不完整的数据集显示给用户“随着它的增长”。这应该在额外的窗口中完成,所以我想(需要?)使用子VI。 我想在测量开始时打开这个SubVI的前面板,并在结束时关闭

我把它放在测量循环中,所以在每个新的数据点被采用后它会被调用并且可以显示更新的数据集。我将它设置为“显示前面板时调用”,因此它会在测量开始时(循环的第一次迭代)打开,就像我想要的一样。但它并没有结束。如果我检查“以后关闭,如果最初关闭”它会在循环的每次迭代后关闭,这非常烦人。

此外,我尝试呼叫FP.Open,FP.RunFP.Close与调用节点,但我不知道如何实际调用测量循环中的子VI,并向它提供数据。

我的方法是否存在一般误解?或者有没有明显的解决办法,我没有发现?

回答

1

听起来好像你有SubVI显示你想要的数据,它只是在正确的时间关闭前面板,你卡住了。在这种情况下,最简单的方式做到这一点是保持VI在测量回路,与Show Front Panel When Called设置检查,只需使用FP.Close方法关闭时,循环结束前面板:

Use of FP.Close method (VI snippet)

这意味着你每次将所有获得的数据传递给子VI,如果数据量很小,这并不是一个问题,但更可扩展的方法是使用Joe建议的使用队列的生产者/消费者模式。要做到这一点:

  • 在顶层VI创建队列,并在您的测量回路通过参考
  • 还通过队列引用到你的子VI,它坐落您的测量回路
  • 你的子VI包含消费者循环,它等待队列中的数据并用它更新子VI的显示
  • 不要设置子VI在调用时显示其前面板;使用顶级VI中的FP.OpenFP.Close方法在需要时打开和关闭其前面板。

你需要给子VI某种方式知道什么时候你的顶层VI完成时退出;这样做的一种便捷方式是强制销毁顶层VI中的队列,这会导致子VI中的Dequeue Element以错误退出。

另一种选择是将子VI保留在测量循环中,每次循环只传递新数据,但使用未初始化的移位寄存器给它一个“内存”,在该寄存器中它累积所获取的显示数据。有关此方法的更多详细信息,请在LabVIEW帮助中查找功能全局变量。再次使用顶级VI中的打开/关闭方法来显示或隐藏前面板。

+0

谢谢你这个非常全面的答案! – mad

0

这两种方法都可行,对于小型项目来说很好,对于需要更精确地控制显示数据的更大/复杂设置而言,这并不理想。

使用第一种方法,您必须以某种方式找到对打开的VI的引用,以引用的方式操作其前面板状态。说,VI参考类型的global variable将工作。 在第二种方法中,你错过了什么调用VI的所有参数是Call by reference node

对于一个更可控的方式,我将开始在节目开始时,子VI(FP关闭),然后通信板开/关闭并通过firing custom user events将数据更新为子VI事件结构。

0

如果使用Producer/Consumer模式,则可以使用队列在数据到达另一个VI时发送数据。