[原创教程]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) FileToArray 从文件中读取数据存储到数组中。
(7) ReadLine 从文件读取字节直到换行。
(8) WriteLine 将缓冲区中指定的字节数写入文件中,同时换行。
(9) DeleteFile 删除文件
(10) RenameFile 重命名文件
(11) CopyFile 复制文件
下面给出了一个简单的新建test.txt文件,并且向文本文件中写入字符并读出来的例子。
该函数运行之后,将在工程文件夹下新建一test.txt的文本文件,文件内容如图 3‑1所示。程序运行结果如图 3‑2所示。
与文件读写有关的函数可以在Formatting and I/O Library的File I/O中找到,与文件操作有关的函数可以在Utility Library的File Utilities中找到,与文件夹有关的函数可以在Utility Library的Directory Utilities中找到。另外,ANSI C中对文件的操作的函数如fopen、fread、fputs等函数在CVI中仍然可以使用。
3.1.2 网络通信:在CVI中调用TCP库
网络通信:在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’m client.”的文本信息,服务器向客户端返回“OK”信息。
TCP服务器代码如下:
TCP客户端的代码如下:
TCP服务器与TCP客户端的程序分别保存在两个不同的工程中。运行时,先运行TCP服务器程序,再运行TCP客户端程序,运行效果如所示。
图 3‑3 TCP示例程序运行结果
3.1.3 网络通信:在CVI中调用Internet库
Internet库主要提供了FTP协议、Telnet协议以及POP3协议的客户端的函数支持。
FTP是应用层的协议,它基于TCP协议,负责进行文件的传输。CVI通过封装隐藏了一些底层的FTP操作 ,提供了两个方便的FTP操作函数:
(1) InetFTPAutoSend 将本地的文件传输到指定的远程服务器主机上
(2) InetFTPAutoRetrieve 将指定远程服务器上的文件传输到本机上。
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包括DataSocket Server Manager(以下简称Manager),DataSocket Server和DataSocket API一部分。
Manager是一个独立运行的程序,主要功能有:设置DataSocket Server连接的客户端程序的最大数目和创建数据项的最大数目:创建用户组和用户;设置用户创建和读写数据项的权限;限制身份不明的客户对服务器进行访问和攻击。例如,将Manager中的Default Reader设置为everyhost,则网中的每台客户计算机都可以读取服务器上的数据。Manager对DataSocket Server 的配置必须在本地计算机上进行,而不能远程配置或通过运行程序来配置。
DataSocket Server 是一个必须运行在服务器端的程序,负责监管Manager中所设定的具有各种权限的用户组和客户端程序之间的数据交换。DataSocket Server通过内部数据自描述格式对TCP/IP进行优化和管理,简化Internet通信方式,提供自由的数据传输,可以直接传送虚拟仪器程序所采集到的布尔型、数字型、字符串型、数组型和波形等常用类型的数据。它可以和测控应用程序安装在同一台计算机上,也可以分装在不同的计算机上,以便用防火墙进行隔离来增加整个系统的安全性。DataSocket Server不会占用测控计算机CPU的工作时间,测控应用程序可以运行得更快。使用DataSocket技术进行通信时服务器和客户端得计算机上笔形都进行DataSocket Server。
DataSocket API提供独立的接口,用于不同的语言平台内部多种数据类型的通读。在LabVIEW中,DataSocket API被制作成ActiveX控件和一系列功能VI(Virtual Instrument),用户可以方便地使用。一般由服务器进行数据采集,根据需要将测量地数据写入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 允许终端用户选择连接的 DataSocket URL
(8) DS_FreeMemory 释放 DataSocket 库函数占用的内存
(9) DS_GetLibraryErrorString 返回描述库错误的字符串
DataSocket是一个独立于平台的解决方案,限于篇幅,此处不再给出DataSocket的示例程序,感兴趣的同学可以通过CVI安装目录下的samples中datasocket相关部分自行学习。
3.1.5 在CVI中使用音频动画
在许多测控系统中,常常需要加入音频、图像、动画或具有互动功能的3D模型。在本节中,我们将会详细介绍如何向应用程序中添加这些控件。
图像
在程序中添加图像相对比较简单,CVI中直接提供了图像控件,通过控件的帮助文档很容易掌握在GUI中添加图像以及通过程序更改图像的方法。
动画
动画控件是由Picture Ring(图像列表)控件转化而来,在编辑界面添加PictureRing之后,通过菜单-File-Open-Function Tree(*.fp),打开CVI安装目录下toolslib\custctrl\animate.fp文件,在CVI窗口的左下角即出现Animation Control的库。库中提供了如下四个函数:
(1) AnimateCtrl_Create 直接创建动画控件(此函数会自动在编辑界面添加Picture Ring控件,但不会自动给Picture Ring添加图片)
(2) AnimateCtrl_ConvertFromPictRing 将Picture Ring控件转换为动画控件
(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中使用SQL ToolKit
LabWindows/CVI SQLToolkit是一个用来访问数据库的软件工具包。工具包里包含了一个用来完成一般数据库任务的高级函数集。在其基础上,可实现定制任务等高级功能的开发。LabWindows/CVI SQL工具包提供若干ODBC数据库驱动器,工具包符合ODBC标准,因此对任何符合ODBC数据库驱动器均可使用。常见的Microsoft Office Access支持的.accdb、.mdb文件都可以通过ODBC数据库驱动器使用。
SQL Toolkit并不随CVI的安装发行包一起安装,用户若想使用CVI开发数据库需要额外从NI的官方网站下载:
ftp://ftp.ni.com/evaluation/cvi/pc/toolkits/NILWCVISQL220.exe
利用CVI SQL Toolkit进行数据库操作通常由以下五步完成:
连接数据库-激活SQL连接-处理SQL语句-断开SQL连接-断开数据库。
图 3‑5提供了使用SQL Toolkit实现数据库操作的流程图,一般对ODBC数据库进行操作都是根据图 3‑5的说明依次调用内部的函数实现的。
连接数据库
CVI提供的连接数据库的函数只有一个:DBConnect。
DBConnect的参数为ODBC连接字符串。ODBC连接字符串可以在ODBC数据源管理器(在“开始菜单”-“程序”-“管理工具”-“数据源 (ODBC)”中打开)的系统DSN中添加。如图 3‑4所示的第一个数据库的连接字符串应该为:
“DSN=CVI SQL Samples”
激活SQL连接
CVI提供了两种激活SQL连接的方式:自动SQL和显式SQL。自动SQL对应图 3‑5的DBBeginMap及下面的系列函数,只能构造简单的SELECT语句和CREATE TABLE语句。显式SQL对应图 3‑5的DBActivateSQL及下方的系列函数,可以执行更复杂的SELECT语句以及其他语句。
处理SQL语句
使用SELECT语句必须将选择的字段绑定到程序中的变量上。接着用取值函数获取所选记录。每次调用取值函数,工具包将列变量拷贝到在程序中绑定的变量。更新行或创建行时还可用绑定的变量,即更新行或创建行时将新值拷贝到绑定的变量并随后调用适当的函数,将程序中的数据添加到数据库对应的字段。CVI SQL Toolkit提供了DBMapColumnTo函数以及DBBindCol函数(如图 3‑5),帮助用户绑定数据库的对应数据到变量中。
断开SQL连接
SQL操作后,应该断开SQL连接来释放系统资源。对于自动SQL连接,使用DBDeactivateMap函数,对于显式SQL连接,使用DBDeactivateSQL函数。
断开数据库连接
数据库操作结束后,应该断开数据库连接来释放系统资源。CVI提供了DEDisconnect断开连接。
具体的函数使用说明参见CVI安装目录中bin\cvisqlref.chm的帮助文件。
从上面的图 3‑5可以看出,若不需要绑定变量,则可使用DBImmediateSQL执行一个SQL语句,更加方便快捷。
下面的例子给出了从数据库的USERS表中查找用户ID为2的用户名与用户年龄的完整代码。USER表数据库参见图 3‑6。其中ID为自动编号类型,UserName为文本类型,Age为数字类型。运行代码前,需要实现在数据源ODBC管理器中添加数据源名为“CVI SQL Samples”的mdf文件。
3.1.7 在CVI中使用剪贴板与动态数据交换(DDE)
剪贴板(ClipBoard)与动态数据交换(DDE,Dynamic Data Exchange)都是用于用于应用程序交换数据共享信息的工具和途径,广泛应用于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-Create ActiveX Controller…,打开创建ActiveX Controller Wizard,点击Next即可发现有大量可供我们使用的ActiveX控件。通过添加适当的ActiveX控件,我们不仅可以从常用的Office软件中写入、读取数据,操作数据库,获取与Matlab的接口以使用Matlab进行数据处理,还可以利用AutoCAD、QQ、IE、PowerDesigner、SolidWorks等诸多领域主流的软件的组件进行相关程序的编写。
限于篇幅,本节只以一个实例向大家介绍使用ActiveX控件开发应用程序的基本过程与方法。在这个实例中,我们将通过Microsoft Excel 9.0 Object Lib这个ActiveX控件打开Excel文件并向其中写入0~99这100个数据并将Excel文件保存在指定位置。
假设我们计算机上安装了Office2000。单击CVI菜单Tools-Create ActiveX Controller…,点击下一步,在ActiveX Server选项中找到Microsoft Excel 9.0,点击下一步,选择函数库.fp文件保存的位置之后,CVI即在当前工程中添加了Microsoft Excel 9.0 Object Lib的相关库文件。
若在计算机上安装的Office版本不是2000,那也没关系,从CVI安装目录中的“samples\activex\excel”中找到excel2000.fp、excel2000.h、excel2000.obj和excel2000.sub文件,将此四个文件复制到工程目录下,将fp文件添加到当前工程中之后同样可以达到添加Microsoft Excel 9.0 Object Lib库的功能。
在工程的C语言文件中输入以下代码:
上面的例子运行后,将会在系统的D盘根目录下多出一份叫做123.xls的Excel文件。打开Excel文件之后,发现Excel中数据如所示。
图 3‑7 ActiveX控件示例程序运行结果
在上面的例子中,我们依次通过获取Excel的程序句柄、获取Excel的工作簿组句柄、获取Excel的工作簿句柄、获取Excel的工作表组句柄、获取Excel的工作表句柄、获取Excel第一个工作表句柄,最终获取Excel工作表的范围句柄。获取了Excel工作表句柄之后便可对工作表指定区域内的内容进行操作了。操作结束之后,务必将获取的句柄逐个销毁,否则会导致系统资源被占用,生成的文件被占用,无法进行后续操作。
利用ActiveX控件在CVI下可以实现诸多有用的功能,但是仍然不可避免的存在有的ActiveX控件无法找到的问题。在Windows下可以“开始菜单”-“运行”中输入regsvr32命令以注册Active控件。详细信息可自行通过帮助文档或者Google查找。
3.2 自动化测试接口编程
3.2.1 综述
自动化测试系统(ATS,Automatic Test System)是指测试仪器在计算机的控制下,向被测对象按照一定的时序和顺序提供激励,同时对被测对象在该激励下的响应进行测量的系统。自从20世纪70年代惠普正式推出了第一种测试总线GPIB以来,先后出现了GPIB、VXI、PXI以及LXI等大量测试总线。
此外,在PC接口方面,PCI、ISA、RS232、USB、1394、CAN等总线也得到了广泛的发展和利用,也有不少总线如ISA总线因为带宽难以满足当今大部分的需求而逐渐退出历史舞台。
GPIB总线是在美国 HP公司一种1965年推出的的仪器接口系统 (HP-IB)发展起来的。GPIB接口具有以下基本特性:测试系统所使用的全部仪器和计算机均通过一组标准母线相互连接,仪器“并联”在系统内部,同时仪器之间可以直接 “通话”。 GPIB总线的母线由16条信号线构成,其器件容量为15台,在GPIB 系统中,GPIB接口共定义了10种接口功能:控者功能、讲者功能、听者功能,源方挂钩功能、受方挂钩功能,服务请求功能、并行查询功能、远程控制本功能、器件触发功能、器件清除功能。在2007年的第三季度,由测试与测量领导厂商发布的新型仪器中,超过80%含有GPIB接口。
VXI总线(VMEbus Extensions For Instrumentation)是于 1987年推出的总线规范 ,根据器件支持的通信协议,VXI器件分成4类:消息基器件、寄存器基器件、存储器器件、扩展器件。一个VXI机箱具有13个扩展槽 (1个系统槽和 12个仪器模块槽)。
PXI总线(PCI Extensions for Instrumentation)是 1997年发布的总线规范。 PXI是 PCI总线在仪器领域的扩展,与 CompactPCI兼容,可提供同步、触发和时钟等方面的信号,一个 PXI机箱具有 8个扩展槽 (1个系统槽和7个仪器模块槽)。
LXI总线((LAN Extension for Instrument)是由国际LXI联盟(LXI Consortium)针对GPIB传输速率低、VXI机箱昂贵并且需要零槽控制器、PXI尺寸电源以及EMI方面等问题而提出的一种低成本小体积的灵活的自动化测试总线技术。LXI在以太网的物理标准下,基于以太网的基础,提供了网络界面,并且具有可选择的触发方式(LAN,IEEE1588,Trigger Bus)。
VXI、PXI、PXIe、LXI都是VME、PCI、PCIe、LAN 等PC接口在自动化测试系统总线领域的延伸。不管是VME-VXI、PCI-PXI、PCIe-PXIe还是LAN-LXI,基本的物理传输层都没有改变或仅加入了测试系统需要的时钟同步、触发等信号线,在上层的协议中也很少发生改变,仅某些接口的机械构造发生了相应的改变。所以,PC上的接口驱动技术同样可以运用到自动化测试系统中。
世界上没有任何一种总线是万能的,每一种总线都具有不同的带宽、时延、性能、软件支持、鲁棒性、体积、传输距离乃至成本等特性,通过了解系统需求选用最合适的总线技术才最重要。图 3‑8列出了常用的测试总线技术的带宽与延时的性能的比较。
3.2.2 GPIB接口
GPIB是一种在业界已经得到证明的专为仪器控制应用设计的总线。GPIB在过去30年来一直是鲁棒的、可靠的通信总线,由于其低时延和可接受的带宽的特点,GPIB目前仍然是仪器控制中最常见的选择。GPIB的优势在于为业界广泛采纳,并有超过10,000种仪器模型带有GPIB接口。
由于其最大带宽为1.8 MB/s,GPIB最为适合与分立仪器通信,并对分立仪器进行控制。最新的高速版HS488将带宽提高到8 MB/s。GPIB中的数据传递采用基于信息的通信模式,并最常使用ASCII字符。多个GPIB仪器可以通过电缆连接,其总距为20米,带宽为总线上的所有仪器共享。虽然GPIB的带宽相对较低,但其时延要比USB尤其比以太网低得多(即性能好)。尽管GPIB有目前最好的软件,而且稳定的线缆和连接器也能适合最恶劣的物理环境,但GPIB仪器在连接到系统时,并不能自动检测或自动配置。对于现有仪器的自动化或要求高度专业化仪器的系统,GPIB是理想的选择。
图 3‑9 GPIB接口外观
图 3‑10 GPIB接口引脚图
除了地线外,GPIB接口一共具有16条信号线,分别为8条信号线(D1~D8)、3条挂钩线(DAV、NRED、NDAC)以及5条管理线(ATN、IFC、REN、EOI、SRQ)。各条线缆的作用如下:
(1) D1~D8:8条数据线,既可做输入又可做输出
(2) DAV(Data Valid):数据有效线,用于源方向受方发出通知可以从数据线上拉取数据
(3) NRED(Not Ready For Data):数据没有准备好,用于受方向源方发出通知以告知源方不能在数据线上传递消息
(4) NDAC(No Data Accepted):数据未接受:用于受方向源方通知至少还有一个器件尚未从数据线上拉取数据
(5) ATN(Attention):注意线,表示数据线上的数据是由现在总线上的主控器件发出的
(6) IFC(Interface Clear):接口清除线,用于现在总线上的主控器件要求其他器件的接口回到指定的初始状态
(7) REN(Remote Enable):远控可能线,用于现在总线上的主控器件发送REN消息,以使得接收者进入远地程控状态
(8) EOI(End Or Identify):结束或识别线,用于现在总线上的主控器件或者源方发送END(结束)消息或者IDY(识别)消息。
(9) SRQ(Service Request):服务请求线,由由服务请求的各器件共同使用,是各器件的逻辑或。
CVI对GPIB提供了函数库并提供了诸多强大的函数:
(1) OpenDev 寻找一个未使用的GPIB设备并打开设备
(2) ibdev 打开设备同时设置GPIB参数
(3) ibfind 通过设备名称获取设备的唯一描述符
(4) Ibpad 设置GPIB板主地址
(5) Ibsad 设置GPIB板辅助地址
(6) Ibbna 设置访问的GPIB板
(7) Ibtmo 设置超时限制
(8) Ibeos 设置字符串结束标志
(9) Ibeot 设置传输结束后是否发送消息
(10) Ibdma 设置是否启动直接内存访问模式
(11) Ibrsc 设置GPIB请求或者放弃系统控制
(12) Ibconfig 设置配置参数
(13) Ibask 获得配置参数
(14) ibrd 从设备中读出指定长度的数据
(15) ibrda 从设备中一部读出指定长度的数据
(16) ibrdf 从设备中读出数据并储存在指定的文件中
(17) ibwrt 向设备写入指定长度的数据
(18) ibwrta 向设备异步写入指定长度的数据
(19) ibwrtf 从指定文件中向设备写入数据
(20) ibstop 终止指定设备的异步I/O操作
(21) ibInstallCallback 安装GPIB回调函数
以上函数的详细使用说明参见CVI帮助文档,限于篇幅,此处不再做具体的示例与说明。
3.2.3 RS232接口
RS-232标准是美国电子工业协会(EIA)等于1969年开发并公布的通信协议,适用于传输速率在0~20kb/s的异步数据传输。
串行接口是计算机通信必不可少的标准配置,几乎每一台计算机、外设、智能仪器都配有标准串行接口。采用标准串行接口后,各种计算机、外部设备、智能仪器就能有机的连接起来进行串行通信。为方便用户进行 RS-232 编程,LabWindows/CVI 提供了RS-232函数库。
RS-232C 的机械指标规定: RS-232C接口通向外部的连接器 (插针插座) 是一种 “D”型 25 针插头。由于 25 芯中有许多是不常用的,IBM-PC 对其进行了简化,取了其中的常用的 9 芯,构成了 9 芯 RS-232C 串行接口,使其成为一种事实上的串行接口标准配置。RS-232C 的“D”型 9 针插头引脚定义如图 3‑11所示。
RS-232C 标准接口中的主要信号是“发送数据”和“接收数据” ,它们用来在两个系统或设备之间传送串行信息。对于异步通信,传输的串行位数据信息的单位是字符。
图 3‑12示出了 RS-232C以位串行方式传输数据的格式,这是微机系统中最通用的格式。7 位 ASCII 码数据的连续传送由最低有效数字位开始,而以奇偶校验位结束。应当指出,RS-232C 标准接口并不限于 ASCII 数据,事实上还可有 5 到 8 个数据位,后加一奇偶校验位,并有 1 或 2 位停止位。
在电性能方面,这一标准使用负逻辑。逻辑 1电平是在-15V 到-5V范围内,逻辑 0电平则在+5V到+15V范围内。 它要求 RS-232C接收器必须能识别低至+3V的信号作为逻辑 0,而识别高至-3V的信号作为逻辑 1,这意味着有 2V的噪声容限。RS-232C 进行数据传输的最高速率为 20KB/S,通信距离最长为 15m。
作为PC上最常用的工业接口之一,CVI提供的RS-232库同样具有强大的功能。常用的RS-232库函数如下:
(1) OpenComConfig 打开一个串行并进行相关的参数设置
(2) CloseCom 关闭一个串行口
(3) ComRd 从指定串行口的输入队列读取若干字节的信息
(4) ComRdByte 从指定串行口的输入队列读取一个字节的信息
(5) ComWrt 向指定串行口的输出队列写若干字节的信息
(6) ComWrtByte 向指定串行口的输出队列写一个字节的信息
(7) FlushInQ 清空指定串行口的输入队列
(8) FlushOutQ 清空指定串行口的输出队列
(9) GetInQLen 获取指定串行口输入队列内的字符数
(10) GetOutQLen 获取指定串行口输出队列内的字符数
(11) InstallComCallback 为指定串行口设置一个回调函数
下面即是一个向环境参数测量的单片机发送“gettemp”命令获取当前的温度值并且读取返回的值的例子。
编译以上代码,假设编译生成的exe程序名称为ComTest_dbg.exe,在命令行中输入“ComTest_dbg.exe gettemp”,则程序运行结果如图 3‑13所示。
3.2.4 VXI、PXI通信(VISA)
VXI、PXI作为应用最为广泛的自动化测试总线之一,在工业及自动化测试领域得到了广泛的应用。为此类设备开发驱动程序可以使用微软公司的WDM(Win32 Driver Model)模型进行开发,但由于自动化测试总线的高速发展,这样的驱动开发方法工作量相对较大且上层代码不具备通用性,因此CVI并没有直接提供VXI或者PXI的函数库。
VXI设备、PXI设备都遵从VPP(VXI Plug and Play)规范,其驱动程序都使用单一的标准结构。因此,NI等公司提出来了虚拟仪器软件架构(VISA,Virtual Instrumentation Software Architecture)给符合VPP硬件规范的接口设备提供了软件规范与统一的驱动。全世界虚拟仪器厂家以该接口软件作为底层函数库来开发虚拟仪器程序,可以使不同厂商的软件在同一平台上协调运行。这大大减少了软件的重复开发,缩短了测试应用程序的开发周期。
对于驱动程序、应用程序开发者而言,VISA 库函数是一套可方便调用的函数,其中核心函数可控制各种类型设备,而不用考虑设备的接口类型。用户可以用同一套函数为GPIB设备、VXI 设备等各种类型设备编写软件,不必再学习不同厂家、不同接口类型的不同 I/O接口软件的使用方法。而且因为 VISA 可工作在各厂商的多种平台上,可以对不同接口类型的设备调用相同的 VISA 函数,用户利用 VISA 开发的软件具有更好的可移植性。
关于VISA的具体的内容将会在第5 章“基于CVI的外设驱动开发”中予以详细介绍。
3.3 示例:串口调试助手
本示例利用LabWindows/CVI 的RS-232函数库实现简易串口调试助手的功能。下面给出参考例程,具体步骤如下:
编辑UI、设置控件属性
在用户界面编辑器里创建用户界面并配置好各控件属性。主要控件的设置参见表 3‑1。面板如图 3‑14所示:
面板或控件类型 | Constant Name | Label | Callback Function |
Panel | PANEL | 串口演示 | |
Ring | COMSELECT | 请选择串口 | |
Ring | BTLSELECT | 请选择波特率 | |
Ring | JYSELECT | 请选择奇偶校验模式 | |
Ring | LONGSELECT | 请选择数据位数 | |
Ring | STOPSELECT | 请选择停止位数 | |
Command Button | OPEN_COM | 打开串口 | ComOpen |
Command Button | CLOSE_COM | 关闭串口 | ComClose |
Text Box | SENDTEXT | 发送字符串 | |
Command Button | SEND | 发送 | Send |
Command Button | CLEARSEND | 清空发送框 | ClearTextBox |
Text Box | RECIVETEXT | 接收字符串 | |
Command Button | RECIEVE | 接收 | Recieve |
Command Button | CLEARRECIVE | 清空接收框 | ClearTextBox |
Command Button | QUIT | 退出 | Quit |
除此之外,还需要修改某些控件的属性,修改步骤如下:
·编辑COMSELECT控件的Label/Value属性,向控件添加项目的Label分别为串口1、串口2,相应的Value值为1、2,数据类型为整数。
·编辑BTLSELECT控件的Label/Value属性,向控件添加项目的Label分别为1200、2400、4800、9600、19200,相应的Value值为1200、2400、4800、9600、19200,数据类型为整数。
·编辑JYSELECT控件的Label/Value属性,向控件添加项目的Label分别为奇校验、偶校验、无校验,相应的Value值为1、2、0,数据类型为整数。
·编辑LONGSELECT控件的Label/Value属性,向控件添加项目的Label分别为7、8、9,相应的Value值为7、8、9,数据类型为整数。
·编辑STOPSELECT控件的Label/Value属性,向控件添加项目的Label分别为1、2,相应的Value值为1、2,数据类型为整数。
·编辑两个文本框的属性:Text Box Options…-Enter Key Causes Newline以允许在文本框中输入多行文本。
生成并编辑代码
保存文件com.uir。使用代码生成器生成源文件程序框架。添加控件的回调函数,添加完毕后,所有代码如下所示:
编译连接、功能测试
编译并调试程序。为了方便的使用一台计算机即可进行测试,可以采用以下方法之一:
·在测试前在硬件上将串行口的RXD和TXD引脚短接
·使用两个串口并用串口线互相连接
·使用虚拟串口软件(如Eltima Virtual Serial Port Driver)创建两个互相连通的虚拟端口
测试结果
在此我们采用第一种将RXD与TXD短接的方法进行测试。
配置好参数,打开串口之后,在发送字符串文本框中输入一段文字,点击发送之后,点击接收,即可在接受字符串文本框中看到接收到的字符与发送的字符一致。如图 3‑15所示。
3.4 探索与实验
3.4.1 实验
在串口调试助手的基础上扩展功能,具体功能及测试要求见表 3‑2。
功能要求 |
测试要求 |
串口调试 |
完成基本的串口调试助手功能(含定时发送) |
即时显示 |
接收到的数据可以即时在文本框中显示出来 |
十六进制支持 |
支持十六进制数据的发送和接收 |
波形显示 |
将接受到的数据转换在波形图上实时显示 |
文件存取 |
将接受和发送的数据存文件,能通过控件读取 |
3.4.2 探究
通过查阅资料详细了解VME、VXI、PCI、PCIe、PXI、PXIe、MXI、GPIB、LXI等测试总线的协议文档,了解各总线的物理层的构造,机械构造以及EMI等设计上的改进并尝试通过各总线物理层上的改变探索总线的发展趋势与发展方向。