我有一个实时应用程序RT Main
,它有多个高优先级定时循环运行一些模拟代码,并使用RT FIFO与低优先级通信循环通信,该循环与外部程序通信。我还有一个监控VI,DT Main
,在非实时桌面上运行,我用它来启动和停止实时模拟,加载参数文件,等等。
目前,我正在通过网络共享变量将Stop
按钮从DT Main
传递到RT Main
。我想知道的是:我如何使用它来同时(接近)同时停止RT Main
上的所有循环?
我知道我可以在我的Timed Loops中使用支持FIFO的网络共享变量,但我担心从同一个FIFO读取多个循环,我只会停止其中的一个或两个,然后FIFO将被清除而其他循环不会停止。
Stop
按钮变量停止低优先级通信循环。force destroy?
VI使用True
输入设置为 String x = arr[j];
char firstChar = x.charAt(0);
firstChar += (char)32;
时,此循环停止时,删除所有RT FIFO。以下是一个简单的例子。
我有两个问题:这会有效吗?无论这是否有效,在LabVIEW中实时应用程序中停止多个高优先级定时循环的“正确”方法是什么?
我无法弄清RT FIFO Delete
和RT FIFO Read
VI是否会在尝试从/不读取FIFO时写入错误。在这些情况下我会假设有一个RT FIFO Write
,但我现在无法测试它(没有硬件可以运行它),所以我无法验证。
为了记录,我发现RT FIFO error code -2206 "RT FIFO does not exist"到目前为止非常有帮助,但似乎没有详细回答我的问题。
谢谢!
我能够测试代码并验证我是否可以通过这种方式停止多个Timed Loops,但我仍然有兴趣了解您的最佳方法用于关闭远程RT VI的方法只需按下桌面VI上的按钮即可显示多个循环。
答案 0 :(得分:2)
对定时循环的关注是保持一切确定性。
确定性通信的另一个选项是使用启用了RT FIFO的共享变量。如果将其设置为单个元素FIFO,它仍然像普通变量一样工作。
我相信这可以直接成为一个网络变量也没有任何问题,或者有时候我喜欢将内部通信保持在内部并且有另一个循环来读取网络变量并将其写入内部变量以减少主机之间的耦合和RT目标实施。
这允许在软件中更明确的停止功能,这也增加了灵活性和可读性。请参阅图片以获取示例:
答案 1 :(得分:1)
示例代码用于使用来自被破坏的FIFO的错误同时关闭多个定时循环。我能够用下面显示的VI验证它。
我仍然有兴趣听取您的最佳解决方案,通过桌面VI上的一个停止按钮停止带有多个循环的RT VI。
答案 2 :(得分:1)
这将是执行此操作的最佳方式,并且是跨平台的Producer-Consumer pattern。我有一个建议是不要在销毁FIFO时使用Force Destroy
选项。最好单独跟踪FIFO并确保正确地销毁所有实例,而不是原子地消除对FIFO的所有引用。从我在你的应用程序中看到的,你没有创建命名的FIFO,因此不需要原子地销毁FIFO的所有实例。
干杯,马特