2

我有一个数字控件(不是指示器)和一个 for 循环(限制 5)

我需要在数值控件中显示[当前循环索引+数值控件中的值]。我是LabVIEW的新手。有什么想法吗?

4

5 回答 5

3

您是否有任何特定原因需要经常更新控件?
如果需要定期更新,最好将其更改为指标。
如果您更新一个控件,用户通常会觉得他不在“控制”中。

于 2010-09-18T11:50:57.327 回答
3

要将值写入控件,您需要从中创建一个局部变量(右键单击程序框图上控件的接线端并选择创建 > 局部变量)。要让它更新 For 循环的每次迭代,请将局部变量终端放在 For 循环内,并将您想要显示的任何内容连接到该终端。我不确定这是否会是一个好的用户界面设计,但它是您问题的答案。

您还可以使用局部变量从程序框图中的多个位置写入指标,并从指标或控件中读取。对于任何给定的控件或指示器,您可以有多个局部变量接线端。每个局部变量终端要么用于读取,要么用于写入 - 右键单击​​局部变量并选择 Change to Read 或 Change to Write。

您应该小心使用局部变量来传递数据,因为当您通过线路传递数据时,程序流将不再受数据流控制,这可能会给您带来不可预测的行为(竞争条件)。如果读者只需要在执行时知道当前值,则可以在一个地方写入并在多个地方读取是可以的,从多个地方写入指标也是如此.

于 2010-09-17T13:37:10.733 回答
2

如前所述,您可以使用局部变量和属性节点来设置控件或指标的值。如果您尝试持久化数据,则有更好的方法。

谷歌“功能全局”或“labview 2 风格全局”。基本模式是使用硬编码的 while 循环在一次迭代后停止。添加一个未初始化的移位寄存器。在循环内添加一个案例结构。使用控件(布尔值、枚举或字符串)在案例结构上进行选择。在 VI 上放置相同数据类型的控件/指示器对。将指示器连接到环路外部的右移位器的外部输出。将控件置于“设置”(通常为真,非默认)情况下的循环内,并将其从情况下连接到右移位器的输入。转到其他空箱并将左移位器的内部输出通过箱连接到连接到内部输入的端子。

因为您没有连接左移位器的外部输入,所以它是一个“未初始化的移位寄存器”。它将保留上次调用 VI 的数据。这就像在 ac 函数的堆上声明一个变量,并在下一次函数调用时为您提供最后一个赋值。

三个主要好处是保持数据流、线程安全和性能。您可以通过向 VI 添加错误 IO 来获得数据流。确保线程安全,因为 VI 的执行保证是原子的。性能得到改善,因为 LV 数据希望在线传输。每次将数据写入控件的属性节点时,LV 运行时都会将该数据写入 UI 线程。我认为本地人也有类似的基于线程的性能影响,但我不确定。


根据第一条评论...

为了您的利益,从链接复制到此处(是的,读者先生)。问题:我正在考虑使用局部或全局变量;变量在哪个线程中执行?

解决方案:一个常见的误解是局部和全局变量操作在 UI 线程中执行,或者需要线程交换到 UI 线程——这是不正确的。下面描述局部和全局变量写入和读取操作的行为:

写入:写入局部或全局变量时,LabVIEW不会立即切换到用户界面线程。LabVIEW 将值写入传输缓冲区,这是一个受保护的内存区域。用户界面在下一个预定更新时间更新。在单个线程切换或用户界面更新发生之前,可以多次更新变量。这是可能的,因为变量仅在执行线程中运行。

读取:当您从一个局部或全局变量中读取时,该操作将发生在VI执行的线程中,因此,您可以通过将VI属性中的执行系统设置为标准来确定它不会发生在UI线程中。有一种线程保护机制可确保在您读取数据时没有全局写入者更改数据,但这是通过互斥体完成的,而不是通过转到 UI 线程。但是,如果打开了全局变量面板,则会发布消息重绘全局控件,并且重绘将发生在 UI 线程中。


nekomatic 是正确的。当您写入本地时不会发生线程交换。

于 2010-09-24T17:13:41.817 回答
1

我同意吨。如果您正在以编程方式更改控件的值,那么您应该考虑它是否应该是一个指标,或者可能具有该控件的伪指标。

发布代码的独立版本是个好主意,这样我们就可以了解到底发生了什么。

于 2010-09-19T15:13:27.123 回答
1

如果您想维护数据流以控制程序流,则可以改为使用控件的属性节点并设置“值”属性。

要创建属性节点,请右键单击程序框图上的控件终端,然后选择创建 » 属性节点 » 值。现在,您可以通过使用错误线来控制程序的流程,从而坚持数据流编程。

再次强调 Ton 的观点 - 如果您要经常更改控件的值,则可能值得将其更改为指标。

于 2010-09-20T15:29:32.267 回答