背景
我有一个实时应用程序 RT Main
,它具有多个运行一些模拟代码的高优先级定时循环,并使用 RT FIFO 与一个低优先级通信循环进行通信,该循环与一个低优先级通信循环进行通信。外部程序。我还有一个监控 VI,DT Main
,在非实时桌面上运行,我用它来启动和停止实时模拟、加载参数文件等。
目前,我通过网络共享变量将Stop
按钮从DT Main
传递到RT Main
。我想知道的是:如何使用它来同时(接近)同时停止 RT Main
上的所有循环?
我知道我可以在定时循环中使用支持 FIFO 的网络共享变量,但我担心多个循环从同一个 FIFO 读取数据时,我只会停止其中的一两个,然后 FIFO 就会被清除并且其他循环不会停止。
当前计划
- 使用网络共享
Stop
按钮变量停止低优先级通信循环。 - 当此循环停止时,使用
RT FIFO Delete
删除我的所有 RT FIFO。 VI,将force destroy?
输入设置为True
。 - 让高优先级循环在下次尝试读取(现已损坏)的 FIFO 时自行关闭,这可能会导致错误。
下面的精炼示例对此进行了说明。
问题
我有两个问题:这行得通吗?不管这是否有效,在 LabVIEW 实时应用程序中停止多个高优先级定时循环的“正确”方法是什么?
我不知道 RT FIFO Read
是否和 RT FIFO Write
如果VI尝试对不存在的FIFO进行读/写,则会抛出错误。有一个RT FIFO error code -2206 "RT FIFO does not exist"我假设在这些情况下会被抛出,但我现在无法测试它(还没有硬件可以运行它),所以我无法验证。
作为记录,我找到了 NI LabVIEW for CompactRIO Developer's Guide到目前为止非常有帮助,但它似乎没有提供足够的细节来回答我的问题。
谢谢!
更新
我能够测试代码并验证我是否可以通过这种方式停止多个定时循环,但我仍然有兴趣了解您关闭远程 RT VI 的最佳方法只需按下桌面 VI 上的按钮即可进行多个循环。
最佳答案
对定时循环的关注是保持一切确定性。
确定性通信的另一个选项是使用启用 RT FIFO 的共享变量。如果您将其设置为单元素 FIFO,它仍然像普通变量一样工作。
我相信这也可以直接是一个网络变量,没有任何问题,或者有时我喜欢将内部通信保留在内部,并有另一个循环来读取网络变量并将其写入内部变量,以减少主机之间的耦合和RT目标实现。
这允许在软件中提供更明确的停止功能,从而提高灵活性和可读性。请参阅图片示例:
关于while-loop - 同时停止多个 RT 定时循环的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31255911/