使用一个停止按钮停止LabVIEW中的并行While循环

更新 Nov 3, 2023

环境

软件

  • LabVIEW Full

我在LabVIEW中有多个并行的while循环,我想使用一个停止按钮来停止所有循环。我该如何做,还要使停止按钮恢复到初始状态?

根据所使用的LabVIEW版本,从以下方法中进行选择,用以使用一个停止按钮停止LabVIEW中的多个并行While循环。

注意:下面列出的方法并不是停止并行While循环的方法的详尽介绍。这些方法是最常见的方法。
  • 通道线

如使用LabVIEW 2016,可使用通道线通过一个停止按钮停止多个并行的While循环。这是可能的,因为通道线是异步线,它们在不强制执行顺序的情况下连接两个并行的While循环。因此,两个并行的While循环之间没有数据相关性。

注意: LabVIEW Real-Time模块支持通道线,但LabVIEW FPGA模块不支持。

以下框图演示了使用Tag通道停止并行While循环:

以下列表描述了有关上图程序框图的重要细节:

  1. 循环A包含一个Tag写入端点,该端点将值写入Tag通道。
  2. 通道线将Tag写入端点的通道输出连接到Tag读取端点。
  3. 循环B包含一个Tag读取端点,该端点从Tag通道读取值。
  4. 连接到循环A中写入端点的元素参数的停止按钮与循环B通信。如果单击循环A中的停止按钮,循环B也将停止。

以下框图演示了使用串流通道停止并行While循环:

当使用串流通道,连接到在循环A中的作家端点的最后一个元素参数停止按钮与循环B通信。

当用于停止并行While循环时, Tag通道和串流通道具有主要区别。

  • 使用Tag通道停止并行While循环会导致所有循环尽快停止,因为循环A中的停止按钮值直接与循环B通信。使用串流通道停止并行While循环可能导致循环B循环A早停止若干次迭代因为从循环A中的停止按钮值与通过循环B最后一个元素?参数进行通信,这意味着循环A在写入最后一个元素后立即停止。但是,循环B继续读取通道中的其余元素,直到读取完最后一个元素,它才会停止。所谓串流通道确保通过该通道传送的所有数据元素循环B停止之前得到处理。
  • Tag通道允许您停止两个或更多并行的While循环,因为Tag通道可以分叉到多个编写器和读取器中。串流通道仅允许您停止两个并行的While循环,因为串流通道仅允许一个写入器和一个读取器。
下面的框图演示了如何使用Tag通道停止三个并行的While循环。

警告

您不能将以前的Tag架构扩展为具有多个停止按钮。但是,您可以使用labview\vi.lib\ChannelSupport的“Share Stop Signal” VI添加一个或多个停止按钮,使用任意一个停止按钮可以停止多个并行的While循环。

以下VI片段演示了使用两个停止按钮之一来停止多个并行的While循环。要添加更多停止按钮,请遵循相同的体系结构。


 

  • 局部变量

您可以使用一个停止按钮停止多个并行的While循环,方法是使用每个其他循环的局部变量,将第一个循环控件中的布尔停止按钮值传递给所有其他循环。下面的程序框图演示了使用局部变量停止两个并行的While循环。

以下列表描述了有关上图程序框图的重要细节

  1. 顶部循环包含一个停止控件。通过右键单击前面板上的停止控件并选择“机械动作»单击时转换” ,配置停止控件的机械动作。这允许所有循环读取停止布尔值,当按下该值时,锁存器将在读取值时重置为真,从而使某些循环仍在运行。
  2. 底部的两个循环包含停止控件的局部变量。通过右键单击停止控件并选择创建»局部变量来创建局部变量。通过右键单击局部变量并选择“转换为读取”,将局部变量配置为读取值
  3. 重要的是要注意“ Reinit To Default”调用节点是隐式地引用了停止按钮这将在下一次运行开始时将值重置为真。
  4. 所有这些循环都包含一个等待(ms),以突出显示所有循环都将停止,而不论它们的运行时间如何。

要停止三个以上的并行While循环,请遵循相同的体系结构,添加更多局部变量以从初始停止控件中读取。
 

  • 属性节点

您可以使用属性节点将布尔型停止按钮值从第一个循环的控件传递到所有其他循环。下面的框图演示了使用属性节点停止两个并行的While循环。

以下列表描述了有关先前框图的重要细节:

  1. 顶部循环包含一个停止控件。通过右键单击前面板上的停止控件并选择“机械动作»单击时转换” ,配置停止控件的机械动作。这允许所有循环读取停止布尔值,当按下该值时,锁存器将在读取值时重置为真,从而使某些循环仍在运行。
  2. 底部循环包含停止控件的属性节点。通过右键单击停止控件并选择创建»属性节点»值来创建属性节点。通过右键单击值属性节点并选择“转换为读取”,将值属性节点配置为读取值。
  3. 重要的是要注意“ Reinit To Default”调用节点是隐式地引用了停止按钮这将在下一次运行开始时将值重置为真。
  4. 所有这些循环都包含一个等待(ms),以突出显示所有循环都将停止,而不论它们的运行时间如何。

要停止两个以上的并行While循环,请遵循相同的体系结构,方法是添加更多值属性节点以从初始停止控控件中读取。

有关何时使用局部变量和属性节点的更多信息,请参阅 局部变量与值属性节点之间的区别
 

  • 通知器

对于涉及复杂行为的应用程序,可以使用通知器来停止并行运行的多个循环。可从“编程”»“同步”»“通知器操作”面板访问通知器功能。

注意:通知器的使用可以轻松扩展到多个线程,但并不总是与现有程序体系结构很好地集成。

以下VI代码段演示了一种通知器可用于停止多个While循环的方式。

以下列表描述了有关先前框图的重要细节:

 

  • 顶部循环的每次迭代都会将停止按钮的状态写入通知器。
  • 其他两个循环在每次迭代时检查通知器的状态。
  • 注意:确保在停止监视通知器的所有线程之前,不释放该通知程序。在上图的VI片段中,合并错误VI保证释放通知器VI将在所有循环停止之前不执行。
  • 单击停止按钮时,状态将发送到通知器,这将导致所有循环停止。
  • 队列

对于涉及更复杂行为的应用程序,您可以使用队列来停止并行运行的多个循环。可从“编程”»“同步”»“队列操作”选项板访问队列功能。

注意:许多较大的应用程序已经有一个队列系统,可以在并行循环之间交换数据。在这些设置中,可以修改或增强现有队列,以此包括用于并行循环的停止指令。

以下VI片段演示了如何使用队列来停止多个While循环:

一些使用主从结构的应用程序在从线程退出之前释放队列。从被破坏的引用调用出队列引发的错误后用于停止从循环。代替依赖错误条件来停止从属循环,上图的VI片段具有离散的停止指令,该指令从主循环传递至从循环。