1、目录引 言11 基于网络的虚拟仪器测试系统12 开发工具和Agilent VISA库介绍4事件是那些需要你的应用程序关注的特指事件。事件类型包括服务请求,中断和63 函数信号发生器74 示波器模块24xorigin:在内存中的第一个数据值275 万用表模块30*RST /复位万用表316 测试系统的测试举例337开发的心得和体会388 结论39if(error!=VI_SUCCESS)44switch(m_nID)55引 言著名科学家门捷列夫说:“没有测量,就没有科学”。测量科学的先驱凯尔文又说,一个事物你如果能够测量它,并且能用数字来表达它,你对它就有了深刻的了解;但如果你不知道如何测量它,
2、且不能用数字表达它,那么你的知识可能就是贫瘠的,是不令人满意的。测量是知识的起点,也是你进入科学殿堂的开端。1 基于网络的虚拟仪器测试系统1.1 概述随着计算机技术、通信技术与仪器技术的不断发展,使得虚拟仪器得到了进一步发展,虚拟仪器将计算机资源与仪器硬件、数字信号处理技术结合,把厂家定义仪器功能的方式转变为由用户自己定义仪器功能。用户可根据测试的需要,自己设计所需要的仪器系统,利用一种或多种功能的通用模块,调用不同功能的软件模块,组成不同的仪器功能。在虚拟仪器中,计算机成为仪器的一部分,使得计算机可以得到充分发挥。除了仪器的输入、输出、数据处理分析、结果显示由计算机完成外,还可组成计算机网络
3、。一个大的复杂的测试系统往往系统的测量、输入、输出、结果分析分布在不同的地理位置,仅用一台计算机并不能胜任测试任务,需要由分布在不同地理位置的若干计算机共同完成整个测试任务。计算机网络技术、总线技术的发展,乃至Internet网的发展拓展了虚拟仪器测试系统的应用范围。利用网络技术将分散在不同地理位置不同功能的测试设备联系在一起,使昂贵的硬件设备、软件在网络内得以共享,减少了设备重复投资。一台计算机采集的数据可以立即传输到另一台处理分析机上进行处理分析,分析后的结果可被执行机构、设计师查询使用,使数据采集、传输、处理分析成为一体,容易实现实时采集、实时监测。重要的数据实行多机备份,提高了系统的可
4、靠性。对于有些危险的、环境恶劣的不适合人员操作的数据采集工作可实行远程采集,将采集的数据放在服务器中供用户使用。1.2 虚拟仪器网络测试系统设计虚拟仪器网络测试系统的设计需从虚拟仪器和网络技术两方面考虑。1.2.1虚拟仪器部分分析测试系统的要求和系统的功能,根据系统功能的要求,在软件和硬件之间进行优化选择,从而确定仪器所必需的硬件模块,以便用最少的模块实现仪器的最佳功能。根据应用情况与实际的条件选择基于计算机的虚拟仪器的仪器模块(VXI总线、PCI总线、PXI总线、GPIB仪器),包括示波器、信号调理电路、万用表、信号源等模块。硬件确定以后,主要确定软件功能模块,哪些仪器功能由软件实现,将软件
5、功能划分为相对独立的模块。然后选择易于编写的图形化的软件平台。Virsual C+6.0是一种面向对象的通用的功能强大的程序设计语言,提供集成性及可视化用户界面,采用面向对象的程序设计方法,它具有底层操作功能,也具有数据库开发功能,编程灵活,因此也是编程人员常选用的编程语言,我也用VC+编写了虚拟仪器平台,可以组建虚拟信号发生器、虚拟示波器、数据采集。1.2.2网络结构设计根据测试系统各部分所处的地理位置和覆盖的范围不同可构建局域网、城域网、广域网。一个大的复杂的测试系统由各个子系统组成,每个子系统一般在一个单位的小范围内,因此可建立局域网,然后将每个局域网互联,形成企业测量系统。由于Inte
6、rnet网的发展,一些公用的数据还可以通过Internet网将测量数据发布到网上供网上用户使用,可建立测量发布系统。对于有些危险的、环境恶劣的不适合人员操作的数据采集工作可实行远程采集。由于网络测试中每个测试点担任不同的测试任务,为了减少不必要的重复工作,通过网络实现资源共享,同时要减轻服务器与各节点的数据传输,提高网络系统性能,因此服务器和各个节点以及各节点之间协同工作显得尤为重要。基于Client/Server模式的分布式计算、分布式处理系统是解决这个问题的最好选择。基于C/S模式,将系统功能分解到各个节点,各个节点有机配合,用户在自己的终端上就可以观察到从服务器中获取的数据和处理结果。在
7、C/S中,分客户机(Client)程序和服务器(Sewer)程序。客户机程序和服务器程序可以运行在一台计算机中,也可运行在两台或多台计算机中,Client程序与Server程序相互协同处理,一个测试系统由一个或承担不同任务的多个客户机与一个或多个服务器组成。客户机是用户与系统的交互接口,提供一个用户界面,完成用户命令与数据的输入,显示服务器送回的结果。服务器接受客户机提出的申请,完成所要求的操作并将结果传送给用户。在一个测试系统中,根据任务不同,每个服务器和客户机承担的任务也不同,例如可划分为采集、数据处理分析、输出、监控。一台计算机采集外部数据,将采集的数据存储并传输给另一台计算机,它就是服
8、务器,另外它又需要得到远地计算机的数据,这时它又成为客户机。C/S模式是一种开放式系统的协同处理工作模式。设计C/S模式时应首先分析系统所要达到的指标和功能要求,在此基础上,把系统划分为各个相对独立的模块,分配到各个计算机上,每个计算机执行不同的功能,能在客户机上完成的独立任务就不要放在服务器上,以减低服务器的工作量。第二,要保证数据在服务器和客户机、客户机间可靠的传输。设计时需考虑网络的带宽要满足传输要求,并减少网络数据传输量。Agilent IO库允许通过LAN进行仪器的控制操作。使用标准的LAN接口,计算机可以不要特殊的仪器接口就可以实现对仪器的控制。LAN软件使用计算机的C/S模式,这
9、种模式使得应用程序(客户)可以不用执行所有的工作,相反,客户机可以向另一台仪器(服务器)发出某种请求。与可控仪器或器件相连的LAN服务器,一旦完成仪器或器件的请求,LAN服务器会反馈信息给客户机。反馈的信息包括数据和状态等表明操作是否成功的信息。例如网关在LAN软件(客户机支持)和器件支持的仪器接口之间扮演一个服务器的角色。基本结构如图:图11LAN软件结构:该结构中,包含了LAN客户软件和LAN软件(TCP/IP)(用于访问服务器gateway)。网关包含了LAN服务器软件,LAN(TCP/IP)软件以及用于和客户机通讯和控制仪器的仪器驱动软件。 图121.2.3软件设计与硬件结构相对应,软
10、件结构可分为网络测控系统控制主模块,是系统控制的中枢,连接和控制各子模块;虚拟信号源、虚拟万用表和虚拟示波器等模块,是控制相应台式仪器,使其完全能处于远程虚拟控制状态,给测控对象提供激励信号,并监视受控对象输出特性变化;虚拟VXI仪器和信号调理模块是控制SCXI和VXI硬件模块仪器进行模拟量数据采集与开关量对象控制,包括数据处理;图象采集模块,包括采集现场景物视频图象和有形对象的图象采集.与图象处理;网络通信模块承担不同总线模块与主模块之间的数据传输与通信,也是实现本测控系统与远程用户之间的控制与数据传送。每个虚拟仪器模块内部都封装了对应仪器状态控制命令集、数据采集命令集、数据处理模型以及通信
11、协议等处理子模块。下面的第三章至第五章介绍的就是函数信号发生器、示波器以及万用表模块的设计和具体的编程。下面让我们先来了解一下VC+6.0开发工具和Agilent VISA库。2 开发工具和Agilent VISA库介绍 Visual C+6.0是一套功能强大面向对象的且具有集成编辑器及编译器的编程语言开发平台。今天我们所使用的许多应用软件,大部分是利用C语言来进行编写的。Visual C+6.0没有很复杂的开发界面,给用户的开发以很大的灵活性。2.1 Visual C+6.0的特点 在众多的程序语言中,Visual C+6.0是具有编辑和编译的集成开发环境。通过 Visual C+6.0的编
12、辑功能,可以方便的设计程序。它的编辑功能可以随时让我们了解到程序的结构、流程以及对象的成员,而完成程序设计之后,也不必经过复杂的编译程序,而且给出的错误警告可以很方便的进行定位操作,这给程序设计人员以方便。2.2 IDE的集成开发环境界面IDE就是Integrated Development Enviroment的缩写,是将程序代码的编写(editor)、编译(Compiler)、执行(execution)以及纠错(debug)等功能汇集一身的单一整合性的界面,提供程序开发过程所需要的相关或扩展服务,让用户只需要通过此环境便可以轻松完成程序工程。2.3 Agilent VISA纵览 VISA是
13、Agilent IO库的一个部分。Agilent IO库由两个部分组成:VISA和SICL。Agilent VISA是根据VXIpp系统联盟的规定设计的,它允许由不同的厂商开发的软件能在同一个系统中运行。 如果你想在你的应用程序中使用VXIpp仪器驱动或者是想是自己开发的IO应用软件或仪器驱动能符合VXIpp的标准,就需要使用VISA。如果你使用新的仪器或开发IO应用程序以及仪器驱动的话,也应该使用VISA。 Agilent VISA 是一个IO库,可以用来开发符合VXIpp标准的IO应用软件和仪器的驱动。使用VISA开发的应用软件和仪器驱动可以在使用VISA IO库的VXIpp主机上运行。因
14、此,不同厂商开发的应用软件可以在同一个系统中运行。 32位版本的VISA能在Windows 95 98 Me以及NT和2000中使用。C,C+和Visual Basic在这些系统中都被支持。 对与Windows,VISA支持GPIB、VXI、GPIB-VXI、Serial(RS-232)以及局域网接口。在Windows NT中,对VXI接口支持的VISA仅能运行在Agilent 嵌入式的VXI控制器产品中。一台网络计算机能够通过网络访问配置VISA地址譬如GPIB接口地址上的仪器。2.4 VISA编程 在VISA的编程中需要了解VISA的一些机制: VISA的资源和属性、会话使用、发送I/O命
15、令、使用事件与句柄、捕抓错误等等。VISA资源:在VISA中,任何VISA可以提供通讯的器件(如电压表)都可以定义为一种资源。对于一个完善的VISA系统,VISA定义完全符合VXI即插即用联盟的规范的六种资源类可以被执行。VISA属性: 属性是和各种资源或会话相关联的。你可以使用属性来决定资源或会话的状态或设置资源或会话为指定的状态。譬如,你可以通过viGetAttribute函数来读取指定会话、事件、查找列表的属性的状态。有只读和读写的属性。通过使用viSetAttribute函数来修改指定的会话、事件或查找列表的读写属性。传递给viGetAttribute函数的指针必须指向那个属性的准确类
16、型:ViUInt16,ViInt32,等等。譬如,当读取一个返回ViUInt16值的属性的状态时,你必须声明那个属性的变量和使用它来存储返回的数值。如果ViString被返回,你必须分配一个数组和传递那个数组的指针给那个返回的数值。 对于C和C+程序,你必须在每一个文件的开始处添加包含VISA调用函数visa.h头文件:#include “visa.h”这个头文件包含了VISA函数的原型的声明和所有VISA的常量和错误代码的定义。Visa.h头文件也包含了visatype.h头文件。该visatype.h头文件对VISA的所有类型进行了定义。VISA的各种类型贯穿了整个VISA,对函数中用到的
17、数据进行类型定义。 而关于会话,会话其实是一个通讯通道。会话必须在默认的资源管理器中被首先打开,接着是你将会使用的每一种资源。首先,你必须通过默认资源管理器的viOpenDefaultRM函数来建立一个会话。这个函数的第一次调用用来初始化默认的资源管理器并返回该资源管理器会话的会话。你仅需要打开默认资源管理器一次就可以了。然而,后来的对viOpenDefaultRM函数的调用则返回同样的默认资源管理器资源的唯一的会话。接下来,你利用viOpen函数对指定的资源打开一个会话。而在退出程序的时候需要多打开的会话进行关闭操作,在关闭每一个会话时,必须调用viClose函数以释放掉分配给该会话的数据资
18、源。你如果关闭默认的资源管理器会话,则所有被该会话打开的会话将会被关闭。当你为一个器件建立一个通讯会话时,通过使用VISA的I/O程序来启动与该器件的通讯。VISA提供了格式化和非格式化的程序。q 格式化I/O将对格式化字符下的混合数据类型进行转换。数据被存在数据缓冲器中,因此是接口的通讯得到最大的优化。q 非格式化I/O口向一个器件发送或接收原始数据。通过非格式化I/O,数据并不进行格式化或相应的转换。因此,如果要求格式化数据,它必须通过用户自己来定义。 事件是那些需要你的应用程序关注的特指事件。事件类型包括服务请求,中断和硬件触发。事件不会被传递,除非相应的事件被启用。注意:VISA不能回
19、调VB函数。因此,你只能使用函数ViEnableEvent来使用队列机制。在VB中不能安装VISA事件句柄。当事件发生时,有两种方式来接收通知消息:函数回调法和队列法 当一个事件需要立即相应时,可以使用回调函数法。使用回调函数法来接收事发生时的通知消息。当使能事件发生时,安装的事件句柄会被调用。可以使用函数viInstallHandler安装事件句柄,而使用函数viEnableEvent来启动一个或多个事件。VISA允许应用程序在同一个会话中对一种事件类型安装多个句柄。多个句柄可以通过多次调用函数viInstallHandler来安装。每次调用添加到前面的句柄列表中。如果一个事件类型被安装了多
20、个句柄,当指定的事件发生时,每一个句柄会被调用。VISA指出,句柄的调用的顺序是后进先出的顺序。当需要安装句柄时,使用下面的函数:viInstallHandler(vi, eventType, handler, userHandle); 当你的应用程序捕需要及时相应时,队列法通常被使用。为了使用队列法来接收事件发生时的通知消息,步骤如下:n 使用函数viEnableEvent来使能一个或多个事件。n 当准备查询时,使用函数viWaitOnEvent来检查队列事件。如果指定的事件发生,事件信息将会被取得,程序立即返回。如果指定的事件没有发生,应用程序挂起直至指定的事件发生或指定的超时时间到来。3
21、 函数信号发生器3.1 Agilent 33250A 80 MHz 函数/ 任意波形发生器介绍Agilent Technologies 33250A 是高性能的 80 MHz 复合函数发生器,其具有内置任意波形和脉冲功能函数发生器,其80MHz带宽能适应各种各样的应用要求,它具有各种内置信号、自定义的任意波形和脉冲能力,能帮助您验证设计,检验新的构想。直接数字合成技术能获得稳定、精确和低失真的输出信号。Agilent 33250A能提供您需要的所有波形,其输出频率更高达80MHz。标准输出包括正弦波、方波、斜波、噪声波、sin(x)/x、真流和其它波形。当标准信号还不能满足您的要求时,3325
22、0A可简化生成任意波形的过程,并赠强这些自定义信号的性能。现在通过达200MSa/s的采样率,12bit分辨率和64K点的存储器深度,您可建立无限多种信号,以精确适应您的应用要求。同时具备工作台特性和系统特性是满足您目前及未来测试需求的多用途解决方案Agilent Technologies 33250A 的特点如下: 10 个标准波形 内置的 12 位 200 MSa/s 任意波形功能 具有可调边沿时间的精确脉冲波形功能 LCD 彩色显示器可提供数字和图形视图 易用的旋钮和数字小键盘 仪器状态存储器用户可自定义名称 带有防滑支脚的便携式耐用机箱灵活的系统特性 四个可下载的 64K 点任意波形存
23、储器 GPIB (IEEE-488) 接口和 RS-232 接口为标准配置 SCPI 可编程仪器的标准命令兼容Agilent Technologies 33250A 函数/ 任意波形发生器的技术参数如下:波形 标准波形正弦波、方波、斜波、脉冲、噪声、SIN(x)/x,指数上升和下降、心律波、真流电压 任意波形波形长度164K点非易失性存储器4个波形(每一个汉形164K点)幅度分辨率12bit采样率200MSa/s 频率特性正弦波1Hz80MHz 白噪声 50MHz带宽 方波1Hz80MHz分辨率 1Hz,除脉冲为5个字 三角波1Hz1MHz准确度0.3ppm,(18) 斜波500Hz50MHz
24、THD(dc20kHz) 0.2%+1mVrms 其它特性幅度(至50) 10mVpp10Vpp准确度(1kHz) 1%设置值1mVpp 调制AMFSK调制任何内部波形 内部速率2mHz1MHz频率2mHz20kHz频率范围 1Hz80MHz 深度0%120% FM脉冲列 调制任何内部波形 波形频率 1Hz80MHz频率2mHz20kHz计数11,000,000或无穷多个周期 偏移dc80MHz 起始/停止相位-360+360 内部周期 1500s 扫描类型线性或对数扫描时间 1ms500s方向上或下 标记同步信号下降沿 起动F/停止F100Hz至80MHz(可编程) 时钟基准外部锁定范围10
25、MHzkHz内部频率10MHz 3.2 对函数/任意波形发生器的远端编程控制3.2.1 编程的准备工作了解函数信号发生器的功能特点:因为我要操作的函数信号发生器的型号是Agilent Technologies 33250A。所以,上网去搜索关于该型号的资源。在安捷伦中国的网站上查找到了相关的文件资源。并通过阅读了解了远程控制仪器的方法(通过VISA I/O库对输入输出操作的支持,并使用该仪器的SCPIstandard command for programmable instrument命令来对仪器进行相关的操作。通过查看“自动测试系统”课本上的例子,对自己编写函数信号发生器的界面有了一定的模
26、型和认识。接下来就是去了解VISA I/O库。通过殷老师提供给我的资料,并通过阅读,对VISA库中的操作函数有了一定的认识。如下给出的程序: 这个例子程序的功能是查询GPIB器件的型号,并输出结果。#include #include /这里是头文件,因为需要使用VISA的数据类型和函数void main () ViSession defaultRM, vi;/变量的声明char buf 256 = 0;viOpenDefaultRM(&defaultRM);/打开地址为22的GPIB器件viOpen(defaultRM, GPIB0:22:INSTR,VI_NULL,VI_NULL,&vi);
27、viPrintf(vi, *RSTn);/初始化器件viPrintf(vi, *IDN?n);/查询器件的型号viScanf(vi, %t, buf);/读取结果printf(Instrument identification string: %sn, buf);/打印结果viClose(vi);/关闭会话viClose(defaultRM);这里涉及到了5个VISA函数:viOpenDefaultRM,viOpen,viPrintf,viScanf,viClose。在我后来的编程过程中,也基本上就用到了这几个函数的功能。viOpen函数的功能是建立一个指定器件的会话的通道,而会话具有一个标识
28、,该标识可以被VISA库的其他函数进行调用。这个函数很重要,因为你如果需要跟一个器件通讯,就必须通过该函数来进行会话的建立。函数viOpenDefaultRM用来打开默认资源管理器的会话,必须是第一个打开。这个函数初始化资源管理器,并返回该会话的指针。以供其他函数使用。而函数viPrintf和viScanf这两个函数在用的编程中的比例是最多的,我发送SCPI指令就是通过这两个函数来进行的。函数viClose是用于关闭每一个会话的。当你关闭一个会话时,所有为会话分配的数据结构都会被释放掉。当你使用这个函数关闭默认资源管理器时,所有通过该会话打开的其他会话将会被关闭。通过阅读VISA手册,懂得如何
29、配置VC参数从而可以正常的进行操作。利用VISA来进行编程,需要链接VISA库VISA32.LIB。对VC编译器配置如下:选择Project-Settings并选择C/C+按钮,从类型列表中选择Code Generation,从运行库列表中选择Multi-Threaded using DLL。(VISA在WIN32环境下需要这些配置)选择Project-Settings点击link按钮并添加visa32.lib库到Object/Library Modules列表中。换一种方法是,直接添加库到你的工程文件夹中。头文件和库文件的搜索路径也可以进行更改:选择Tools-Options点击Direct
30、ories按钮,就可以对头文件和库文件的路径进行更改了。在VISA中也学习了几个接口的编程。VISA支持三种接口来访问GPIB和VXI仪器:GPIB,VXI和GPIB-VXI。通过这三种接口可以对GPIB和VXI器件进行编程。当你使用GPIB-VXI或VXI接口直接访问VXI主机时。你必须知道你所要进行的编程的仪器时基于消息基还是寄存器基的VXI器件。消息基的VXI器件拥有自己的处理器来识别高级的命令,譬如,SCPI(可编程仪器标准命令)。当使用VISA时,你利用VISA的输出函数来发送SCPI命令。接着,消息基器件就会解释SCPI命令。在这种情况下,就可以使用VISA的格式化IO或非格式化I
31、O含糊来对消息基器件进行编程。如果消息基器件有共享内存,可以通过对寄存器的PEEK和POKE操作来访问器件的共享内存。VISA提供两个不同的方法对寄存器进行编程:高级内存函数或低级内存函数。而寄存器基的VXI器件没有处理器来处理高级的命令。因此,只有通过寄存器的PEEK和POKE命令直接对器件的寄存器进行编程。VISA提供了两种不同的方法来对寄存器基的器件进行编程:高级内存函数低级内存函数。下面是一个关于GPIB接口的示意图:一台装有多个GPIB卡(PCI和ISA)的PC机和通过GPIB电缆与GPIB卡相连的多台GPIB仪器组成。PC机和仪器之间的通讯是通过GPIB卡和GPIB电缆来实现的。如
32、下所示: 图31如下面的例子:GPIB接口系统由装由两个82350GPIB卡的PC机和三台GPIB仪器通过GPIB电缆进行连接。通过IO组件对GPIB卡1和2分别配置一个VISA名字GPIB0和GPIB1。这样VISA库就可以对其进行寻址操作了,如下图:图32而其他的接口类型的配置与连接也是大同小异。对仪器进行编程之前还需要熟悉一下Agilent IO库的相关知识。从Agilent IO 的安装向导PDF电子资料中了解到了相关的知识点,也知道了该库的重要作用。Agilent IO库软件由两个库和四个IO配置组建加上一个IO库控制组成。两个库为Agilent VISA 和Agilent SICL
33、。Agilent VISAAgilent Virtual Instrument Software Architecture(VISA)是一个开发符合VXIplug&play标准的I/O应用程序和仪器驱动。而Agilent SICLAgilent Standard Instrument Control Library(SICL)是一个Agilent开发的适合许多IO接口的IO库。四个IO配置组建中的IO配置是被Agilent IO库用来对仪器的IO硬件接口进行配置。一个硬件接口在被Agilent IO库使用之前必须被IO配置组建进行配置之后才能使用。而VISA助手则是一个应用程序,可以控制和与V
34、XI,GPIB以及Serial仪器进行通讯。这是一个比较好的帮助软件,可以了解到仪器的地址,在编程之前,对相关指令测试操作,以熟悉操作指令。也可以通过它来了解到连接的相关情况。我在三个模块的编程过程中,经常通过该组建来了解相关的信息。其他两个组件则用的不多。VXI 资源管理器是用来显示你的系统是否进行适当的配置,它需要你的系统安装有E8491 IEEE-1394 PC Link to VXI 接口;而LAN Server是通过IO Config对系统进行LAN Server的配置。了解了IO库的介绍性知识,随后又对如何利用IO库对接口进行配置的章节进行的阅读。一个IO接口可以被定义为硬件接口和
35、软件接口。IO Config组件使用的目的是将一个唯一的软件接口名字和一个硬件接口联系起来。IO库使用接口名字或逻辑单元数字来对接口进行标识。这个信息在VISA程序中被函数viOpen作为一个参数进行调用或在SICL程序中被函数iopen进行调用。IO Config分配一个接口名字和一个逻辑单元数字给一个硬件接口,就象其他接口配置参数一样。当IO接口配置完之后,就可以使用Agilent VISA或Agilent SICL库对分配的仪器进行编程了。比如,下图中显示的是对通过GPIB接口和PC进行连接的GPIB仪器进行VISA和SICL寻址操作。图33譬如对GPIB(82357USB)接口进行配置
36、,为了对82357USB/GPIB接口进行配置,启动IO Config组件,并在左边的有效接口类型中选中GPIB 82357USB to GPIB如下图:图34如果在你的系统中有多个82357接口,则在配置窗口中会显示出来。选择你想进行配置的接口的Serial Number并单击OK会显示82357 USB to GPIB配置窗口。在出现的窗口中设置VISA 接口名字,SICL接口名字,逻辑单元以及总线地址。如果你的系统中有多个82357接口的话,重复配置。图35对PCI接口82350和82341ISA接口的配置也是类似。对VISA和IO库以及其相关的组件有了一定的认识之后,通过网上和书本上的
37、资料了解了函数信号发生器的基本功能和相关的参数,我便开始了界面的设计以及编程的构思。3.2.2 函数信号发生器的界面以及编程构思因为我要完成三个模块的设计:33250A函数信号发生器,54622D示波器以及E1412A万用表的设计工作,所以最初的设计是设计一个主界面,通过三个按钮的点击来分别进入不同的模块如下图所示:图36后来通过考虑,感觉这样的设计不够人性化和可操作性,也不太符合实际情况。所以通过反复的修改最终是如下所示:图37这样的设计自己的感觉是比较满意的。从主界面上可以一目了然的知道软件的功能。三个功能模块,通过按钮来进行操作,而左边的列表是通过下面的按钮来进行查找的。开始是,建立会话
38、是处于屏蔽状态,通过查找资源按钮来进行资源的查找工作,并将查找到的资源一一的列在列表框中。用户可以通过双击任一个资源地址来激化建立会话按钮并进行会话的建立工作。会话是否成功的建立会给出提示信息,以确保用户的正确操作和使用。建立会话后,将会把建立会话按钮变为关闭会话按钮,来进行会话的关闭操作。也可以通过进入相应的模块操作之后来对该按钮进行屏蔽操作。进入相关的模块的时候,无需用的对资源地址的记忆,程序会对用户的操作进行判断,以确保用户进入正确的模块中。函数信号发生器模块的界面如下:图38在该模块中可以完成几种基本波形的产生以及各种基本的调试功能:正弦波,三角波,方波,锯齿波,任意波等;调幅,调频,
39、脉冲调制,频移键控;可以修改频率,幅度,偏置以及占空比;可以配置输出阻抗何同步信号。在该界面中还存在复位按钮以及硬件连接按钮,方便用户的测试。从整体上看,符合人们的操作习惯。自己认为也还可以,也不失有点人性化吧!其实,在界面的设计过程中,也一边开始程序的构思。基本上界面是根据信号发生器的信号的产生过程及顺序以及编程的思路来进行安排的,界面的定型也就意味着自己的编程思路已经基本成型了!下面是自己的编程思路结构:进入模块各个参数初始化用户对参数的手动设置正弦波,无调制等的设置执行命令硬件的测试和复位操作成功或失败给出提示信息返回操作界面给出提示信息失败成功以上就是我的函数信号发生器的编程思想和设计
40、思路。这是一个最基本的函数信号发生器模块,具备基本的功能参数。有了界面和思路之后就可以进行底下的编程操作了。3.2.3 函数信号发生器的编程首先,需要能使函数信号发生器根据用户的输入来产生相应的波形。我于是参看了33250A 80MHz的函数/任意波形发生器的电子资料以及网上关于该仪器的操作的SCPI指令。 就像前面所说的那样,函数信号发生器是基于消息基,也就是说它具有自己的处理器来对用户输入的高级指令进行解释和判断以及进行执行操作。譬如,如果希望产生一个正弦波,则输入下面的语句既可:viPrintf(funcgen,function :shape sinn);就可以产生一个采用默认频率和幅值
41、的正弦波了!而viPrintf()就是VISA库中的格式化输入输出操作函数,用来向仪器发送SCPI指令。在函数信号发生器的编程过程中,经常需要用到这个函数,还有格式化输入函数:viScanf()。在指令的测试过程中,也遇到了一些问题:如viPrintf(funcgen,func:shape tri;freq 2000;volt 2n);这条指令就有问题,只能显示三角波,但是后面的参数就没有根据我的指定来进行显示。后来才发现,原来每一个指令后面加上回车符就可以正常的执行了。譬如,下面一条语句:viQueryf(funcgen,AM:SOUR?,buf);该语句的功能是查询AM的调制源的类型并将查
42、询到的类型字符以%t的格式给buf。注意:该语句是没有错误,但是好像就没有起到预期的效果。而当我在AM:SOUR?n加上一个回车符后,就可以执行正确了。可以看出格式化命令是以回车符作为触发命令的,只有n才能使命令有效,舍去将视为字符串处理。(但程序本身并不提示错误)又如,产生象使用APPL命令的波形:Appl:sin freq,volt,dcoffsetn,当使用其他函数产生时,如下:FUNC SINnFREQ freqnVOLT voltnn或是FUNC SINn;FREQ freqn;VOLT voltn;n可以看出执行指令都加上了回车符(对于象这样的一串执行指令,也可以在末尾加n来执行只
43、是需要使用分号来进行隔开,用逗号和空格均不行)下面是复位按钮的执行代码: 图39原理是通过向仪器发送IDN的SCPI指令根据函数返回值来进行判断,并给出相关的信息提示用户。除了SCPI命令外,还有IEEE 488.2命令,两种命令之间用分号隔开如下所示:RST;OUTP:LOAD INFn 又如:TRIG:SOUR BUS;TRGn连接多个SCPI命令时,使用分号和冒号(冒号表示不同的命令系统)如:OUTP:LOAD 50;:APPL:RAMP注意:函数viPrintf()和viScanf()都是单向的传送命令和数据,而函数viQueryf()则是双向的传送数据和命令。在格式化命令中不允许有两
44、条如似的命令FREQ?n VOLT?n。在我的测试命令以及组合发送命令过程中,我遇到这样的问题:Cstring m_sFreq,m_sVolt; viQueryf(vi,Freq?n,%t,m_sFreq); viQueryf(vi,Volt?n,%t,m_sVolt);SetDlgItemText(ID0,m_sFreq);SetDlgItemText(ID1,m_sVolt);如果以这种方式执行的话,执行的结果是m_sFreq和m_sVolt是同一个值,当把语句改为如下的形式的时候就正常了:Cstring m_sFreq,m_sVolt; viQueryf(vi,Freq?n,%t,m_s
45、Freq);SetDlgItemText(ID0,m_sFreq);viQueryf(vi,Volt?n,%t,m_sVolt);SetDlgItemText(ID1,m_sVolt);这也表示SCPI查询命令不允许执行多个,只能一条一条的执行,否则,最后的结果会是以最后一条查询指令的结果。通过反复的测试之后,理解了SCPI命令的执行的一些格式及语法之后,就开始我的编程。下面列出了函数信号发生器的部分执行代码:/这是一个switch语句,对用户的调制方式的判断,其中nID_Select_Modul保存的是用/户选择的调制方式的ID。通过GetCheckedRadioButton()函数获得。
46、switch(nID_Select_Modul)/对用户通过单选按钮选择的调制参数的判断 case IDC_RADIO_BW:/无调制情况 viPrintf(/*funcgen*/theApp.m_Session,OUTPut:LOAD %sn,m_nResistance);/输出端的设置 viPrintf(/*funcgen*/theApp.m_Session,OUTPut:SYNC %sn,m_nSignal);/设置同步信号CheckWaveRadioButton();/这是一个自己定义的函数,对用户的波形的选择进行判断将波形的字符串存储在m_nBaseShape中,该函数的具体代码将会在附录中给出。