LabWindowsCVI入门之第三章计算机外设开发.docx
《LabWindowsCVI入门之第三章计算机外设开发.docx》由会员分享,可在线阅读,更多相关《LabWindowsCVI入门之第三章计算机外设开发.docx(36页珍藏版)》请在冰豆网上搜索。
LabWindowsCVI入门之第三章计算机外设开发
LabWindows/CVI入门之第三章:
计算机外设开发
通过上一章节的学习,大家已经掌握了在CVI下开发GUI应用程序的基本步骤和基本方法。
CVI的重要应用是工业接口通信、复杂的数据采集和仪器控制系统的开发,所以对于学习CVI来说仅仅掌握GUI程序的开发还远远不够。
实际生产生活中,有些设备要求能够满足军用或工业领域恶劣环境或极端天气下对于可靠性的要求,有些设备要求能够满足快速大容量数据的持续传输的要求,有些设备要求能够满足防尘防水防暴防震防撬的要求,有些设备要求满足低成本的要求,纷繁的要求导致了不同的接口标准以及接口协议的诞生。
仅仅掌握了CVI下GUI的编程只能说是对CVI入门,却没有充分的体会到CVI的精华。
在纷繁的接口与个性化的需求下,开发简捷高效、稳定易用、用户体验良好的程序才是我们学习CVI的终极目标。
3.1计算机组件编程
在本节中,我们将会接触到在CVI下进行文件操作、音频播放、OpenGL操作、SQL数据库查询、剪贴板操作、动态数据交换、ActiveX控件操作、调用.Net操作等相关内容。
在介绍相关内容时,我们只介绍原理与CVI对应的函数功能,具体使用方法需要大家查询CVI的帮助文档。
3.1.1在CVI中进行文件操作
在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。
这样就需要对文件进行读写操作,LabWindows/CVI中对文件读写操作的常用函数如下:
(1)OpenFile打开一个文件用以读或者写,函数返回文件句柄;
(2)CloseFile关闭指定的文件;
(3)ReadFile从文件中读取指定字节数的内容到字符串缓冲区;
(4)WriteFile将字符串缓冲区中指定字节数的内容写到文件中;
(5)ArrayToFile将数组内容保存到文件中;
(6)从文件中读取数据存储到数组中。
(7)ReadLine从文件读取字节直到换行。
(8)WriteLine将缓冲区中指定的字节数写入文件中,同时换行。
(9)DeleteFile删除文件
(10)RenameFile重命名文件
(11)CopyFile复制文件
下面给出了一个简单的新建test.txt文件,并且向文本文件中写入字符并读出来的例子。
该函数运行之后,将在工程文件夹下新建一test.txt的文本文件,文件内容如图31所示。
程序运行结果如图32所示。
图 31文本文件内容
图 32程序运行结果
与文件读写有关的函数可以在FormattingandI/OLibrary的中找到,与文件操作有关的函数可以在UtilityLibrary的中找到,与文件夹有关的函数可以在UtilityLibrary的DirectoryUtilities中找到。
另外,ANSIC中对文件的操作的函数如fopen、fread、fputs等函数在CVI中仍然可以使用。
3.1.2 网络通信:
在CVI中调用TCP库
在测控领域,随着网络计算、远程监控与远程诊断等在仪器仪表领域的应用与发展,网络通信已经成为仪器的基本功能。
CVI也提供了Internet库、TCP库、DataSocket库以供用户使用。
Internet库主要提供了FTP协议、Telnet协议以及POP3协议的客户端的函数支持。
TCP库主要提供了基于TCP协议的网络数据收发函数。
DataSocket库提供了比TCP更加方便有效的NI推出的DataSocket的操作函数。
在本小节的介绍之前,我们假设大家已经知道了TCP/IP协议、FTP协议、POP3协议、HTTP协议、Telnet协议以及他们之间的相互关系,知道了IP地址、子网掩码、DNS、网关是什么。
若对以上问题有含糊之处,建议立即通过Google等手段理解这些概念。
本节主要介绍TCP通信的相关内容。
利用TCP函数库进行网络传输都要涉及服务器端和客户端。
TCP服务器可以通过网络向用户应用程序发送数据和从客户应用程序接收数据。
TCP客户可以向TCP服务应用程序发送连接请求,并从服务器接收数据和向服务器发送数据。
服务器需要注册,注册以后等待客户向它发送连接请求,而客户只能向已经存在的服务器发送连接请求。
运行TCP服务器应用程序的计算机一般叫做主机。
服务器端的传输控制函数如下:
(1)RegisterTCPServer注册TCP服务器
(2)ServerTCPRead从客户端读取数据
(3)ServerTCPWrite向客户端发送数据
(4)UnregisterTCPServer注销TCP服务器
(5)DisconnectTCPClient断开与客户端的连接
要是程序成为TCP服务器,必须要运行RegisterTCPServer函数。
客户端的传输控制函数如下:
(1)ConnectToTCPServer连接到TCP服务器
(2)ClientTCPServer从服务器读取数据
(3)ClientTCPWrite向服务器写数据
(4)DisconnectFromTCPServer断开与TCP服务器的连接
另外CVI的TCP库还提供了TCP的回调函数,并提供了连接开始(TCO_CONNECT)、断开连接(TCP_DISCONNECT)以及数据有效(TCP_DATAREADY)3种消息。
下面给出了一个简单的建立TCP服务器,并通过客户端连接TCP服务器的例子。
在该示例程序中,TCP服务器运行后客户端向服务器发送“Hello,I'mclient.”的文本信息,服务器向客户端返回“OK”信息。
TCP服务器代码如下:
TCP客户端的代码如下:
TCP服务器与TCP客户端的程序分别保存在两个不同的工程中。
运行时,先运行TCP服务器程序,再运行TCP客户端程序,运行效果如所示。
图33TCP示例程序运行结果
3.1.3网络通信:
在CVI中调用Internet库
Internet库主要提供了FTP协议、Telnet协议以及POP3协议的客户端的函数支持。
FTP是应用层的协议,它基于TCP协议,负责进行文件的传输。
CVI通过封装隐藏了一些底层的FTP操作,提供了两个方便的FTP操作函数:
(1)Inet将本地的文件传输到指定的远程服务器主机上
(2)Inet将指定远程服务器上的文件传输到本机上。
Telnet协议也是应用层的协议,同样基于TCP协议,是Internet远程登陆服务的标准协议和主要方式。
CVI提供了对Telnet操作的以下函数:
(1)InetTelnetOpen建立Telnet连接
(2)InetTelnetRead从Telnet服务器中读取数据
(3)InetTelnetWrite向Telnet服务器写数据
(4)InetTelnetClose关闭Telnet连接
(5)InetTelnetReadUntil从Telnet服务器中读取数据,直到遇到指定字符或达到指定字节数或者超时
(6)InetTelnetRunScript在Telnet服务器上执行指定的脚本
POP3也是应用层的协议,基于TCP协议,规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件。
POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件。
CVI提供了对POP3操作的以下函数:
(1)InetPop3Open连接POP3服务器
(2)InetPop3Close关闭与POP3服务器的连接
(3)InetPop3GetNumMessages获取POP3服务器上的消息数量
(4)InetPop3GetMessageSize获取POP3服务器上消息的大小
(5)InetPop3GetMessageInfo获取POP3服务器上邮件的具体信息
(6)InetPop3DeleteMessage删除POP3服务器上的消息
(7)InetPop3GetMessage获取POP3电子邮件消息头与内容
(8)InetPop3ParseMessageHeader解析POP3邮件的消息头
3.1.4网络通信:
在CVI中调用DataSocket库
DataSocket技术是NI公司推出的面向测控领域的网络通信技术。
DataSocket技术基于Microsoft的COM和ActiveX技术,对TCP/IP协议进行高度封装,面向测量和自动化应用,用于共享和发布实时数据DamSockd能有效地支持本地计算机上不同应用程序对特定数据的同时应用,以及网络和不同计算机的多个应用程序之间的数据交互,实现跨机器、跨语言、跨进程实时数据共享。
在测试测量过程中,用户只需要知道数据源和数据库及需要交换的数据就可以直接进行高层应用程序的开发,实现高速数据传输,而不必关心底层的实现细节,从而简化通信程序的编写过程、提高编程效率。
DataSocket包括DataSocketServerManager(以下简称Manager),DataSocketServer和DataSocketAPI一部分。
Manager是一个独立运行的程序,主要功能有:
设置DataSocketServer连接的客户端程序的最大数目和创建数据项的最大数目:
创建用户组和用户;设置用户创建和读写数据项的权限;限制身份不明的客户对服务器进行访问和攻击。
例如,将Manager中的DefaultReader设置为everyhost,则网中的每台客户计算机都可以读取服务器上的数据。
Manager对DataSocketServer的配置必须在本地计算机上进行,而不能远程配置或通过运行程序来配置。
DataSocketServer是一个必须运行在服务器端的程序,负责监管Manager中所设定的具有各种权限的用户组和客户端程序之间的数据交换。
DataSocketServer通过内部数据自描述格式对TCP/IP进行优化和管理,简化Internet通信方式,提供自由的数据传输,可以直接传送虚拟仪器程序所采集到的布尔型、数字型、字符串型、数组型和波形等常用类型的数据。
它可以和测控应用程序安装在同一台计算机上,也可以分装在不同的计算机上,以便用防火墙进行隔离来增加整个系统的安全性。
DataSocketServer不会占用测控计算机CPU的工作时间,测控应用程序可以运行得更快。
使用DataSocket技术进行通信时服务器和客户端得计算机上笔形都进行DataSocketServer。
DataSocketAPI提供独立的接口,用于不同的语言平台内部多种数据类型的通读。
在LabVIEW中,DataSocketAPI被制作成ActiveX控件和一系列功能VI(VirtualInstrument),用户可以方便地使用。
一般由服务器进行数据采集,根据需要将测量地数据写入DataSocket数据公共区,然后客户端通过网络从数据公共区读取所需地测量数据。
DataSocket库函数介绍如下。
(1)DS_Open创建DataSocket对象并连接到数据源
(2)DS_DiscardObjHandle释放DataSocket句柄和它占用的相关资源
(3)DS_GetDataType获取DataSocket对象的数据类型
(4)DS_GetDataValue获取DataSocket对象相关的数据值
(5)DS_SetDataValue设置DataSocket对象相关的数据值
(6)DS_Update在写连接,把DataSocket对象的属性和数据写到DataSocket服务器;在读连接,从DataSocket服务器读取DataSocket对象的属性和数据
(7)DS_SelectURL允许终端用户选择连接的DataSocketURL
(8)DS_FreeMemory释放DataSocket库函数占用的内存
(9)DS_GetLibraryErrorString返回描述库错误的字符串
DataSocket是一个独立于平台的解决方案,限于篇幅,此处不再给出DataSocket的示例程序,感兴趣的同学可以通过CVI安装目录下的samples中datasocket相关部分自行学习。
3.1.5 在CVI中使用音频动画
在许多测控系统中,常常需要加入音频、图像、动画或具有互动功能的3D模型。
在本节中,我们将会详细介绍如何向应用程序中添加这些控件。
图像
在程序中添加图像相对比较简单,CVI中直接提供了图像控件,通过控件的帮助文档很容易掌握在GUI中添加图像以及通过程序更改图像的方法。
动画
动画控件是由PictureRing(图像列表)控件转化而来,在编辑界面添加PictureRing之后,通过菜单-Tree(*.fp),打开CVI安装目录下toolslib\custctrl\animate.fp文件,在CVI窗口的左下角即出现AnimationControl的库。
库中提供了如下四个函数:
(1)AnimateCtrl_Create直接创建动画控件(此函数会自动在编辑界面添加PictureRing控件,但不会自动给PictureRing添加图片)
(2)AnimateCtrl_ConvertFromPictRing将PictureRing控件转换为动画控件
(3)AnimateCtrl_SetAttribute设置动画控件的属性
(4)AnimateCtrl_GetAttribute获取动画控件的属性
另外在最新版的CVI中,Picture控件提供了gif的支持,用户可以直接添加gif动画。
音频
同样CVI也提供了对音频播放功能的支持。
CVI只提供了对wav文件播放的支持,若需要支持其他格式的文件需要调用其他的dll文件完成。
函数为:
sndPlaySound播放指定文件路径的wav文件
OpenGL
CVI默认提供对OpenGL的支持,函数库文件为cviogl.fp,位于CVI安装目录的toolslib\custctrl\cviogl.fp。
该函数库文件包含了控件与作图两个子类的函数,可以完成创建、更新、删除OpenGL控件以及获取OpenGL控件属性等功能。
尤其需要注意的是,我们不仅可以使用cviogl.fp中提供的函数,OpenGL中通用的glau.lib、glu32.lib、opengl32.lib库中的所有函数都可以使用。
也就是说,OpenGL强大的功能也可以在CVI环境下发挥的淋漓尽致。
OpenGL本身就是一个功能强大的库,目前很多3D游戏都是基于OpenGL设计,此处篇幅所限不再展开,感兴趣的读者可以将以前写的OpenGL代码移植到CVI环境下。
3.1.6 在CVI中使用SQLToolKit
LabWindows/CVISQLToolkit是一个用来访问数据库的软件工具包。
工具包里包含了一个用来完成一般数据库任务的高级函数集。
在其基础上,可实现定制任务等高级功能的开发。
LabWindows/CVISQL工具包提供若干ODBC数据库驱动器,工具包符合ODBC标准,因此对任何符合ODBC数据库驱动器均可使用。
常见的MicrosoftOfficeAccess支持的.accdb、.mdb文件都可以通过ODBC数据库驱动器使用。
SQLToolkit并不随CVI的安装发行包一起安装,用户若想使用CVI开发数据库需要额外从NI的官方网站下载:
利用CVISQLToolkit进行数据库操作通常由以下五步完成:
连接数据库-激活SQL连接-处理SQL语句-断开SQL连接-断开数据库。
图35提供了使用SQLToolkit实现数据库操作的流程图,一般对ODBC数据库进行操作都是根据图35的说明依次调用内部的函数实现的。
连接数据库
CVI提供的连接数据库的函数只有一个:
DBConnect。
DBConnect的参数为ODBC连接字符串。
ODBC连接字符串可以在ODBC数据源管理器(在“开始菜单”-“程序”-“管理工具”-“数据源(ODBC)”中打开)的系统DSN中添加。
如图34所示的第一个数据库的连接字符串应该为:
"DSN=CVISQLSamples"
激活SQL连接
CVI提供了两种激活SQL连接的方式:
自动SQL和显式SQL。
自动SQL对应图35的DBBeginMap及下面的系列函数,只能构造简单的SELECT语句和CREATETABLE语句。
显式SQL对应图35的DBActivateSQL及下方的系列函数,可以执行更复杂的SELECT语句以及其他语句。
处理SQL语句
使用SELECT语句必须将选择的字段绑定到程序中的变量上。
接着用取值函数获取所选记录。
每次调用取值函数,工具包将列变量拷贝到在程序中绑定的变量。
更新行或创建行时还可用绑定的变量,即更新行或创建行时将新值拷贝到绑定的变量并随后调用适当的函数,将程序中的数据添加到数据库对应的字段。
CVISQLToolkit提供了DBMapColumnTo函数以及DBBindCol函数(如图35),帮助用户绑定数据库的对应数据到变量中。
断开SQL连接
SQL操作后,应该断开SQL连接来释放系统资源。
对于自动SQL连接,使用DBDeactivateMap函数,对于显式SQL连接,使用DBDeactivateSQL函数。
断开数据库连接
数据库操作结束后,应该断开数据库连接来释放系统资源。
CVI提供了DEDisconnect断开连接。
具体的函数使用说明参见CVI安装目录中bin\cvisqlref.chm的帮助文件。
图 34ODBC数据源管理器
图 35CVISQLToolkit函数库使用流程图
从上面的图35可以看出,若不需要绑定变量,则可使用DBImmediateSQL执行一个SQL语句,更加方便快捷。
下面的例子给出了从数据库的USERS表中查找用户ID为2的用户名与用户年龄的完整代码。
USER表数据库参见图36。
其中ID为自动编号类型,UserName为文本类型,Age为数字类型。
运行代码前,需要实现在数据源ODBC管理器中添加数据源名为“CVISQLSamples”的mdf文件。
图 36数据库USERS表
3.1.7 在CVI中使用剪贴板与动态数据交换(DDE)
剪贴板(ClipBoard)与动态数据交换(DDE,DynamicDataExchange)都是用于用于应用程序交换数据共享信息的工具和途径,广泛应用于Windows操作系统中。
CVI对于剪贴板提供了四个函数,分别提供了向剪贴板中写入文本、图像以及从剪贴板中读出文本、图像的功能。
(1)ClipboardPutText向剪贴板拷贝文本格式的数据
(2)ClipboardPutBitmap向剪贴板拷贝位图格式的数据
(3)ClipboardGetText从剪贴板中读取文本格式的数据
(4)ClipboardGetBitmap从剪贴板中读取位图格式的数据
使用DDE通讯需要两个Windows应用程序,其中一个作为服务器处理信息,另外一个作为客户机从服务器获得信息。
客户机应用程序向当前所激活的服务器应用程序发送一条消息请求信息,服务器应用程序根据该信息作出应答,从而实现两个程序之间的数据交换。
DDE最早是随着Windows3.1由微软公司提出的,虽然目前很多软件支持DDE,但是目前诸多公司已经停止了对DDE的支持。
DDE通常用来在程序中实现导出数据保存为Excel或者Word中,但是CVI提供了效率更高更易用的ActiveX控件的功能,可以达到同样的目的。
3.1.8 在CVI中进行ActiveX控件操作
ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM),可被其他应用程序编程驱动,实现特殊的程序间调用功能。
COM组件(ActiveX控件)可由不同语言的开发工具开发,VC、PowerBuilder等编程开发工具均可开发ActiveX控件。
ActiveX在广义上是指微软公司的整个COM架构,但是现在通常用来称呼基于标准COM接口来实现对象连接与嵌入的ActiveX控件,常常用于在IE中增加丰富的扩展功能。
而在本教程中,我们提到的ActiveX控件均指的广义上的ActiveX控件,即基于COM模型的开发组件。
点击CVI菜单Tools-CreateActiveX Controller…,打开创建ActiveXControllerWizard,点击Next即可发现有大量可供我们使用的ActiveX控件。
通过添加适当的ActiveX控件,我们不仅可以从常用的Office软件中写入、读取数据,操作数据库,获取与Matlab的接口以使用Matlab进行数据处理,还可以利用AutoCAD、QQ、IE、PowerDesigner、SolidWorks等诸多领域主流的软件的组件进行相关程序的编写。
限于篇幅,本节只以一个实例向大家介绍使用ActiveX控件开发应用程序的基本过程与方法。
在这个实例中,我们将通过MicrosoftExcel9.0ObjectLib这个ActiveX控件打开Excel文件并向其中写入0~99这100个数据并将Excel文件保存在指定位置。
假设我们计算机上安装了Office2000。
单击CVI菜单Tools-CreateActiveX Controller…,点击下一步,在ActiveXServer选项中找到MicrosoftExcel9.0,点击下一步,选择函数库.fp文件保存的位置之后,CVI即在当前工程中添加了MicrosoftExcel9.0ObjectLib的相关库文件。
若在计算机上安装的Office版本不是2000,那也没关系,从CVI安装目录中的“samples\activex\excel”中找到excel2000.fp、excel2000.h、excel2000.obj和excel2000.sub文件,将此四个文件复制到工程目录下,将fp文件添加到当前工程中之后同样可以达到添加Micr