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

时间:2011-01-04 17:47:40

标签: c variables labview

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

  • 将你的整个 C应用程序放在一个dll中(起初可能看起来很奇怪,但它可以正常工作),并让LV加载它并在其上调用方法。例如,为了启动你的应用程序LV调用dll的Start()方法,然后在循环LV获取它的样本,它调用dll的NewSampleValue(0方法左右。也意味着你的应用程序不能独立运行,除非你为它编写一个单独的主机进程。 / LI>
  • 查看共享进程内存,并让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的值。

答案 1 :(得分:3)

我是National Instruments的员工,我想确保您不会错过随NIWindows / CVI(National Instruments C开发环境)提供的网络变量API。 Network Variable 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 ,而.lib文件位于 C:\ Program Files \ National Instruments \ CVI2010 \ extlib \ msvc \ cvinetv.lib 可以与您正在使用的任何C开发工具链接。

答案 2 :(得分:3)

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

  

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

我编写了InterProcess库,可在此处找到:http://github.com/samuellab/InterProcess

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

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

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