0044、基于网络的虚拟仪器测试系统论文资料
收藏
资源目录
压缩包内文档预览:(预览前20页/共56页)
编号:6122118
类型:共享资源
大小:96.31KB
格式:ZIP
上传时间:2017-11-23
上传人:超****计
IP属地:浙江
4.8
积分
- 关 键 词:
-
基于
网络
虚拟仪器
测试
系统
论文
资料
- 资源描述:
-
0044、基于网络的虚拟仪器测试系统论文资料,基于,网络,虚拟仪器,测试,系统,论文,资料
- 内容简介:
-
1引 言著名科学家门捷列夫说:“没有测量,就没有科学” 。测量科学的先驱凯尔文又说,一个事物你如果能够测量它,并且能用数字来表达它,你对它就有了深刻的了解;但如果你不知道如何测量它,且不能用数字表达它,那么你的知识可能就是贫瘠的,是不令人满意的。测量是知识的起点,也是你进入科学殿堂的开端。1 基于网络的虚拟仪器测试系统1.1 概述随着计算机技术、通信技术与仪器技术的不断发展,使得虚拟仪器得到了进一步发展,虚拟仪器将计算机资源与仪器硬件、数字信号处理技术结合,把厂家定义仪器功能的方式转变为由用户自己定义仪器功能。用户可根据测试的需要,自己设计所需要的仪器系统,利用一种或多种功能的通用模块,调用不同功能的软件模块,组成不同的仪器功能。在虚拟仪器中,计算机成为仪器的一部分,使得计算机可以得到充分发挥。除了仪器的输入、输出、数据处理分析、结果显示由计算机完成外,还可组成计算机网络。一个大的复杂的测试系统往往系统的测量、输入、输出、结果分析分布在不同的地理位置,仅用一台计算机并不能胜任测试任务,需要由分布在不同地理位置的若干计算机共同完成整个测试任务。计算机网络技术、总线技术的发展,乃至Internet 网的发展拓展了虚拟仪器测试系统的应用范围。利用网络技术将分散在不同地理位置不同功能的测试设备联系在一起,使昂贵的硬件设备、软件在网络内得以共享,减少了设备重复投资。一台计算机采集的数据可以立即传输到另一台处理分析机上进行处理分析,分析后的结果可被执行机构、设计师查询使用,使数据采集、传输、处理分析成为一体,容易实现实时采集、实时监测。重要的数据实行多机备份,提高了系统的可靠性。对于有些危险的、环境恶劣的不适合人员操作的数据采集工作可实行远程采集,将采集的数据放在服务器中供用户使用。1.2 虚拟仪器网络测试系统设计虚拟仪器网络测试系统的设计需从虚拟仪器和网络技术两方面考虑。1.2.1 虚拟仪器部分分析测试系统的要求和系统的功能,根据系统功能的要求,在软件和硬件之间进行优化选择,从而确定仪器所必需的硬件模块,以便用最少的模块实现仪器的最佳功能。根据应用情况与实际的条件选择基于计算机的虚拟仪器的仪器模块(VXI 总线、PCI 总线、PXI 总线、GPIB 仪器) ,包括示波器、信号调理电路、万用表、信号源等模块。硬件确定以后,主要确定软件功能模块,哪些仪器功能由软件实现,将软件功能划分为相对独立的模块。然后选择易于编写的图形化的软件平台。2Virsual C+6.0 是一种面向对象的通用的功能强大的程序设计语言,提供集成性及可视化用户界面,采用面向对象的程序设计方法,它具有底层操作功能,也具有数据库开发功能,编程灵活,因此也是编程人员常选用的编程语言,我也用 VC+编写了虚拟仪器平台,可以组建虚拟信号发生器、虚拟示波器、数据采集。1.2.2 网络结构设计根据测试系统各部分所处的地理位置和覆盖的范围不同可构建局域网、城域网、广域网。一个大的复杂的测试系统由各个子系统组成,每个子系统一般在一个单位的小范围内,因此可建立局域网,然后将每个局域网互联,形成企业测量系统。由于Internet 网的发展,一些公用的数据还可以通过 Internet 网将测量数据发布到网上供网上用户使用,可建立测量发布系统。对于有些危险的、环境恶劣的不适合人员操作的数据采集工作可实行远程采集。由于网络测试中每个测试点担任不同的测试任务,为了减少不必要的重复工作,通过网络实现资源共享,同时要减轻服务器与各节点的数据传输,提高网络系统性能,因此服务器和各个节点以及各节点之间协同工作显得尤为重要。基于 Client/Server模式的分布式计算、分布式处理系统是解决这个问题的最好选择。基于 C/S 模式,将系统功能分解到各个节点,各个节点有机配合,用户在自己的终端上就可以观察到从服务器中获取的数据和处理结果。在 C/S 中,分客户机(Client)程序和服务器(Sewer)程序。客户机程序和服务器程序可以运行在一台计算机中,也可运行在两台或多台计算机中,Client 程序与 Server 程序相互协同处理,一个测试系统由一个或承担不同任务的多个客户机与一个或多个服务器组成。客户机是用户与系统的交互接口,提供一个用户界面,完成用户命令与数据的输入,显示服务器送回的结果。服务器接受客户机提出的申请,完成所要求的操作并将结果传送给用户。在一个测试系统中,根据任务不同,每个服务器和客户机承担的任务也不同,例如可划分为采集、数据处理分析、输出、监控。一台计算机采集外部数据,将采集的数据存储并传输给另一台计算机,它就是服务器,另外它又需要得到远地计算机的数据,这时它又成为客户机。C/S 模式是一种开放式系统的协同处理工作模式。设计 C/S 模式时应首先分析系统所要达到的指标和功能要求,在此基础上,把系统划分为各个相对独立的模块,分配到各个计算机上,每个计算机执行不同的功能,能在客户机上完成的独立任务就不要放在服务器上,以减低服务器的工作量。第二,要保证数据在服务器和客户机、客户机间可靠的传输。设计时需考虑网络的带宽要满足传输要求,并减少网络数据传输量。Agilent IO 库允许通过 LAN 进行仪器的控制操作。使用标准的 LAN 接口,计算机可以不要特殊的仪器接口就可以实现对仪器的控制。LAN 软件使用计算机的 C/S 模式,这种模式使得应用程序(客户)可以不用执行所有的工作,相反,客户机可以向另一台仪器(服务器)发出某种请求。与可控仪器或器件相连的 LAN 服务器,一旦完成仪3器或器件的请求,LAN 服务器会反馈信息给客户机。反馈的信息包括数据和状态等表明操作是否成功的信息。例如网关在 LAN 软件(客户机支持)和器件支持的仪器接口之间扮演一个服务器的角色。基本结构如图:图 11LAN 软件结构:该结构中,包含了 LAN 客户软件和 LAN 软件(TCP/IP) (用于访问服务器gateway) 。网关包含了 LAN 服务器软件,LAN(TCP/IP)软件以及用于和客户机通讯和控制仪器的仪器驱动软件。4图 121.2.3 软件设计与硬件结构相对应,软件结构可分为网络测控系统控制主模块,是系统控制的中枢,连接和控制各子模块;虚拟信号源、虚拟万用表和虚拟示波器等模块,是控制相应台式仪器,使其完全能处于远程虚拟控制状态,给测控对象提供激励信号,并监视受控对象输出特性变化;虚拟 VXI 仪器和信号调理模块是控制 SCXI 和 VXI 硬件模块仪器进行模拟量数据采集与开关量对象控制,包括数据处理;图象采集模块,包括采集现场景物视频图象和有形对象的图象采集.与图象处理;网络通信模块承担不同总线模块与主模块之间的数据传输与通信,也是实现本测控系统与远程用户之间的控制与数据传送。每个虚拟仪器模块内部都封装了对应仪器状态控制命令集、数据采集命令集、数据处理模型以及通信协议等处理子模块。下面的第三章至第五章介绍的就是函数信号发生器、示波器以及万用表模块的设计和具体的编程。下面让我们先来了解一下 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 的编辑功能,可以方便的设计程序。它的编辑功能可以随时让我们了解到程序的结构、流程以及对象的成员,而完成程序设计之后,也不必经过复杂的编译程序,而且给出的错误警告可以很方便的进行定位操作,这给程序设计人员以方便。2.2 IDE 的集成开发环境界面IDE 就是 Integrated Development Enviroment 的缩写,是将程序代码的编写(editor) 、编译(Compiler) 、执行(execution)以及纠错(debug)等功能汇集一身的单一整合性的界面,提供程序开发过程所需要的相关或扩展服务,让用户只需要通过此环境便可以轻松完成程序工程。2.3 Agilent VISA纵览VISA 是 Agilent IO 库的一个部分。Agilent IO 库由两个部分组成:VISA 和SICL。Agilent VISA 是根据 VXIpp 系统联盟的规定设计的,它允许由不同的厂商开发的软件能在同一个系统中运行。如果你想在你的应用程序中使用 VXIpp 仪器驱动或者是想是自己开发的 IO 应用软件或仪器驱动能符合 VXIpp 的标准,就需要使用 VISA。如果你使用新的仪器或开发IO 应用程序以及仪器驱动的话,也应该使用 VISA。Agilent VISA 是一个 IO 库,可以用来开发符合 VXIpp 标准的 IO 应用软件和仪5器的驱动。使用 VISA 开发的应用软件和仪器驱动可以在使用 VISA IO 库的 VXIpp 主机上运行。因此,不同厂商开发的应用软件可以在同一个系统中运行。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命令、使用事件与句柄、捕抓错误等等。VISA资源:在VISA中,任何VISA可以提供通讯的器件(如电压表)都可以定义为一种资源。对于一个完善的VISA系统,VISA定义完全符合VXI即插即用联盟的规范的六种资源类可以被执行。VISA属性: 属性是和各种资源或会话相关联的。你可以使用属性来决定资源或会话的状态或设置资源或会话为指定的状态。譬如,你可以通过viGetAttribute函数来读取指定会话、事件、查找列表的属性的状态。有只读和读写的属性。通过使用viSetAttribute函数来修改指定的会话、事件或查找列表的读写属性。传递给viGetAttribute函数的指针必须指向那个属性的准确类型:ViUInt16,ViInt32,等等。譬如,当读取一个返回ViUInt16值的属性的状态时,你必须声明那个属性的变量和使用它来存储返回的数值。如果ViString被返回,你必须分配一个数组和传递那个数组的指针给那个返回的数值。对于C和C+程序,你必须在每一个文件的开始处添加包含VISA调用函数visa.h头文件:#include “visa.h”这个头文件包含了VISA函数的原型的声明和所有VISA的常量和错误代码的定义。Visa.h头文件也包含了visatype.h头文件。该visatype.h头文件对VISA的所有类型进行了定义。VISA的各种类型贯穿了整个VISA,对函数中用到的数据进行类型定义。而关于会话,会话其实是一个通讯通道。会话必须在默认的资源管理器中被首先打开,接着是你将会使用的每一种资源。首先,你必须通过默认资源管理器的viOpenDefaultRM函数来建立一个会话。这个函数的第一次调用用来初始化默认的资源管理器并返回该资源管理器会话的会话。你仅需要打开默认资源管理器一次就可以了。然而,后来的对viOpenDefaultRM函数的调用则返回同样的默认资源管理器资源的唯一的会话。接下来,你利用 viOpen 函数对指定的资源打开一个会话。而在退出程序的时候需要多6打开的会话进行关闭操作,在关闭每一个会话时,必须调用 viClose 函数以释放掉分配给该会话的数据资源。你如果关闭默认的资源管理器会话,则所有被该会话打开的会话将会被关闭。当你为一个器件建立一个通讯会话时,通过使用 VISA 的 I/O 程序来启动与该器件的通讯。VISA 提供了格式化和非格式化的程序。 格式化 I/O 将对格式化字符下的混合数据类型进行转换。数据被存在数据缓冲器中,因此是接口的通讯得到最大的优化。 非格式化 I/O 口向一个器件发送或接收原始数据。通过非格式化 I/O,数据并不进行格式化或相应的转换。因此,如果要求格式化数据,它必须通过用户自己来定义。事件是那些需要你的应用程序关注的特指事件。事件类型包括服务请求,中断和硬件触发。事件不会被传递,除非相应的事件被启用。注意:VISA 不能回调 VB 函数。因此,你只能使用函数 ViEnableEvent 来使用队列机制。在 VB 中不能安装 VISA 事件句柄。当事件发生时,有两种方式来接收通知消息:函数回调法和队列法当一个事件需要立即相应时,可以使用回调函数法。使用回调函数法来接收事发生时的通知消息。当使能事件发生时,安装的事件句柄会被调用。可以使用函数viInstallHandler 安装事件句柄,而使用函数 viEnableEvent 来启动一个或多个事件。VISA 允许应用程序在同一个会话中对一种事件类型安装多个句柄。多个句柄可以通过多次调用函数 viInstallHandler 来安装。每次调用添加到前面的句柄列表中。如果一个事件类型被安装了多个句柄,当指定的事件发生时,每一个句柄会被调用。VISA 指出,句柄的调用的顺序是后进先出的顺序。当需要安装句柄时,使用下面的函数:viInstallHandler(vi, eventType, handler, userHandle);当你的应用程序捕需要及时相应时,队列法通常被使用。为了使用队列法来接收事件发生时的通知消息,步骤如下: 使用函数viEnableEvent来使能一个或多个事件。 当准备查询时,使用函数viWaitOnEvent来检查队列事件。如果指定的事件发生,事件信息将会被取得,程序立即返回。如果指定的事件没有发生,应用程序挂起直至指定的事件发生或指定的超时时间到来。73 函数信号发生器3.1 Agilent 33250A 80 MHz 函数/ 任意波形发生器介绍Agilent Technologies 33250A 是高性能的 80 MHz 复合函数发生器,其具有内置任意波形和脉冲功能函数发生器,其80MHz带宽能适应各种各样的应用要求,它具有各种内置信号、自定义的任意波形和脉冲能力,能帮助您验证设计,检验新的构想。直接数字合成技术能获得稳定、精确和低失真的输出信号。Agilent 33250A能提供您需要的所有波形,其输出频率更高达80MHz。标准输出包括正弦波、方波、斜波、噪声波、sin(x)/x、真流和其它波形。当标准信号还不能满足您的要求时,33250A可简化生成任意波形的过程,并赠强这些自定义信号的性能。现在通过达200MSa/s的采样率,12bit分辨率和64K点的存储器深度,您可建立无限多种信号,以精确适应您的应用要求。同时具备工作台特性和系统特性是满足您目前及未来测试需求的多用途解决方案Agilent Technologies 33250A 的特点如下: 10 个标准波形 内置的 12 位 200 MSa/s 任意波形功能 具有可调边沿时间的精确脉冲波形功能 LCD 彩色显示器可提供数字和图形视图 易用的旋钮和数字小键盘 仪器状态存储器用户可自定义名称 带有防滑支脚的便携式耐用机箱灵活的系统特性 四个可下载的 64K 点任意波形存储器 GPIB (IEEE-488) 接口和 RS-232 接口为标准配置 SCPI 可编程仪器的标准命令兼容Agilent Technologies 33250A 函数/ 任意波形发生器的技术参数如下:波形 标准波形正弦波、方波、斜波、脉冲、噪声、SIN(x)/x,指数上升和下降、心律波、真流电压 波形长度 164K 点非易失性存储器 4 个波形(每一个汉形 164K 点)幅度分辨率 12bit任意波形采样率 200MSa/s 频率特性8正弦波 1Hz80MHz 白噪声 50MHz 带宽 方波 1Hz80MHz 分辨率 1Hz,除脉冲为 5 个字 三角波 1Hz1MHz 准确度 0.3ppm,(18) 斜波 500Hz50MHz THD(dc20kHz) #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);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函数的功能是建立一个指定器件的会话的通道,而会话具有一个标识,该标识可以被VISA库的其他函数进行调用。这个函数很重要,因为你如果需要跟一个器件通讯,就必须通过该函数来进行会话的建立。函数viOpenDefaultRM用来打开默认资源管理器的会话,必须是第一个打开。这个函数初始化资源管理器,并返回该会话的指针。以供其他函数使用。而函数viPrintf和viScanf这两个函数在用的编程中的比例是最多的,我发送SCPI指令就是通过这两个函数来进行的。函数viClose是用于关闭每一个会话的。当你关闭一个会话时,所有为会话分配的数据结构都会被释放掉。当你使用这个函数关闭默认资源管理器时,所有通过该会话打开的其他会话将会被关闭。通过阅读VISA手册,懂得如何配置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点击Directories按钮,就可以对头文件和库文件的路径进行更改了。在VISA中也学习了几个接口的编程。VISA支持三种接口来访问GPIB和VXI仪器:GPIB,VXI和GPIB-VXI。通过这三种接口可以对GPIB和VXI器件进行编程。当你使用GPIB-VXI或VXI接口直接访问VXI主机时。你必须知道你所要进行的编程的仪器时基于10消息基还是寄存器基的VXI器件。消息基的VXI器件拥有自己的处理器来识别高级的命令,譬如,SCPI(可编程仪器标准命令)。当使用VISA时,你利用VISA的输出函数来发送SCPI命令。接着,消息基器件就会解释SCPI命令。在这种情况下,就可以使用VISA的格式化IO或非格式化IO含糊来对消息基器件进行编程。如果消息基器件有共享内存,可以通过对寄存器的PEEK和POKE操作来访问器件的共享内存。VISA提供两个不同的方法对寄存器进行编程:高级内存函数或低级内存函数。而寄存器基的VXI器件没有处理器来处理高级的命令。因此,只有通过寄存器的PEEK和POKE命令直接对器件的寄存器进行编程。VISA提供了两种不同的方法来对寄存器基的器件进行编程:高级内存函数低级内存函数。下面是一个关于GPIB接口的示意图:一台装有多个GPIB卡(PCI和ISA)的PC机和通过GPIB电缆与GPIB卡相连的多台GPIB仪器组成。PC机和仪器之间的通讯是通过GPIB卡和GPIB电缆来实现的。如下所示:图31如下面的例子:GPIB接口系统由装由两个82350GPIB卡的PC机和三台GPIB仪器通过GPIB电缆进行连接。通过IO组件对GPIB卡1和2分别配置一个VISA名字GPIB0和GPIB1。这样VISA库就可以对其进行寻址操作了,如下图:图32而其他的接口类型的配置与连接也是大同小异。11对仪器进行编程之前还需要熟悉一下Agilent IO库的相关知识。从Agilent IO 的安装向导PDF电子资料中了解到了相关的知识点,也知道了该库的重要作用。Agilent IO库软件由两个库和四个IO配置组建加上一个IO库控制组成。两个库为Agilent VISA 和Agilent SICL。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助手则是一个应用程序,可以控制和与VXI,GPIB以及Serial仪器进行通讯。这是一个比较好的帮助软件,可以了解到仪器的地址,在编程之前,对相关指令测试操作,以熟悉操作指令。也可以通过它来了解到连接的相关情况。我在三个模块的编程过程中,经常通过该组建来了解相关的信息。其他两个组件则用的不多。VXI 资源管理器是用来显示你的系统是否进行适当的配置,它需要你的系统安装有E8491 IEEE-1394 PC Link to VXI 接口;而LAN Server是通过IO Config对系统进行LAN Server的配置。了解了IO库的介绍性知识,随后又对如何利用IO库对接口进行配置的章节进行的阅读。一个IO接口可以被定义为硬件接口和软件接口。IO Config组件使用的目的是将一个唯一的软件接口名字和一个硬件接口联系起来。IO库使用接口名字或逻辑单元数字来对接口进行标识。这个信息在VISA程序中被函数viOpen作为一个参数进行调用或在SICL程序中被函数iopen进行调用。IO Config分配一个接口名字和一个逻辑单元数字给一个硬件接口,就象其他接口配置参数一样。当IO接口配置完之后,就可以使用Agilent VISA或Agilent SICL库对分配的仪器进行编程了。比如,下图中显示的是对通过GPIB接口和PC进行连接的GPIB仪器进行VISA和SICL寻址操作。图33譬如对GPIB(82357USB)接口进行配置,为了对82357USB/GPIB接口进行配置,启动IO Config组件,并在左边的有效接口类型中选中GPIB 82357USB to GPIB如下图:12图34如果在你的系统中有多个82357接口,则在配置窗口中会显示出来。选择你想进行配置的接口的Serial Number并单击OK会显示82357 USB to GPIB配置窗口。在出现的窗口中设置VISA 接口名字,SICL接口名字,逻辑单元以及总线地址。如果你的系统中有多个82357接口的话,重复配置。图35对PCI接口82350和82341ISA接口的配置也是类似。对VISA和IO库以及其相关的组件有了一定的认识之后,通过网上和书本上的资料了解了函数信号发生器的基本功能和相关的参数,我便开始了界面的设计以及编程的构思。3.2.2 函数信号发生器的界面以及编程构思13因为我要完成三个模块的设计:33250A函数信号发生器,54622D示波器以及E1412A万用表的设计工作,所以最初的设计是设计一个主界面,通过三个按钮的点击来分别进入不同的模块如下图所示:图36后来通过考虑,感觉这样的设计不够人性化和可操作性,也不太符合实际情况。所以通过反复的修改最终是如下所示:图37这样的设计自己的感觉是比较满意的。从主界面上可以一目了然的知道软件的功能。三个功能模块,通过按钮来进行操作,而左边的列表是通过下面的按钮来进行查找的。开始是,建立会话是处于屏蔽状态,通过查找资源按钮来进行资源的查找工作,并将查找到的资源一一的列在列表框中。用户可以通过双击任一个资源地址来激化建立会话按钮并进行会话的建立工作。会话是否成功的建立会给出提示信息,以确保用户的正确操作和使用。建立会话后,将会把建立会话按钮变为关闭会话按钮,来进行会话的关闭操作。也可以通过进入相应的模块操作之后来对该按钮进行屏蔽操作。进入相关的模块的时候,无需用的对资源地址的记忆,程序会对用户的操作进行判断,以确保用户进入正确的模块中。函数信号发生器模块的界面如下:14图38在该模块中可以完成几种基本波形的产生以及各种基本的调试功能:正弦波,三角波,方波,锯齿波,任意波等;调幅,调频,脉冲调制,频移键控;可以修改频率,幅度,偏置以及占空比;可以配置输出阻抗何同步信号。在该界面中还存在复位按钮以及硬件连接按钮,方便用户的测试。从整体上看,符合人们的操作习惯。自己认为也还可以,也不失有点人性化吧!其实,在界面的设计过程中,也一边开始程序的构思。基本上界面是根据信号发生器的信号的产生过程及顺序以及编程的思路来进行安排的,界面的定型也就意味着自己的编程思路已经基本成型了!下面是自己的编程思路结构:15以上就是我的函数信号发生器的编程思想和设计思路。这是一个最基本的函数信号发生器模块,具备基本的功能参数。有了界面和思路之后就可以进行底下的编程操作了。3.2.3 函数信号发生器的编程首先,需要能使函数信号发生器根据用户的输入来产生相应的波形。我于是参看了33250A 80MHz的函数/任意波形发生器的电子资料以及网上关于该仪器的操作的SCPI指令。就像前面所说的那样,函数信号发生器是基于消息基,也就是说它具有自己的处理器来对用户输入的高级指令进行解释和判断以及进行执行操作。譬如,如果希望产生一个正弦波,则输入下面的语句既可:viPrintf(funcgen,function :shape sinn);就可以产生一个采用默认频率和幅值的正弦波了!而viPrintf()就是VISA库中的格式化输入输出操作函数,用来向仪器发送SCPI指令。在函数信号发生器的编程过程中,进入模块各个参数初始化用户对参数的手动设置正弦波,无调制等的设置执行命令硬件的测试和复位操作成功或失败 给出提示信息返回操作界面给出提示信息失败成功16经常需要用到这个函数,还有格式化输入函数:viScanf()。在指令的测试过程中,也遇到了一些问题:如viPrintf(funcgen,func:shape tri;freq 2000;volt 2n);这条指令就有问题,只能显示三角波,但是后面的参数就没有根据我的指定来进行显示。后来才发现,原来每一个指令后面加上回车符就可以正常的执行了。譬如,下面一条语句:viQueryf(funcgen,AM:SOUR?,buf);该语句的功能是查询AM的调制源的类型并将查询到的类型字符以%t的格式给buf。注意:该语句是没有错误,但是好像就没有起到预期的效果。而当我在AM:SOUR?n加上一个回车符后,就可以执行正确了。可以看出格式化命令是以回车符作为触发命令的,只有n才能使命令有效,舍去将视为字符串处理。(但程序本身并不提示错误)又如,产生象使用APPL命令的波形:Appl:sin freq,volt,dcoffsetn,当使用其他函数产生时,如下:FUNC SINnFREQ freqnVOLT voltnn或是FUNC SINn;FREQ freqn;VOLT voltn;n可以看出执行指令都加上了回车符(对于象这样的一串执行指令,也可以在末尾加n来执行只是需要使用分号来进行隔开,用逗号和空格均不行)下面是复位按钮的执行代码: 图39原理是通过向仪器发送IDN的SCPI指令根据函数返回值来进行判断,并给出相关的信息提示用户。除了SCPI命令外,还有IEEE 488.2命令,两种命令之间用分号隔开如下所示:RST;OUTP:LOAD INFn 又如:TRIG:SOUR BUS;TRGn连接多个SCPI命令时,使用分号和冒号(冒号表示不同的命令系统)如:OUTP:LOAD 50;:APPL:RAMP注意:函数viPrintf()和viScanf()都是单向的传送命令和数据,而函数viQueryf()则是双向的传送数据和命令。在格式化命令中不允许有两条如似的命令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和17m_sVolt是同一个值,当把语句改为如下的形式的时候就正常了:Cstring m_sFreq,m_sVolt; viQueryf(vi,Freq?n,%t,m_sFreq);SetDlgItemText(ID0,m_sFreq);viQueryf(vi,Volt?n,%t,m_sVolt);SetDlgItemText(ID1,m_sVolt);这也表示SCPI查询命令不允许执行多个,只能一条一条的执行,否则,最后的结果会是以最后一条查询指令的结果。通过反复的测试之后,理解了SCPI命令的执行的一些格式及语法之后,就开始我的编程。下面列出了函数信号发生器的部分执行代码:/这是一个switch语句,对用户的调制方式的判断,其中nID_Select_Modul保存的是用/户选择的调制方式的ID。通过GetCheckedRadioButton()函数获得。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中,该函数的具体代码将会在附录中给出。/判断用户选择的波形是否是方波,并通过函数viPrintf来进行各种SCPI命令的执行if(GetCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_DC)=IDC_RADIO_FWAVE) viPrintf(/*funcgen*/theApp.m_Session,FUNC %sn,m_nBaseShape);viPrintf(/*funcgen*/theApp.m_Session,FREQ %fn,m_nFreq);viPrintf(/*funcgen*/theApp.m_Session,VOLT %fn,m_nAmpl);viPrintf(/*funcgen*/theApp.m_Session,VOLT:OFFS %fn,m_nOffs);viPrintf(/*funcgen*/theApp.m_Session,FUNC:SQU:DCYC %fn,m_nDcycle);/判断用户选择的是否是任意波else if(GetCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_DC)=IDC_RADIO_ARBI)error=viPrintf(/*funcgen*/theApp.m_Session,APPL:USER %f,%f,%fn,m_nFreq,m_nAmpl,m_nOffs);if(error!=VI_SUCCESS)error_handler(/*funcgen*/theApp.m_Session,error);break;18viPrintf(/*funcgen*/theApp.m_Session,FUNC:USER%sn,WaveForm.m_Arbitrary);elseerror=viPrintf(/*funcgen*/theApp.m_Session,APPL:%s %f,%f,%fn,m_nBaseShape,m_nFreq,m_nAmpl,m_nOffs);/这里的参数需要用户自己添加if(error!=VI_SUCCESS) error_handler(/*funcgen*/theApp.m_Session,error);break;MessageBox(Successfully!);/给一个提示框明示用户的操作break; 以上只是无调制情况下的输出代码,而调幅、调频等的实现代码将会在附录给给出。 对仪器的编程中,首先是先打开跟资源管理器的会话,然后通过资源管理器会话来进一步打开与某一台仪器的会话(会话也就是与仪器进行通讯,所有被使用的仪器都需要建立连接,并且都要调用VISA函数viOpenDefaultRM来打开资源管理器,这个函数会初始化VISA系统,包括资源管理系统;如果在没有器件连接的情况下调用该函数,则在有器件连接上时又进行一次操作,则连接的器件是不被认识的;你必须关闭所有的资源管理器会话,并重新的打开才行);当结束访问之后需要对会话进行清除操作,调用函数viClose对资源会话和其他会话进行关闭。该操作会把所有分配给指定会话的数据结构资源进行释放操作。上面给出的是在用户配置好各种参数后的执行代码。然而,在自己的界面的设计过程中也给出了一些配置信息,比如,频率,幅值,偏移,占空比(其中对占空比也做了特别的处理,因为占空比参数只适合于方波,所以在选中其他波形的时候需要对该参数进行屏蔽,以防止用户的输入)。当用户选择调制方式的时候,会弹出对话框以提供用户的输入操作:19图310可以看出在该界面中共有四种调制方式,也是最基本的调制方式。在弹出时,各个参数都有其初始值以方便用户。对于其中的数据的处理比较简单:通过VC的ClassWizard对界面中的各个控件进行变量的定义,以接收用户的数据的输入:图311在程序的编写过程中也遇到了一些问题:譬如,多个单选按钮如何组合在一起,实现真正的单选;当用户选中一个按钮之后,如何对用户的选择进行判断,以正确的执行用户所需要的执行指令;各个功能模块之间如何的进行协调的工作等等。就拿单选按钮的实现来说,因为我的基本波形的选择设想是通过用户的选择(单选)来进行的,这样的设计直观且美观,符合人们的操作习惯。但是应该如何去实现呢?通过查找书本上介绍的例子,首先进行一些测试例子。测试通过之后,再在程序中进行运用。但是也会遇上这样那样的一些问题:例子中能进行正确的执行,但是移植到自己的程序中就不行了。(不过,我想说的一点是有许多书籍的内容是很垃圾的,程序不完整不说,而且还误人子弟)。我现在遇到的问题就是,已经将单选按钮组合在一起了,也能实现单选了,可是,单击的波形,与设计的并不一样,也就是各个单选按钮之间的功能出现了紊乱。而且还出现了跟另外一组的单选按钮出现了冲突。当时我就有点懵了。怎么会出现这样的情况呢?思索了蛮久,使自己对VC中的resource.h文件产生了怀疑:因为该文件中都是一些关于控件ID资源的定义。是不是ID资源冲突了呢?!通过自己的仔细的研究和思索,发现了另外一个问题:在该文件中有许多自己并没有使用到的空闲ID,怎么会这样呢?原来是自己在设计界面的过程中,经常的添加和删除控件,使得有些控件ID并没有随着自己对控件的删除而删除。故而遗留了下来!于是我就20将其全部的进行删除。感觉ID就干净了许多。但是,前面的问题还没有解决啊!于是我对单选按钮的ID进行的排序和分析,发现冲突的按钮的ID的顺序也是交叉的。并没有顺序的进行ID的定义。我怀疑是这个原因,于是对混乱的ID进行的重新的排序。并将不同的两组ID进行了分离。重新运行程序,结果一切OK!图312象这样的问题,如果没有碰上过,也是有点不知所措的。这是我的小小的心得哦!3.2.4函数信号发生器的程序的调试在调试前,先进行IO Config的配置,并通过VISA 助手进行仪器的连接的测试,通过之后,开始调试程序。我进行分块的调试:首先是调试产生不同波形的功能块是否正常。图313相应的程序如下:/*以下是对单选按钮的处理函数,通过单击按钮来进行相应的操作void CGENERATER:OnRadioSin() m_nEdit_Dcycle.EnableWindow(FALSE);void CGENERATER:OnRadioTriangle() m_nEdit_Dcycle.EnableWindow(FALSE);void CGENERATER:OnRadioFwave() m_nEdit_Dcycle.EnableWindow(TRUE);void CGENERATER:OnRadioRamp() m_nEdit_Dcycle.EnableWindow(FALSE);等等/*以下是对基本波形选择处理函数void CGENERATER:CheckWaveRadioButton()21 int nID_SelectWaveF;nID_SelectWaveF=GetCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_DC);switch(nID_SelectWaveF)/添加处理代码即是对波形参数赋值case IDC_RADIO_SIN:m_nBaseShape=SIN;break;case IDC_RADIO_TRIANGLE:m_nBaseShape=TRI;break;case IDC_RADIO_FWAVE:m_nBaseShape=SQU;break;case IDC_RADIO_RAMP:m_nBaseShape=RAMP;break;case IDC_RADIO_ARBI:m_nBaseShape=m_nArbdlg.m_nSet_Arbitrary;break;case IDC_RADIO_NOISE:m_nBaseShape=NOISE;break;case IDC_RADIO_PULSE:m_nBaseShape=PULSE;break;case IDC_RADIO_DC:m_nBaseShape=DC;break;default:return;上面是对用户的选择进行的变量的赋值以备后用。下面就是产生各种函数的部分(部分代码):viPrintf(/*funcgen*/m_Session,OUTPut:LOAD %sn,m_nResistance);/输出端的设置viPrintf(/*funcgen*/m_Session,OUTPut:SYNC %sn,m_nSignal);/设置同步信号注意:下面这个是一个子程序,用来对用户的选择进行判断,并将用户选择的波形的相应的参数传递给一个字符串变量中。CheckWaveRadioButton();/波形选择的判断将波形的字符串存储在m_nBaseShape中/*判断用户选择的波形是否是方波if(GetCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_DC)=IDC_RADIO_FWAVE) viPrintf(/*funcgen*/m_Session,FUNC %sn,m_nBaseShape);viPrintf(/*funcgen*/m_Session,FREQ %fn,m_nFreq);viPrintf(/*funcgen*/m_Session,VOLT %fn,m_nAmpl);viPrintf(/*funcgen*/m_Session,VOLT:OFFS %fn,m_nOffs);viPrintf(/*funcgen*/m_Session,FUNC:SQU:DCYC %fn,m_nDcycle);/*判断用户选择的是否是任意波Elseif(GetCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_DC)=IDC_RADIO_ARBI)error=viPrintf(/*funcgen*/m_Session,APPL:USER 22%f,%f,%fn,m_nFreq,m_nAmpl,m_nOffs);if(error!=VI_SUCCESS)error_handler(/*funcgen*/m_Session,error);break;viPrintf(/*funcgen*/m_Session,FUNC:USER %sn,WaveForm.m_Arbitrary);el
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。