允许C代码定期访问从单独的Labview程序生成的整数的瞬时值的最佳方法是什么?
我有时间关键的C代码控制科学实验并每20ms记录一次数据。我还有一些labview代码可以操作不同的仪器并输出一个100ms的整数值。我希望我的C代码能够记录labview的值。这样做的最佳方式是什么?
一个想法是让Labview在循环中将整数写入文件,并让C代码在循环中读取文件的值。 (如果需要,我可以在我的C代码中添加第二个线程。)Labview也可以链接到C dll。所以我或许可以在C中编写一个DLL,以某种方式促进两个程序之间的共享。这是可取的吗?我该怎么做?
答案 0 :(得分:4)
我在这里有一个类似的应用程序,并使用TCP套接字和TCP_NO_DELAY选项设置(禁用Nagle algorythm,它执行某种数据包缓冲)。套接字应该允许100毫秒的更新速率而没有问题,尽管实际的网络延迟将始终保持未知变量。对于我的应用程序,只要它保持在一定的限制下就没关系(如果时间戳增量太大,也可以通过发送每个数据包的时间戳和大红色对话框来检查:])。对您的申请有用吗?也就是说,每当LV仪器获得一个新样本时,它的值必须在x mSec内到达C app是否很重要?
你可能会让dll方法工作,但它不像套接字那么简单,它会使两个应用程序更加依赖。变量访问将非常即时。我看到至少两种可能性:
我肯定会远离文件方法:磁盘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需要访问的特定函数。通过这种方式,所有共享内存都被完全抽象掉了。
希望其他人会发现此代码很有用。