【问题标题】:Passing data between different speed loops in LabVIEW在LabVIEW中不同速度环之间传递数据
【发布时间】:2018-03-27 17:11:27
【问题描述】:

我有一个(桌面)LabVIEW 程序运行几个大的 While 循环。每个循环对应于 myRIO DAQ 系统中 IO 卡上的功能。每张卡都以不同的速度运行,因此我的代码中的每个循环和子 VI 也以不同的速度运行。

但是,我现在发现我需要将数据从低速环路传递到高速环路,但我不确定如何最好地进行。

低速环路实际上是通过 TCP 连接到 Yokogowa 功率分析仪,环路速度为 50ms (20Hz)。高速环路以 50kHz 运行,并使用来自高速 ADC 的输入执行数学运算以计算电机扭矩,并且需要来自低速环路(功率分析仪)的信息才能继续。存在 816:1 的数据流差异。

在运行时,它似乎工作正常,直到我旋转电机,然后过转矩例程启动并关闭我。

所以我接下来尝试对数据进行排队,但这只会显着减慢高速循环。

话虽如此,我的想法是在低速循环中获取传入数据,并用该数据(816 深)填充一个数组并将其排队到高速循环,但我不太确定如何也要去做。

我应该如何以更有效和适当的方式完成我想做的事情?

【问题讨论】:

  • 高速环路以 50kHz 运行 - 你确定吗?在桌面操作系统上?如果您需要这种速度并且拥有 myRIO,我认为您最好在 myRIO 上的实时操作系统中运行此任务。

标签: labview


【解决方案1】:

查看Real-Time FIFO 调色板。这里的函数创建和操作一个无锁 FIFO 系统,明确设计用于在循环之间以确定的方式传递数据。如果使用得当,它们可以保证尝试写入数据的较慢循环不会以使较快循环脱离其计划的方式锁定 FFO。

您可以找到 RT FIFO 代码here 的简单示例。您可以在 LabVIEW 附带的示例中找到更多信息。

【讨论】:

  • 我认为最好的参考是 cRIO 开发人员指南:ni.com/pdf/products/us/fullcriodevguide.pdf(从第 29 页开始)。据我所知,适用于 myRIO 的信息与适用于 cRIO 的信息相同。
  • @Jedi 发布图片。抽象地,来自多个评论者的所有 cmets 都指向 FIFO 解决方案,因此,具体而言,问题必须在您的特定代码中(或者您描述的情况是我们误解了)。由于您的 HS 循环将保持结构主要是 emoty,您是否在 dequeue 上设置了 0 的超时时间?
  • 从我链接到的 cRIO 开发指南中,OP 对实时系统的要求的适当机制似乎是标题为 启用 RT FIFO 的单进程共享变量(单元素)。然而 OP 已经澄清这实际上是在桌面 LabVIEW 上。
【解决方案2】:

如果高速循环运行得更快,那么它只需要最新的值,所以你需要一个变量/标签类型的通信。

根据您已经知道的情况,有几个选项:

  • 局部/全局变量
  • 函数式全局变量(但全局变量更快)
  • 通知程序(如果您使用 get staus,您可以像读取变量一样读取它。

我会选择一个你觉得舒服的并尝试一下。

【讨论】:

  • 这对于桌面 LabVIEW 来说是一个很好的一般性建议(因此被赞成),但由于问题与 LabVIEW Real-Time 相关,@srm 的答案更适合特定情况。
  • 我明白你的意思,但 FIFO 不起作用,因为你读的比写的快。您可以使用 RT FIFO 进行零超时的确定性,然后您必须在本地存储最后一个值,以防自上次读取以来尚未写入。
  • @nekomatic 我在桌面应用程序中执行此操作,而不是 myRio FPGA 或嵌入式系统......
  • @jamesmc86 - 高速循环是否会继续对全局变量中存在的任何值进行操作,直到它发生变化?我只是想确保是这样,如果是这样,我可以处理数据。
  • @JediEngineer 好的,如果这只是在桌面上,那么这些都可以;我可能会使用通知器并使用Get Notifier Status 阅读它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2017-05-21
相关资源
最近更新 更多