基于LabVIEW的实时网络接口开发
2008-11-28
作者:胡小江, 钱志博
摘 要: 以VMIC组成的实时网络为基础开发了基于LabVIEW环境的实时网络接口" title="网络接口">网络接口。
关键词: LabVIEW; 实时网络; VMIC接口; 半实物仿真系统" title="仿真系统">仿真系统
在半实物仿真系统中需要实时地操作数据和分析数据,并在此基础上作出相应的控制。由于LabVIEW具有与其他各种仪器的良好连接性、强大的数据采集功能、直观的基于数据流的图形化编程界面、良好的可扩展性以及整体功能的完整性,因而已经被广泛应用于仿真领域。本文提出一种基于LabVIEW的实时网络接口的设计方法,该方法将LabVIEW和VMIC实时网络系统结合起来实现实时网络的接口,并将其应用于某型号导弹的半实物仿真系统中。
1 LabVIEW的特点
LabVIEW是NI公司针对目前复杂的自动测试、高度自动化控制所提供的一种功能强大、成本低廉、系统灵活的新一代虚拟仪器。LabVIEW以先进的计算机总线技术和虚拟仪器技术为核心,代表了今后电子测控技术的发展方向。目前,LabVIEW越来越多地应用于测试和控制领域。在硬件方面,LabVIEW提供了开发系统的最佳平台,它支持VXI/PXI/USB/IEEE 1394等各种先进的测试总线;在软件方面,LabVIEW支持VISA、SCPI、IVI、DataSocket等各种虚拟仪器软件标准,而且LabVIEW本身已经成为图形化编程语言事实上的工业标准。由于LabVIEW作为虚拟仪器开发工具在数据采集和界面控制方面具有明显的优势,所以将其应用于半实物仿真非常有利于系统的快速开发。
2 VMIC实时网络原理
由于以太网传输协议开销的不确定性,很难满足大型复杂系统的半实物仿真的需要。目前,共享内存光纤网络采用了先进特殊的技术,具备了很强的支持分布实时系统的数据传输能力。在每个需要实时通讯的节点上插入共享内存网卡(节点卡),每块节点卡都有自己独立的局部内存,它通过局部内存映射" title="内存映射">内存映射将网卡上的局部内存映射到主机内存,用户读写网卡上的数据就如同读写主机内存上的数据一样快速方便。另外,每块共享内存网卡又通过网络内存映射,将分布节点卡上的局部内存映射到一个虚拟的全局内存,即每个节点在写入本地节点卡的数据同时也写入所有其他节点卡的内存。这样,用户对本地节点内存的读写相当于对全局内存进行读写,而这个全局内存是所有分布节点都可见共享的,从而实现分布节点间的数据通讯。通过这种方式,所有的节点能透明并确定地传送中断、消息或者数据块到其他的节点。其结构原理图如图1所示。
由于共享内存网络是一个实时的、基于内存的网络系统,其所有的工作都由硬件完成,没有软件的开销,再加上采用光纤传输介质,因此可以达到数十兆字节的数据传输率和百纳秒级的数据传输延迟。更重要的是这种网络的传输延迟是确定和可以预期的,这是传统的以太网络技术所难以达到的。正是由于共享内存实时网络的这些特点,使得它成为半实物仿真实时计算机网络的首选方案。表1列出了VMIPCI-5565型号的共享内存网卡的技术性能指标。
3 基于LabVIEW的实时网络接口设计方案
由于VMIC5565型号的驱动程序没有提供LabVIEW的版本,而是提供了C语言版的API接口函数" title="接口函数">接口函数,因此必须利用LabVIEW的外部接口来实现实时网络接口的设计。其中最为常用的方法有两种,一种是通过CLF(Call Library Function)节点调用DLL(Dynamic Link Library)来完成实时网络接口的设计。这种方法对于提供DLL的外部接口来说比较方便,但VMIC只是提供了C语言版的API接口函数,所以必须自己动手将VMIC提供的API接口函数转换成为DLL。这种方法应用起来比较方便,但考虑到实时网络的软件实时性" title="实时性">实时性,调用DLL会增加一定的系统开销。因此,对于实时要求比较严格的半实物仿真系统,这种方法不适用。LabVIEW提供的另外一种更为实用的方法是CIN(Code Interface Node)。利用CIN节点,可以将VMIC提供的C语言接口函数编译成LabVIEW所能识别的格式后与此节点相连,当CIN节点执行时,LabVIEW将自动调用与此相连的C语言接口函数,并向CIN传递特定的数据结构。由于LabVIEW中的数据存储格式遵循了C语言中的数据存储格式,并且二者完全相同,所以在半实物仿真系统中,使用CIN可以获得较高的程序效率。下面以VMIC5565实时网卡写入浮点数据的函数rfm_write_floats为例,说明利用CIN节点实现实时网络接口的设计方法。其他网络接口的设计方法和此类似。
rfm_write_floats函数原型为:double rfm_write_floats(int n, double* data,unsigned int addr)。该函数的功能是:从实时网指定地址addr,写n个浮点数到实时网中。其中,要写入实时网络的数据放在缓冲区data中。如果返回值大于0,则执行正确,否则错误。创建对应的CIN节点的过程如下文所述。
首先在LabVIEW中创建一个空的CIN节点,按照rfm_write_floats函数原型创建输入参数和输出参数。创建完成的空CIN节点如图2所示。
在创建完空CIN节点后,接下来需要为其装载有用的lsb文件。在CIN节点单击右键,在弹出菜单中选择Creat.c File,创建相应的C文件,将其保存为rfm_write_floats.c。文件格式如下所示。
/* CIN source file */
#include 'extcode.h'
MgErr CINRun(float64 *n, float64 *data, float64 *addr, float64 *result);
MgErr CINRun(float64 *n, float64 *data, float64 *addr, float64 *result)
{
/* Insert code here */
return noErr;
}
这只是CIN节点的壳文件,然后可以将rfm_write_floats函数的源代码复制到/* Insert code here */处,完成具体函数的功能。值得注意的是:由于LabVIEW所传递给CIN节点的参数实际上是其地址值,因此在rfm_write_floats函数中需要将输入参数n和addr的参数值进行相应的转换。源文件的创建已经完成,接下来的主要工作就是编译rfm_write_floats.c文件生成对应的lsb文件。可以借助Visual C++来完成这个工作。
在Visual C++中创建一个新的DLL Project,将LabVIEW安装目录下的cintools文件夹中的cin.obj、labview.lib、lvsb.lib、lvsbmain.def和rfm_write_floats.c文件加入目前的DLL工程中。接下来需要配置Visual C++的编译参数,在Visual C++主菜单中选择Project|Setting,将“C/C++”页选中,在Category栏中选择Preprocessor,将cintools文件夹所在的路径添加到Additional include directories文本框中。然后在Category栏中选择Code Generation,在Use runtime library栏中选择Multithreaded DLL,这样就完成了相对应的DLL文件编译配置。至此需要利用LabVIEW的CINTools工具中的lvsbutil函数将Visual C++生成的DLL文件转换成为CIN节点能够使用的lsb格式文件。选择“Custom Build”页,在Commands栏中键入如下格式代码:
在Outputs栏中键入如下格式代码:
$(OutDir)$( TargetName).lsb
在这里必须严格遵守以上的命令格式。实际应用中可根据具体的路径和文件名对cintools文件夹路径、TargetName、WkspDir和OutDir进行替换。最后,编译整个DLL工程,生成CIN节点所需要的lsb格式的文件。再加载lsb格式文件,在LabVIEW中选择创建的CIN节点,单击右键选择Load Code Resource菜单,在随后弹出的文件对话框中选择rfm_write_floats.lsb文件。此时便可以在LabVIEW中通过CIN节点来控制实时网络的写入操作。类似地可以将vmic_open()、vmic_close()、rfm_read_floats(int n, double* data,unsigned int addr)等函数创建为相对应的CIN节点来实现相应的实时网络的操作。
本文所开发的实时网络接口可以很方便地应用在以LabVIEW系统为平台的半实物仿真系统中。图3为在半实物仿真系统中通过实时网络控制三轴转台的前面板图。相比较用传统的局域网为通讯方式的仿真系统,其实时性有了很高的提升,在一定程度上可以认为在网络传输方面达到了实时性的要求。此外,因为整个半实物仿真系统采用LabVIEW为平台,本文所开发的实时网络接口是模块化的,可以和平台无缝连接,可以提高系统的开发效率。
本文介绍的利用CIN节点设计实时网络接口的方法适用于实时性要求比较高的系统,对于实时性要求不高的系统可以考虑采用CLF节点来完成。此外,由于半实物仿真系统对软硬件的实时性要求都比较高,在网络传输方面可以通过实时网络来完成各种设备的控制。但在软件方面如果利用LabVIEW信号处理模块会产生比较大的延时,所以可以考虑利用实时处理模块包或者是利用其逐点分析库来完成信号处理模块。
参考文献
[1] VMIC.VMIPCI-5565技术手册[M].2005.
[2] 刘君华.基于LabVIEW的虚拟仪器设计[M].北京:电子工业出版社,2003.
[3] NI Corp. Code Interface Reference Manual[M].2003.