我如何在子 vi 中触发值更改事件,该事件引用了可能的更改值?

How can I trigger a value change event in a subvi, that has a reference to the possible changing value?

我有一个 subvi,它接收两个对路径的引用作为输入。 subvi 执行它的操作并根据第一个路径更改第二个路径的值。 (它添加了一个用户选择的文件夹)可以将第一个路径引用视为真正的输入,将第二个路径引用视为输出。 (想想 C:将指针传递给函数应该修改的东西而不是返回值)

假设我插入一个根目录,vi 将子目录写入第二个路径引用。

"/" -> subvi -> "/subdirectory/"

这很好用。

现在我想将其中两个子可视化链接在一起,以便用户可以选择文件夹结构的两层,如下所示:

"/" -> subvi1 -> "/subdirectory/" -> subvi2 -> "/subdirectory/subsubdirectory/"

明确一点:这是同一个子 vi,在子面板的同一个主 vi 中使用了两次。

链式 vis 未按预期工作。 每个 subvi 注册第一个路径引用的值更改事件。我这样做的动机是通知 subvi 的任何后续实例其根路径的值已更改。

在 subvi1 中所做的更改应反映在 subvi2 中,以便 subvi2 在 subvi1 中选择的路径上运行。 永远不会触发更改事件。 并且不会反映 subvi1 中的更改。

这是因为我有路径 references 作为输入吗?向它们添加值更改事件将意味着引用必须更改才能触发它,但事实并非如此。如果是这样,如何将更改事件添加到引用所引用的内容而不是引用本身?

我是否通过引用使它过于复杂了? 我应该只使用路径而不是对路径的引用吗?

请看下图,它显示了如何创建两个子可视化并将其推入子面板。

还有更多信息,希望对您有所帮助。

每个子 vi 只是为它接收到的第一个路径引用的更改事件添加一个 case。

Use Value (Signalling) when setting your value by reference. This change of value will generate a value change event. And writes its results via value(signalling) to the second reference. I have the suspicion that this is where the problem is, because it changes the value of what's referenced, not the reference itself.

永远不会执行值更改事件。

LabVIEW doesn't have reference to paths. I assume you mean a reference to a path control (which also tracks with the value change event you're talking about).

好的,我误用了术语。对于任何混淆,我深表歉意。是的,我的意思是对路径控件的引用。

If you do need to pass things as messages (for instance, if you have parallel processes), I would suggest using other mechanisms, like user events, rather than value change events. VC events work, but they're designed for UI use. Using them programmatically can make your code convoluted.

我确实需要并行执行此操作,因为我有 2 个 subvis。这是怎么回事?我传递了对即将更改的内容的引用,仅此而已。 If the information should go the other way, from main, to subvi, the suggested solution from national instruments is also to pass a reference as can be seen in this tutorial.

you're only registering for the event after it already happened

我不确定这是怎么回事,因为两个 subvi 都存在于 main 中。我可以反复点击它们,这应该会反复触发更改事件。

LabVIEW 没有引用路径。我假设您的意思是对路径控件的引用(它还跟踪您正在谈论的值更改事件)。我肯定会说直接使用路径更好。利用 LV 不需要从一个函数传递对 return 多个值的引用这种丑陋的技巧。如果可以的话,按价值在数据流中往往会更好地工作。如果您确实需要将事物作为消息传递(例如,如果您有并行进程),我建议使用其他机制,如用户事件,而不是值更改事件。 VC 事件有效,但它们是为 UI 使用而设计的。以编程方式使用它们会使您的代码变得复杂。

就是说,如果没有代码就无法准确说明您的问题是什么,但根据您的描述,我的最佳猜测是您只是在事件已经发生后才注册,因此不会将其添加到队列中第二个VI的,但是这只是一个猜测,因为你的描述不是很清楚。

一般来说,解决这些问题的更好地方是 NI 论坛(如果这对您和您 post 没有帮助,您肯定会希望包含代码)。

最后一点,您没有注册引用的值更改。将引用连接到 register 节点将始终为您提供用于注册引用指向的对象(在本例中为路径控件)的事件的选项。

通过引用设置值时使用 Value (Signalling)。此值更改将生成值更改事件。

然而,总的来说,这对我来说似乎是一个奇怪的架构,虽然没有看到代码和要求,但很难说出来。

据我所知,您的代码中存在竞争条件 - 您并行启动 VI,因此无法确定它们 运行 的顺序,并且可能会更新在另一个人注册之前。

正如您的文字所暗示的,这是假设它甚至是两个独立的 VI。看你的图像我猜它是同一个 VI,在那种情况下,VI 不能 运行 并行,因为你使用的是静态引用,所以即使 VI 是可重入的,你也会得到相同的实例。如果您只是获取 VI 并使用不同的名称创建它的副本,我建议您阅读可重入 VI 以及如何动态启动它们。