打开子VI,多次更新,关闭

Open SubVI, update it multiple times, close it

我在 LabView 中遇到了一个任务,我认为它很简单而且很标准,但我还是没能完成它。

任务:我有一个循环获取数据的测量 VI。这可能需要一段时间,所以我想向用户显示不完整的数据集 "as it grows"。这应该在额外的 window 中完成,所以我想(需要?)使用 SubVI。 我希望此 SubVI 的前面板在测量开始时打开并在测量结束时关闭

我把它放在测量循环中,所以它会在每个新数据点被获取后被调用,并且可以显示更新的数据集。我将它设置为 "show front panel when called",因此它会在测量开始时打开(循环的第一次迭代),就像我想要的那样。但它不会关闭。如果我检查 "Close afterwards if originally closed" 它会在每次循环迭代后关闭,这非常烦人。

我还尝试使用 Invoke 节点调用 FP.OpenFP.RunFP.Close,但我不知道如何在测量循环中实际调用 SubVI 并将数据馈送到它。

我的方法是否存在普遍误解?还是有一个我没有发现的明显解决方案?

这两种方法都可行,适用于小型项目,不适合 larger/complicated 需要更精确地控制显示数据的设置。

使用第一种方法,您必须以某种方式找到对打开的 VI 的引用,以通过引用操作其前面板状态。比如说,global variable 的 VI 引用类型将起作用。 使用第二种方法,您缺少使用所有参数调用 vi 的是 Call by reference node

为了更可控的方法,我会在程序开始时启动子 VI(FP 关闭),然后将面板 open/close 和数据更新 firing custom user events 传递给子 VI 事件结构。

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

听起来好像您的子 VI 显示了您想要的数据,它只是在您卡住的正确时间关闭了前面板。在这种情况下,最简单的方法是将 VI 保持在测量循环中,选中 Show Front Panel When Called 设置,并在循环结束时使用 FP.Close 方法关闭前面板:

这意味着每次循环都将所有获取的数据传递给子 VI;如果数据量很小,这不是问题,但更具可扩展性的方法是 producer/consumer 模式,如 Joe 所建议的那样使用队列。为此:

  • 在顶层 VI 中创建队列并将引用传递给测量循环
  • 同时将队列引用传递给您的子 VI,它位于外部您的测量循环
  • 您的子 VI 包含消费者循环,它等待队列中的数据并用它更新子 VI 的显示
  • 不要设置子VI在调用时显示其前面板;在顶层 VI 中使用 FP.OpenFP.Close 方法在需要时打开和关闭其前面板。

您需要为子 VI 提供某种方式,让其知道顶级 VI 完成后何时退出;一种简便的方法是强制销毁顶层 VI 中的队列,这将导致子 VI 中的 Dequeue Element 错误退出。

另一种选择是将您的子 VI 保留在测量循环中,每次循环只向它传递新数据,但使用未初始化的移位寄存器给它一个 'memory',它在其中累积获取的数据显示的数据。在 LabVIEW 帮助中搜索 functional global variable 以获得有关此方法的更多详细信息。同样,使用顶层 VI 中的 open/close 方法来显示或隐藏前面板。