引言
某型信息化弹药通过对目标的基准弹道与飞行中的攻击弹道进行比较后,给出有限次不连续的修正量来修正攻击弹道,以减少弹着点误差,提高弹丸对付高速机动飞行目标的命中精度,或提高远程打击精度。该信息化弹药的基本结构就是在常规炮弹上加装弹道修正模块,弹道修正模块主要由微控制器根据基准弹道修正攻击弹道参数来提高命中率。
在传感器及信号调理电路的基础上,选用高速单片机、快速的数据传输总线以及LabVIEW应用程序,可快速开发一个简单实用的信息化弹药弹道控制通信系统模型。本通信系统模型用USB总线,在PC机与USB设备间实现上下位机之间的通信,在软件方面通常要完成以下设计:USB设备固件编程、USB设备驱动编程和PC机应用程序设计。下位机弹道修正模块用Silicon Labs公司的全速USB Flash微控制器C8051F340,上位机PC采用LabVIEW编写应用程序。与C8051F340进行USB通信主要有3种方式:利用CIN调用开发USB设备的外部代码;调用DLL对USB设备进行操作;通过VISA访问USB设备。下面分别进行介绍和比较。
1 利用CIN调用开发USB设备外部代码
CIN(Code Interface Node,代码接口节点)是LabVIEW中通过参数传递来调用C/C++代码的节点,可以利用USB设备生产厂家提供的C/ C++代码,将代码集成并作为一个单独的VI发布,实现数据的高效处理。这种实现方法相当于在LabVIEW下利用CIN对USB设备编写驱动程序。以C8051F340端口1IN批量传输为例。规定使用端口1IN批量传输且最大包长度为128字节,假设端点1IN的缓冲区地址为0x7E00~0x7E8F。主机通过不断发送IN令牌请求USB执行IN传输,C8051F340会通过将端点字节计数寄存器(N1CNT)加载,以示数据准备完毕,同时将一个IN数据包装入端点的IN FIFO并将INPRDY位(EINCSR L.O)位置1。利用CIN调用USB设备的外部代码的一般步骤如下:
①创建CIN节点。CIN节点位于“函数选板”一“互连接口”一“库与可执行库文件”子选板下。根据设备的参数需要增加外部代码的输入/输出端口。
②创建C源文件。右击CIN并选择创建C8051F340UsbInl.c文件选项,对打开的程序修改如下:
③编译C8051F340UsbInl.c文件,生成可被LabVIEW执行的C8051F340UsbInl.1sb。以VC++为例编译CIN节点源文件。在VC++下创建C8051F340UsbInl.mak文件,内容如下:
在VC++下点击new\project\make file,输入文件名C8051F340UsbInl后点击为OK和Finish按钮。将C8051F340UsbInl.c和C8051F340U-sbInl.mak一起复制到C8051F340UsbInl文件夹下,重新打开C8051F340UsbInl工作台,按F7可生成C8051F340UsbInl.1sb文件。
④右击选用的CIN图标,选择“加载代码资源”并选择C8051F340UsbInl.1sb文件。至此,一个基于CIN的读USB端口1的VI创建完毕。
上面是一个利用CIN创建开发USB驱动的VI的步骤,实际开发过程要麻烦很多,需要对设备及通信协议相当熟悉。因此,利用CIN实现USB通信受到一些限制。
2 调用DLL实现USB通信
开发USB设备时,不仅要面向USB控制器编程还要面向Windows编程(如果上位机用Windows操作系统),对不熟悉USB协议的用户而言是个难题。为了缩短用户开发USB设备时间,生产厂家往往会把对USB设备进行操作的函数封装成DLL(Dynamic Link Library,动态链接库)提供给用户。dll文件是一种可执行文件,允许程序共享执行特殊任务必需的代码和其他资源,与语言无关,可以被任何支持DLL的语言编写的应用程序访问。
Silicon Labs公司针对USB系列单片机为USB驱动程序开发提供了USBXpress开发套件,其中的SiUSBXp.dll包含了23个函数。一个简单的USB通信程序,通常要用到SiUSBXp.dll中的SI_GetNumDevices、SI_SetTimeouts、SI_Open、SI_Read、SI_Write和SI_Close等几个函数。在LabVIEW中调用dll文件有两种方法,下面将分别介绍。
首先是利用CLF(调用库函数节点)节点调用SiUSBXp.dll,一般步骤如下:
①放置CLF节点并通过路径加载dll文件。CLF节点位于“函数选板”一“互连接口”一“库与可执行库文件”子选板下。
②在加载的dll文件里选择要用到的函数并进行参数配置。根据USBXpress开发手册,对每一个被调用的函数配置合适的参数。
③配置参数完成之后,每一个函数就是一个VI,可在LabVIEW程序中调用。
其次是通过导入共享库的方法调用SiUSBXp.dll。
导入共享库的实质是将dll文件中的函数自动生成对应的VI。函数的每个参数可在头文件包含以及预处理定义条件下在生成的VI中显示出来,与利用CLF相比较,省去了手动配置参数的步骤。使用方法如下:新建一个VI,点击“工具”一“导入共享库”,选择为用户创建共享库;点击下一步,在“选择共享库及头文件”页面加载.dll文件和.h文件的路径;点击下一步,在预处理定义中添加预处理说明(如果需要添加);点击下一步,等待解析头文件并选择待转换函数;点击下一步,进行项目库设置配置,连续点击下一步,直至所有选中的函数生成VI存放用户库里(默认状态)。调用时,在“函数选板”一“用户库”一“SiUSBXp”,选择在LabVIEW程序设计中用到的VI。
以上两种调用DLL实现USB通信的方法具体操作不一样,但本质都是利用USB厂家提供的dll文件访问USB设备。图1为LabVIEW调用DLL实现一个简单USB通信的流程。
LabVIEW通过调用dll文件大大缩减了实现USB通信开发工作量,但最关键也是最难的一步在于给函数配置参数。通常来讲,DLL主要用C/C++等文本语言开发,有些参数类型和LabVIEW不匹配,直接调用无法正常使用。为了解决这个问题,需要用户对参数进行修改或者对原有的dll文件进行二次开发,加大了工作量。值得一提的是,USBXpress开发套件除了包含面向主机的dll文件,还包括面向USB器件的驱动文件和USBX_F34X LIB及USB_API.h文件,封装了USB协议的细节,大大简化了USB固件编程。一个典型的利用API函数实现USB通信的程序流程如图2所示。程序是在SiliconLabs集成开发环境下编译调试的。
不管利用CIN,还是调用DLL,都可以实现LabVIEW访问USB设备,但并不能很好地体现LabVIEW的优势。因为通过CIN和DLL,不用LabVIEW也可以实现上位机编程。实际上,LabVIEW还有独特的访问USB设备的方法,即通过VISA访问USB设备。
3 通过VISA访问USB设备
VISA(Virtual Instrument Software Architecture,虚拟仪器软件架构)是一种用来与各种仪器总线进行通信的高级应用编程接口(API),包括GPIB、USB、串口、PXI/PCI、VXI、火线和以太网。它是计算机与仪器的软件连接层,本身不具备编写仪器驱动的能力,通过调用特定仪器驱动与仪器的通信。
NI-VISA从3.0版开始支持USB通信,它有两种VISA类函数(Resource Class),可以控制两类USB设备:USB INSTR设备与USB RAW设备。U-SB INSTR设备是符合USBTMC协议的USB设备,可以通过使用USB INSTR类函数控制,通信时无需配置NI-VISA;而USB RAw设备是指除了明确符合USBTMC规格的仪器之外的任何USB设备,通信时要配置NI-VISA。C8051F340是USB RAW设备,故欲实现与LabVIEW进行USB通信,可通过NI公司提供的VISA Driver Wizard进行配置。步骤如下:
①按照“程序”一“National Instruments”一“VISA”一“Driver Wizard”选择USB并点击Next,进入USB-DeviceInformation界面。
②在USB Vendor ID栏和USB Product ID栏分别填写USB设备的PID号和VID号。另外两栏分别是Manufacturer Name和Mode Name栏,选填。每一个USB设备都有唯一的PID号和VID号,它们是主机识别不同USB设备的根据。
③生成并安装inf文件,为USB设备创建PNF文档。持续点击Next,并为文件命名。高版本的VISA可发自动创建PNF文档。
④连接USB设备。USB具有热拔插功能,所以Windows能够探测到USB设备,并立即会打开“添加新硬件向导”,很快完成USB设备驱动程序的安装。
至此,主机已将NI-VISA作为访问USB设备的底层驱动,在LabVIEW程序中即可利用VISA选板的VI设计通信程序。
图3是一个基于NI-VISA编写的LabVIEW与C8051F340进行USB通信的程序框图。设备的PID和VID分别是0x10C4和0x0005,单片机使用端点2IN,采用中断传输方式;LabVIEW程序中用VISA事件处理和获取USB中断等VI。
通过NI-VISA实现LabVIEW与单片机进行USB通信,大大减小了工作量,同时很好地发挥了LabVIEW的特点。
结语
对实现LabVIEW与C8051F340单片机USB通信的3种方式进行比较,结论如下:
①通过CIN节点访问USB可以充分利用设备生产厂家提供的C语言编写的驱动程序及源程序,发挥C语言的优势;但要求用户非常熟悉USB协议,这种实现方法相当于在LabVIEW下用CIN对USB设备编写驱动程序,使用较为麻烦。
②通过调用DLL实现USB通信,可以利用生产厂家提供的dll文件,发挥dll文件的优势;但由于dll文件的数据格式通常和LabVIEW不完全匹配,往往需要修改参数或者对dll文件进行二次开发,需要具备开发dll文件的能力,也比较麻烦。
③通过NI-VISA可以充分发挥LabVIEW的优势,无需熟悉传统文本语言编程,极大方便上位机的编程。
④就单片机在USB设备固件编程的工作量而言,通过NI-VISA方式与通过CIN方式相当,比通过USBXpress开发套件的工作量大。
结合实现LabVIEW与C8051F340USB通信总体软件编程任务,从工程应用角度进行比较,如表1所列。
对于一般情况下基于LabVIEW的上下位机USB通信,建议通过调用DLL或者使用VISA实现USB通信,具体采用哪种方式,还要结合系统具体要求而定。