【问题标题】:How to Display Data in a Control in LabVIEW如何在 LabVIEW 中显示控件中的数据
【发布时间】:2010-09-17 12:11:22
【问题描述】:

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

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

【问题讨论】:

    标签: labview


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • @Ton:它只是为了学习......我认为没有办法在控件上显示数据。
      【解决方案3】:

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

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

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

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


      根据第一条评论...

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

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

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

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


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

      【讨论】:

      • 本地人不会强制切换到 UI 线程 - 请参阅 digital.ni.com/public.nsf/allkb/… 。赞成对函数全局变量的一个很好的解释!
      • @nekomatic 感谢您的 +1。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 您可能希望避免使用 Value 属性节点,因为它们具有一些不太明显的性能影响。例如,请参阅forums.ni.com/t5/LabVIEW/local-vs-property-node/m-p/321755
        • 这只是“维护数据流”,因为您可以在属性节点写入后强制执行同一 VI 中的下一个操作。它不会影响读取该控件的代码是获取您刚刚编写的值还是旧值 - 这是不确定的。始终检查您是否可以使用更好的解决方案,例如通知器或队列,而不是值属性节点。
        • ...我想您可以使用 Value (Signaling) 属性并在控件的值更改时触发一个事件,但是您只是在重新发明通知器,只是性能更差。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2011-04-02
        • 2022-01-24
        • 1970-01-01
        • 2021-01-31
        • 2022-12-05
        • 1970-01-01
        相关资源
        最近更新 更多