如何在LabVIEW中显示控件中的数据

时间:2010-09-17 12:11:23

标签: labview

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

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

5 个答案:

答案 0 :(得分:3)

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

您还可以使用局部变量从程序框图中的多个位置写入指标,并从指标或控件中读取。对于任何给定的控件或指示器,您可以有多个局部变量终端。每个局部变量终端用于读取或写入 - 右键单击​​局部变量,然后选择“更改为读取”或“更改为写入”。

使用局部变量传递数据时应该小心,因为当您沿着线路传递数据时,程序流将不再受数据流控制,这可能会给您带来不可预测的行为(竞争条件)。如果读者只需要在执行时知道当前值,那么在一个地方写入并在多个地方读书是可以的,因此从多个地方写入指示符,其中指示符仅用于向用户显示信息

答案 1 :(得分:3)

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

答案 2 :(得分:2)

如上所述,您可以使用局部变量和proerty节点来设置控件或指标的值。如果您尝试保留数据,则有更好的方法。

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

因为你没有连接左移位器的输出端,它是一个“单位移位寄存器”。它将保留最后一次调用VI的数据。这就像在c函数中声明堆上的变量,并在下一个函数调用时为您提供最后一个赋值。

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


根据第一条评论......

从链接复制到您的利益(是的,读者先生)。 问题: 我正在考虑使用本地或全局变量;变量在什么线程中执行?

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

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

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


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

答案 3 :(得分:1)

我同意Ton。如果要以编程方式更改控件的值,则应考虑它是否应该是指示符,或者可能具有控件的伪指示符。

发布代码的隔离版本是个好主意,这样我们才能理解究竟发生了什么。

答案 4 :(得分:1)

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

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

再一次,重新强调Ton的观点 - 如果你要经常更改控件的值,可能值得将其改为指示器。