同时停止多个 RT 定时循环的最佳方法?

Best way to stop multiple RT Timed Loops simultaneously?

背景

我有一个实时应用程序 RT Main,它有多个高优先级定时循环 运行使用一些模拟代码并使用 RT FIFO 与低优先级通信循环进行通信与外部程序对话。我还有一个监控 VI,DT Main,运行ning 在非实时桌面上,我用它来启动和停止实时仿真,加载参数文件,诸如此类的事情。

目前我正在通过网络共享变量将 Stop 按钮从 DT Main 传递到 RT Main。我想知道的是:我如何使用它来同时(接近)停止 RT Main 上的所有循环?

我知道我可以在我的定时循环中使用启用 FIFO 的网络共享变量,但我担心从同一个 FIFO 读取多个循环时,我只会停止其中的一个或两个,然后 FIFO 会被清除,其他循环不会停止。

当前计划

  1. 使用网络共享 Stop 按钮变量停止低优先级通信循环。
  2. 当此循环停止使用 RT FIFO Delete VI 并将 force destroy? 输入设置为 True 时,删除我所有的 RT FIFO。
  3. 让高优先级循环在下次尝试读取其(现已销毁的)FIFO 时自行关闭,这可能会导致错误。

下面的精简示例对此进行了说明。

问题

我有两个问题:这行得通吗?不管这是否有效,在 LabVIEW 的实时应用程序中停止多个高优先级定时循环的“正确”方法是什么?

我不知道在这些情况下是否会抛出我假设的 RT FIFO Read and RT FIFO Write VIs will throw an error if they try to read/write from/to a FIFO that isn't there. There is an RT FIFO error code -2206 "RT FIFO does not exist",但我现在无法测试它(还没有硬件支持 运行)等等我无法验证。

郑重声明,到目前为止,我发现 NI LabVIEW for CompactRIO Developer's Guide 非常有用,但它似乎没有提供足够的细节来回答我的问题。

谢谢!

更新

我能够测试代码并验证我可以用这种方式停止多个定时循环,但我仍然想听听你的 best 关闭方法是什么按下桌面 VI 上的按钮即可下载具有多个循环的远程 RT VI。

示例代码适用于使用来自被破坏的 FIFO 的错误同时关闭多个定时循环。我能够使用下面显示的 VI 对其进行验证。

我仍然有兴趣听听您的 最佳 解决方案,该解决方案用于通过桌面 VI 上的单个停止按钮停止具有多个循环的 RT VI。

这将是执行此操作的最佳方式,并且是跨平台的 Producer-Consumer pattern。我的一个建议是在销毁 FIFO 时不要 使用Force Destroy 选项。最好单独跟踪 FIFO,并确保正确销毁所有实例,而不是仅仅原子地消除对 FIFO 的所有引用。从我在你的应用程序中看到的,你没有创建命名的 FIFO,所以应该没有必要以原子方式销毁 FIFO 的所有实例。

干杯,马特

定时循环的问题在于保持一切确定性。

您拥有的确定性通信的另一个选项是使用启用了 RT FIFO 的共享变量。如果将其设置为单个元素 FIFO,它仍然像普通变量一样工作。

我相信这也可以直接是一个网络变量,没有任何问题,或者有时我喜欢将内部通信保留在内部,并有另一个循环读取网络变量并将其写入内部变量以减少之间的耦合主机和 RT 目标实现。

这允许在软件中使用更明确的停止功能,从而提高灵活性和可读性。示例见图片: