允许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方法正常工作,但它不像套接字那么简单,它会使两个应用程序更加依赖于彼此。 变量访问将是非常即时的。 我看到至少两种可能性:
我肯定会远离文件方法:磁盘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程序进行通信(https://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需要访问的特定函数。 通过这种方式,所有共享内存都被完全抽象掉了。
希望其他人会发现此代码有用。
以上就是c/c++开发分享在C和Labview之间共享一个变量?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560328.html