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

标签 while-loop real-time labview fifo

背景

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

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

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

当前计划

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

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

Illustrative Example VI

问题

我有两个问题:这行得通吗?不管这是否有效,在 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目标实现。

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

stopping rt loops

关于while-loop - 同时停止多个 RT 定时循环的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31255911/

相关文章:

c - 从 getchar 切换到 fgets

java - 如何编写 Java JIT 优化友好的代码?

execution - 我是否应该将预分配VI中的子VI也设置为在LabVIEW中预分配?

python - 从 tdms 文件中分割一维 numpy 数组,并从原始数组中绘制较短的时间序列/间隔

user-interface - 如何以非编程方式使LabVIEW前面板元素不可见?

c - while循环,当它运行 "string"数据时,如何用特定的单词或字母中止它?

php - 查询结果显示问题

python - “elif”在 'while' 循环内不起作用

python - 子进程不会实时显示来自 tcpdump 的数据。它显示暂停约 10-20 秒

audio - 跨平台实时音频IO