在C和Labview之间共享一个变量?

允许C代码定期访问从单独的Labview程序生成的整数的瞬时值的最佳方法是什么?

我有时间关键的C代码控制科学实验并每20ms记录一次数据。 我还有一些labview代码可以操作不同的仪器并输出100ms的整数值。 我希望我的C代码能够记录labview的值。 做这个的最好方式是什么?

一个想法是让Labview在循环中将整数写入文件,并让C代码在循环中读取文件的值。 (如果需要,我可以在我的C代码中添加第二个线程。)Labview也可以链接到C dll。 所以我可以在C中编写一个DLL,以某种方式促进两个程序之间的共享。 这是可取的吗? 我该怎么办?

我在这里有一个类似的应用程序,并使用TCP套接字和TCP_NO_DELAY选项集(禁用Nagle algorythm,它执行某种数据包缓冲)。 虽然实际的网络延迟始终是未知变量,但套接字应该允许100毫秒更新速率而不会出现问题。 对于我的应用程序,只要它保持在一定的限制之下就没有关系(如果时间戳增量太大,也可以通过发送每个数据包的时间戳和大红色对话框来检查:])。 这对你的申请有用吗? 也就是说,每当LV乐器获得新样本时,它的值必须在x mSec内到达C app是否很重要?

您可能会使dll方法正常工作,但它不像套接字那么简单,它会使两个应用程序更加依赖于彼此。 变量访问将是非常即时的。 我看到至少两种可能性:

  • 把你的整个 C应用程序放在一个dll中(起初看起来可能看起来很奇怪,但它有效),并让LV加载它并在其上调用方法。 例如,为了启动你的应用程序LV调用dll的Start()方法,然后在循环LV获取它的样本它调用dll的NewSampleValue(0方法左右。也意味着你的应用程序不能独立运行,除非你为它编写一个单独的主机进程。
  • 查看共享进程内存,并让C app和另一个dll共享公共内存。 LV将加载该dll并在其上调用一个方法将值写入共享内存,然后C app可以在轮询标志(需要锁定!)后读取它。
  • 也许有可能让C应用程序使用dll / activeX /调用LV程序? 电话,但我不知道该系统如何工作..

我肯定会远离文件方法:磁盘I / O可能是一个真正的瓶颈,它也有锁定问题,这是解决文件的麻烦。 LV正在写入时,C app无法读取文件,反之亦然,这可能会引入额外的延迟。

在旁注中,您可以看到上述每种方法都使用推模型或拉模型(TCP可以以两种方式实现),这可能会影响您最终决定采用哪种方式.. Push = LV表示直接使用C app,pull = C app必须轮询一个标志或询问LV的值。

我是National Instruments的员工,我想确保您不会错过随NIWindows / CVI(National Instruments C开发环境)提供的Network Variable API。 通过网络变量API,您可以通过共享变量轻松与LabVIEW程序进行通信(http://zone.ni.com/devzone/cda/tut/p/id/4679)。 在阅读这些链接时,请注意网络变量和共享变量是相同的 – 不同的名称是不幸的…

网络变量API的优点在于它允许与LabVIEW轻松互操作,它提供了强类型的通信机制,并且当网络/共享变量的属性(例如值)发生变化时,它提供了一个回调模型。

您可以通过安装LabWindows / CVI来获取此API,但不必使用LabWindows / CVI环境。 头文件位于C:\ Program Files \ National Instruments \ CVI2010 \ include \ cvinetv.h ,位于C:\ Program Files \ National Instruments \ CVI2010 \ extlib \ msvc \ cvinetv.lib的.lib文件可以是与您正在使用的任何C开发工具相关联。

我跟进了@stijn的理想之一:

有C应用程序和另一个DLL共享共同的内存。 LV将加载该dll并在其上调用一个方法将值写入共享内存,然后C app可以在轮询标志(需要锁定!)后读取它。

我写了InterProcess库,可以在这里找到: http : //github.com/samuellab/InterProcess

InterProcess是一个紧凑的通用库,它使用CreateFileMapping()MapViewOfFile()设置Windows共享内存。 它允许用户在任意数量的命名字段中无缝地存储任何类型的值(int,char,您的结构……等等)。 它还实现了Mutex对象以避免冲突和竞争条件,并且它在一个干净简单的界面中抽象出所有这些。 在Windows XP上测试过。 应该适用于任何现代Windows。

为了在我现有的C代码和labview之间进行接口,我编写了一个位于InterProcess之上的小包装器DLL,它只公开了我的C代码或labview需要访问的特定函数。 通过这种方式,所有共享内存都被完全抽象掉了。

希望其他人会发现此代码有用。