2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  引 言</b></p><p>  著名科學家門捷列夫說:“沒有測量,就沒有科學”。測量科學的先驅凱爾文又說,一個事物你如果能夠測量它,并且能用數字來表達它,你對它就有了深刻的了解;但如果你不知道如何測量它,且不能用數字表達它,那么你的知識可能就是貧瘠的,是不令人滿意的。測量是知識的起點,也是你進入科學殿堂的開端。</p><p>

2、  1 基于網絡的虛擬儀器測試系統(tǒng)</p><p><b>  1.1 概述</b></p><p>  隨著計算機技術、通信技術與儀器技術的不斷發(fā)展,使得虛擬儀器得到了進一步發(fā)展,虛擬儀器將計算機資源與儀器硬件、數字信號處理技術結合,把廠家定義儀器功能的方式轉變?yōu)橛捎脩糇约憾x儀器功能。用戶可根據測試的需要,自己設計所需要的儀器系統(tǒng),利用一種或多種功能的通用模塊,調

3、用不同功能的軟件模塊,組成不同的儀器功能。在虛擬儀器中,計算機成為儀器的一部分,使得計算機可以得到充分發(fā)揮。除了儀器的輸入、輸出、數據處理分析、結果顯示由計算機完成外,還可組成計算機網絡。一個大的復雜的測試系統(tǒng)往往系統(tǒng)的測量、輸入、輸出、結果分析分布在不同的地理位置,僅用一臺計算機并不能勝任測試任務,需要由分布在不同地理位置的若干計算機共同完成整個測試任務。計算機網絡技術、總線技術的發(fā)展,乃至Internet網的發(fā)展拓展了虛擬儀器測試系

4、統(tǒng)的應用范圍。利用網絡技術將分散在不同地理位置不同功能的測試設備聯(lián)系在一起,使昂貴的硬件設備、軟件在網絡內得以共享,減少了設備重復投資。一臺計算機采集的數據可以立即傳輸到另一臺處理分析機上進行處理分析,分析后的結果可被執(zhí)行機構、設計師查詢使用,使數據采集、傳輸、處理分析成為一體,容易實現實時采集</p><p>  1.2 虛擬儀器網絡測試系統(tǒng)設計</p><p>  虛擬儀器網絡測試系統(tǒng)

5、的設計需從虛擬儀器和網絡技術兩方面考慮。</p><p>  1.2.1虛擬儀器部分</p><p>  分析測試系統(tǒng)的要求和系統(tǒng)的功能,根據系統(tǒng)功能的要求,在軟件和硬件之間進行優(yōu)化選擇,從而確定儀器所必需的硬件模塊,以便用最少的模塊實現儀器的最佳功能。根據應用情況與實際的條件選擇基于計算機的虛擬儀器的儀器模塊(VXI總線、PCI總線、PXI總線、GPIB儀器),包括示波器、信號調理電路、

6、萬用表、信號源等模塊。  硬件確定以后,主要確定軟件功能模塊,哪些儀器功能由軟件實現,將軟件功能劃分為相對獨立的模塊。然后選擇易于編寫的圖形化的軟件平臺。</p><p>  Virsual C++6.0是一種面向對象的通用的功能強大的程序設計語言,提供集成性及可視化用戶界面,采用面向對象的程序設計方法,它具有底層操作功能,也具有數據庫開發(fā)功能,編程靈活,因此也是編程人員常選用的編程語言,我也用VC++編寫了虛

7、擬儀器平臺,可以組建虛擬信號發(fā)生器、虛擬示波器、數據采集。</p><p>  1.2.2網絡結構設計</p><p>  根據測試系統(tǒng)各部分所處的地理位置和覆蓋的范圍不同可構建局域網、城域網、廣域網。一個大的復雜的測試系統(tǒng)由各個子系統(tǒng)組成,每個子系統(tǒng)一般在一個單位的小范圍內,因此可建立局域網,然后將每個局域網互聯(lián),形成企業(yè)測量系統(tǒng)。由于Internet網的發(fā)展,一些公用的數據還可以通過I

8、nternet網將測量數據發(fā)布到網上供網上用戶使用,可建立測量發(fā)布系統(tǒng)。對于有些危險的、環(huán)境惡劣的不適合人員操作的數據采集工作可實行遠程采集。  由于網絡測試中每個測試點擔任不同的測試任務,為了減少不必要的重復工作,通過網絡實現資源共享,同時要減輕服務器與各節(jié)點的數據傳輸,提高網絡系統(tǒng)性能,因此服務器和各個節(jié)點以及各節(jié)點之間協(xié)同工作顯得尤為重要?;贑lient/Server模式的分布式計算、分布式處理系統(tǒng)是解決這個問題的最好選擇。基

9、于C/S模式,將系統(tǒng)功能分解到各個節(jié)點,各個節(jié)點有機配合,用戶在自己的終端上就可以觀察到從服務器中獲取的數據和處理結果。在C/S中,分客戶機(Client)程序和服務器(Sewer)程序??蛻魴C程序和服務器程序可以運行在一臺計算機中,也可運行在兩臺或多臺計算機中,Client程序與Serve</p><p>  Agilent IO庫允許通過LAN進行儀器的控制操作。使用標準的LAN接口,計算機可以不要特殊的儀器

10、接口就可以實現對儀器的控制。LAN軟件使用計算機的C/S模式,這種模式使得應用程序(客戶)可以不用執(zhí)行所有的工作,相反,客戶機可以向另一臺儀器(服務器)發(fā)出某種請求。與可控儀器或器件相連的LAN服務器,一旦完成儀器或器件的請求,LAN服務器會反饋信息給客戶機。反饋的信息包括數據和狀態(tài)等表明操作是否成功的信息。例如網關在LAN軟件(客戶機支持)和器件支持的儀器接口之間扮演一個服務器的角色?;窘Y構如圖:</p><p&

11、gt;<b>  圖1-1</b></p><p>  LAN軟件結構:該結構中,包含了LAN客戶軟件和LAN軟件(TCP/IP)(用于訪問服務器—gateway)。網關包含了LAN服務器軟件,LAN(TCP/IP)軟件以及用于和客戶機通訊和控制儀器的儀器驅動軟件。</p><p><b>  圖1-2</b></p><p&

12、gt;<b>  1.2.3軟件設計</b></p><p>  與硬件結構相對應,軟件結構可分為網絡測控系統(tǒng)控制主模塊,是系統(tǒng)控制的中樞,連接和控制各子模塊;虛擬信號源、虛擬萬用表和虛擬示波器等模塊,是控制相應臺式儀器,使其完全能處于遠程虛擬控制狀態(tài),給測控對象提供激勵信號,并監(jiān)視受控對象輸出特性變化;虛擬VXI儀器和信號調理模塊是控制SCXI和VXI硬件模塊儀器進行模擬量數據采集與開關量

13、對象控制,包括數據處理;圖象采集模塊,包括采集現場景物視頻圖象和有形對象的圖象采集.與圖象處理;網絡通信模塊承擔不同總線模塊與主模塊之間的數據傳輸與通信,也是實現本測控系統(tǒng)與遠程用戶之間的控制與數據傳送。每個虛擬儀器模塊內部都封裝了對應儀器狀態(tài)控制命令集、數據采集命令集、數據處理模型以及通信協(xié)議等處理子模塊。</p><p>  下面的第三章至第五章介紹的就是函數信號發(fā)生器、示波器以及萬用表模塊的設計和具體的編程

14、。下面讓我們先來了解一下VC++6.0開發(fā)工具和Agilent VISA庫。</p><p>  2 開發(fā)工具和Agilent VISA庫介紹</p><p>  Visual C++6.0是一套功能強大面向對象的且具有集成編輯器及編譯器的編程語言開發(fā)平臺。今天我們所使用的許多應用軟件,大部分是利用C語言來進行編寫的。Visual C++6.0沒有很復雜的開發(fā)界面,給用戶的開發(fā)以很大的靈

15、活性。</p><p>  2.1 Visual C++6.0的特點</p><p>  在眾多的程序語言中,Visual C++6.0是具有編輯和編譯的集成開發(fā)環(huán)境。通過 Visual C++6.0的編輯功能,可以方便的設計程序。它的編輯功能可以隨時讓我們了解到程序的結構、流程以及對象的成員,而完成程序設計之后,也不必經過復雜的編譯程序,而且給出的錯誤警告可以很方便的進行定位操作,這給程

16、序設計人員以方便。</p><p>  2.2 IDE的集成開發(fā)環(huán)境界面</p><p>  IDE就是Integrated Development Enviroment的縮寫,是將程序代碼的編寫(editor)、編譯(Compiler)、執(zhí)行(execution)以及糾錯(debug)等功能匯集一身的單一整合性的界面,提供程序開發(fā)過程所需要的相關或擴展服務,讓用戶只需要通過此環(huán)境便可以輕

17、松完成程序工程。</p><p>  2.3 Agilent VISA縱覽</p><p>  VISA是Agilent IO庫的一個部分。Agilent IO庫由兩個部分組成:VISA和SICL。Agilent VISA是根據VXIpp系統(tǒng)聯(lián)盟的規(guī)定設計的,它允許由不同的廠商開發(fā)的軟件能在同一個系統(tǒng)中運行。</p><p>  如果你想在你的應用程序中使用VXI

18、pp儀器驅動或者是想是自己開發(fā)的IO應用軟件或儀器驅動能符合VXIpp的標準,就需要使用VISA。如果你使用新的儀器或開發(fā)IO應用程序以及儀器驅動的話,也應該使用VISA。</p><p>  Agilent VISA 是一個IO庫,可以用來開發(fā)符合VXIpp標準的IO應用軟件和儀器的驅動。使用VISA開發(fā)的應用軟件和儀器驅動可以在使用VISA IO庫的VXIpp主機上運行。因此,不同廠商開發(fā)的應用軟件可以在同一

19、個系統(tǒng)中運行。</p><p>  32位版本的VISA能在Windows 95 98 Me以及NT和2000中使用。C,C++和Visual Basic在這些系統(tǒng)中都被支持。</p><p>  對與Windows,VISA支持GPIB、VXI、GPIB-VXI、Serial(RS-232)以及局域網接口。在Windows NT中,對VXI接口支持的VISA僅能運行在Agilent 嵌入

20、式的VXI控制器產品中。一臺網絡計算機能夠通過網絡訪問配置VISA地址譬如GPIB接口地址上的儀器。</p><p>  2.4 VISA編程</p><p>  在VISA的編程中需要了解VISA的一些機制: VISA的資源和屬性、會話使用、</p><p>  發(fā)送I/O命令、使用事件與句柄、捕抓錯誤等等。</p><p>  VISA資

21、源:在VISA中,任何VISA可以提供通訊的器件(如電壓表)都可以定義為一種資源。對于一個完善的VISA系統(tǒng),VISA定義完全符合VXI即插即用聯(lián)盟的規(guī)范的六種資源類可以被執(zhí)行。</p><p>  VISA屬性: 屬性是和各種資源或會話相關聯(lián)的。你可以使用屬性來決定資源或會話的狀態(tài)或設置資源或會話為指定的狀態(tài)。</p><p>  譬如,你可以通過viGetAttribute函數來讀取指

22、定會話、事件、查找列表的屬性的狀態(tài)。有只讀和讀寫的屬性。通過使用viSetAttribute函數來修改指定的會話、事件或查找列表的讀寫屬性。</p><p>  傳遞給viGetAttribute函數的指針必須指向那個屬性的準確類型:ViUInt16,ViInt32,等等。譬如,當讀取一個返回ViUInt16值的屬性的狀態(tài)時,你必須聲明那個屬性的變量和使用它來存儲返回的數值。如果ViString被返回,你必須分配

23、一個數組和傳遞那個數組的指針給那個返回的數值。</p><p>  對于C和C++程序,你必須在每一個文件的開始處添加包含VISA調用函數visa.h頭文件:#include “visa.h”這個頭文件包含了VISA函數的原型的聲明和所有VISA的常量和錯誤代碼的定義。Visa.h頭文件也包含了visatype.h頭文件。</p><p>  該visatype.h頭文件對VISA的所有類

24、型進行了定義。VISA的各種類型貫穿了整個VISA,對函數中用到的數據進行類型定義。</p><p>  而關于會話,會話其實是一個通訊通道。會話必須在默認的資源管理器中被首先打開,接著是你將會使用的每一種資源。首先,你必須通過默認資源管理器的viOpenDefaultRM函數來建立一個會話。這個函數的第一次調用用來初始化默認的資源管理器并返回該資源管理器會話的會話。你僅需要打開默認資源管理器一次就可以了。然而,

25、后來的對viOpenDefaultRM函數的調用則返回同樣的默認資源管理器資源的唯一的會話。</p><p>  接下來,你利用viOpen函數對指定的資源打開一個會話。而在退出程序的時候需要多打開的會話進行關閉操作,在關閉每一個會話時,必須調用viClose函數以釋放掉分配給該會話的數據資源。你如果關閉默認的資源管理器會話,則所有被該會話打開的會話將會被關閉。</p><p>  當你為

26、一個器件建立一個通訊會話時,通過使用VISA的I/O程序來啟動與該器件的通訊。VISA提供了格式化和非格式化的程序。</p><p>  格式化I/O將對格式化字符下的混合數據類型進行轉換。數據被存在數據緩沖器中,因此是接口的通訊得到最大的優(yōu)化。</p><p>  非格式化I/O口向一個器件發(fā)送或接收原始數據。通過非格式化I/O,數據并不進行格式化或相應的轉換。因此,如果要求格式化數據,

27、它必須通過用戶自己來定義。</p><p>  事件是那些需要你的應用程序關注的特指事件。事件類型包括服務請求,中斷和</p><p>  硬件觸發(fā)。事件不會被傳遞,除非相應的事件被啟用。</p><p>  注意:VISA不能回調VB函數。因此,你只能使用函數ViEnableEvent來使用隊列機制。在VB中不能安裝VISA事件句柄。</p><

28、;p>  當事件發(fā)生時,有兩種方式來接收通知消息:函數回調法和隊列法</p><p>  當一個事件需要立即相應時,可以使用回調函數法。使用回調函數法來接收事</p><p>  發(fā)生時的通知消息。當使能事件發(fā)生時,安裝的事件句柄會被調用??梢允褂煤瘮祐iInstallHandler安裝事件句柄,而使用函數viEnableEvent來啟動一個或多個事件。VISA允許應用程序在同一個會

29、話中對一種事件類型安裝多個句柄。多個句柄可以通過多次調用函數viInstallHandler來安裝。每次調用添加到前面的句柄列表中。</p><p>  如果一個事件類型被安裝了多個句柄,當指定的事件發(fā)生時,每一個句柄會被調用。VISA指出,句柄的調用的順序是后進先出的順序。當需要安裝句柄時,使用下面的函數:</p><p>  viInstallHandler(vi, eventType

30、, handler, userHandle);</p><p>  當你的應用程序捕需要及時相應時,隊列法通常被使用。為了使用隊列法來接收事件發(fā)生時的通知消息,步驟如下:</p><p>  使用函數viEnableEvent來使能一個或多個事件。</p><p>  當準備查詢時,使用函數viWaitOnEvent來檢查隊列事件。</p><p

31、>  如果指定的事件發(fā)生,事件信息將會被取得,程序立即返回。如果指定的事件沒有發(fā)生,應用程序掛起直至指定的事件發(fā)生或指定的超時時間到來。</p><p><b>  3 函數信號發(fā)生器</b></p><p>  3.1 Agilent 33250A 80 MHz 函數/ 任意波形發(fā)生器介紹</p><p>  Agilent Techn

32、ologies 33250A 是高性能的 80 MHz 復合函數發(fā)生器,其具有內置任意波形和脈沖功能函數發(fā)生器,其80MHz帶寬能適應各種各樣的應用要求,它具有各種內置信號、自定義的任意波形和脈沖能力,能幫助您驗證設計,檢驗新的構想。直接數字合成技術能獲得穩(wěn)定、精確和低失真的輸出信號。Agilent 33250A能提供您需要的所有波形,其輸出頻率更高達80MHz。標準輸出包括正弦波、方波、斜波、噪聲波、sin(x)/x、真流和其它波形

33、。當標準信號還不能滿足您的要求時,33250A可簡化生成任意波形的過程,并贈強這些自定義信號的性能?,F在通過達200MSa/s的采樣率,12bit分辨率和64K點的存儲器深度,您可建立無限多種信號,以精確適應您的應用要求。同時具備工作臺特性和系統(tǒng)特性是滿足您目前及未來測試需求的多用途解決方案</p><p>  Agilent Technologies 33250A 的特點如下:</p><p

34、>  ? 10 個標準波形</p><p>  ? 內置的 12 位 200 MSa/s 任意波形功能</p><p>  ? 具有可調邊沿時間的精確脈沖波形功能</p><p>  ? LCD 彩色顯示器可提供數字和圖形視圖</p><p>  ? 易用的旋鈕和數字小鍵盤</p><p>  ? 儀器狀態(tài)存儲器

35、用戶可自定義名稱</p><p>  ? 帶有防滑支腳的便攜式耐用機箱靈活的系統(tǒng)特性</p><p>  ? 四個可下載的 64K 點任意波形存儲器</p><p>  ? GPIB (IEEE-488) 接口和 RS-232 接口為標準配置</p><p>  ? SCPI 可編程儀器的標準命令兼容</p><p>

36、  Agilent Technologies 33250A 函數/ 任意波形發(fā)生器的技術參數如下:</p><p>  3.2 對函數/任意波形發(fā)生器的遠端編程控制</p><p>  3.2.1 編程的準備工作</p><p>  了解函數信號發(fā)生器的功能特點:因為我要操作的函數信號發(fā)生器的型號是Agilent Technologies 33250A。所以,上網

37、去搜索關于該型號的資源。在安捷倫-中國的網站上查找到了相關的文件資源。并通過閱讀了解了遠程控制儀器的方法(通過VISA I/O庫對輸入輸出操作的支持,并使用該儀器的SCPI-standard command for programmable instrument命令來對儀器進行相關的操作。</p><p>  通過查看“自動測試系統(tǒng)”課本上的例子,對自己編寫函數信號發(fā)生器的界面有了一定的模型和認識。接下來就是去了

38、解VISA I/O庫。通過殷老師提供給我的資料,并通過閱讀,對VISA庫中的操作函數有了一定的認識。如下給出的程序:</p><p>  這個例子程序的功能是查詢GPIB器件的型號,并輸出結果。</p><p>  #include <visa.h></p><p>  #include <stdio.h>//這里是頭文件,因為需要使用VIS

39、A的數據類型和函數</p><p>  void main () {</p><p>  ViSession defaultRM, vi;//變量的聲明</p><p>  char buf [256] = {0};</p><p>  viOpenDefaultRM(&defaultRM);//打開地址為22的GPIB器件</

40、p><p>  viOpen(defaultRM, "GPIB0::22::INSTR",VI_NULL,VI_NULL,&vi);</p><p>  viPrintf(vi, "*RST\n");//初始化器件</p><p>  viPrintf(vi, "*IDN?\n");//查詢器件的型號&

41、lt;/p><p>  viScanf(vi, "%t", buf);//讀取結果</p><p>  printf("Instrument identification string: %s\n", buf);//打印結果</p><p>  viClose(vi);//關閉會話</p><p>  vi

42、Close(defaultRM);}</p><p>  這里涉及到了5個VISA函數:viOpenDefaultRM,viOpen,viPrintf,viScanf,viClose。在我后來的編程過程中,也基本上就用到了這幾個函數的功能。viOpen函數的功能是建立一個指定器件的會話的通道,而會話具有一個標識,該標識可以被VISA庫的其他函數進行調用。這個函數很重要,因為你如果需要跟一個器件通訊,就必須通過該函

43、數來進行會話的建立。函數viOpenDefaultRM用來打開默認資源管理器的會話,必須是第一個打開。這個函數初始化資源管理器,并返回該會話的指針。以供其他函數使用。而函數viPrintf和viScanf這兩個函數在用的編程中的比例是最多的,我發(fā)送SCPI指令就是通過這兩個函數來進行的。函數viClose是用于關閉每一個會話的。當你關閉一個會話時,所有為會話分配的數據結構都會被釋放掉。當你使用這個函數關閉默認資源管理器時,所有通過該會話

44、打開的其他會話將會被關閉。</p><p>  通過閱讀VISA手冊,懂得如何配置VC參數從而可以正常的進行操作。利用VISA來進行編程,需要鏈接VISA庫-VISA32.LIB。對VC編譯器配置如下:選擇Project->Settings并選擇C/C++按鈕,從類型列表中選擇Code Generation,從運行庫列表中選擇Multi-Threaded using DLL。(VISA在WIN32環(huán)境下需要

45、這些配置)選擇Project->Settings點擊link按鈕并添加visa32.lib庫到Object/Library Modules列表中。換一種方法是,直接添加庫到你的工程文件夾中。頭文件和庫文件的搜索路徑也可以進行更改:選擇Tools->Options點擊Directories按鈕,就可以對頭文件和庫文件的路徑進行更改了。</p><p>  在VISA中也學習了幾個接口的編程。VISA支持

46、三種接口來訪問GPIB和VXI儀器:GPIB,VXI和GPIB-VXI。通過這三種接口可以對GPIB和VXI器件進行編程。當你使用GPIB-VXI或VXI接口直接訪問VXI主機時。你必須知道你所要進行的編程的儀器時基于消息基還是寄存器基的VXI器件。消息基的VXI器件擁有自己的處理器來識別高級的命令,譬如,SCPI(可編程儀器標準命令)。當使用VISA時,你利用VISA的輸出函數來發(fā)送SCPI命令。接著,消息基器件就會解釋SCPI命令。

47、在這種情況下,就可以使用VISA的格式化IO或非格式化IO含糊來對消息基器件進行編程。如果消息基器件有共享內存,可以通過對寄存器的PEEK和POKE操作來訪問器件的共享內存。VISA提供兩個不同的方法對寄存器進行編程:高級內存函數或低級內存函數。而寄存器基的VXI器件沒有處理器來處理高級的命令。因此,只有通過寄存器的PEEK和POKE命令直接對器件的寄存器進行編程。VISA提供了兩種不同的方法來對寄存器基的器件進行編程:高級內存函數低級

48、內存函數。下面是一個關于GPIB接口的示意圖:一臺裝有多個GPIB卡(P</p><p><b>  圖3-1</b></p><p>  如下面的例子:GPIB接口系統(tǒng)由裝由兩個82350GPIB卡的PC機和三臺GPIB儀器通過GPIB電纜進行連接。通過IO組件對GPIB卡#1和#2分別配置一個VISA名字GPIB0和GPIB1。這樣VISA庫就可以對其進行尋址操作

49、了,如下圖:</p><p><b>  圖3-2</b></p><p>  而其他的接口類型的配置與連接也是大同小異。</p><p>  對儀器進行編程之前還需要熟悉一下Agilent IO庫的相關知識。從Agilent IO 的安裝向導PDF電子資料中了解到了相關的知識點,也知道了該庫的重要作用。Agilent IO庫軟件由兩個庫和四個

50、IO配置組建加上一個IO庫控制組成。兩個庫為Agilent VISA 和Agilent SICL。Agilent VISA――Agilent Virtual Instrument Software Architecture(VISA)是一個開發(fā)符合VXIplug&play標準的I/O應用程序和儀器驅動。而Agilent SICL—Agilent Standard Instrument Control Library(SICL)是

51、一個Agilent開發(fā)的適合許多IO接口的IO庫。四個IO配置組建中的IO配置是被Agilent IO庫用來對儀器的IO硬件接口進行配置。一個硬件接口在被Agilent IO庫使用之前必須被IO配置組建進行配置之后才能使用。而VISA助手則是一個應用程序,可以控制和與VXI,GPIB以及Serial儀器進行通訊。這是一個比較好的幫助軟件,可以了解到儀器的地址,在編</p><p>  一個IO接口可以被定義為硬件

52、接口和軟件接口。IO Config組件使用的目的是將一個唯一的軟件接口名字和一個硬件接口聯(lián)系起來。IO庫使用接口名字或邏輯單元數字來對接口進行標識。這個信息在VISA程序中被函數viOpen作為一個參數進行調用或在SICL程序中被函數iopen進行調用。IO Config分配一個接口名字和一個邏輯單元數字給一個硬件接口,就象其他接口配置參數一樣。當IO接口配置完之后,就可以使用Agilent VISA或Agilent SICL庫對分配的

53、儀器進行編程了。比如,下圖中顯示的是對通過GPIB接口和PC進行連接的GPIB儀器進行VISA和SICL尋址操作。</p><p><b>  圖3-3</b></p><p>  譬如對GPIB(82357USB)接口進行配置,為了對82357USB/GPIB接口進行配置,啟動IO Config組件,并在左邊的有效接口類型中選中GPIB 82357USB to GP

54、IB如下圖:</p><p><b>  圖3-4</b></p><p>  如果在你的系統(tǒng)中有多個82357接口,則在配置窗口中會顯示出來。選擇你想進行配置的接口的Serial Number并單擊OK會顯示82357 USB to GPIB配置窗口。在出現的窗口中設置VISA 接口名字,SICL接口名字,邏輯單元以及總線地址。如果你的系統(tǒng)中有多個82357接口的話

55、,重復配置。</p><p><b>  圖3-5</b></p><p>  對PCI接口82350和82341ISA接口的配置也是類似。</p><p>  對VISA和IO庫以及其相關的組件有了一定的認識之后,通過網上和書本上的資料了解了函數信號發(fā)生器的基本功能和相關的參數,我便開始了界面的設計以及編程的構思。</p>&l

56、t;p>  3.2.2 函數信號發(fā)生器的界面以及編程構思</p><p>  因為我要完成三個模塊的設計:33250A函數信號發(fā)生器,54622D示波器以及E1412A萬用表的設計工作,所以最初的設計是設計一個主界面,通過三個按鈕的點擊來分別進入不同的模塊如下圖所示:</p><p><b>  圖3-6</b></p><p>  后來

57、通過考慮,感覺這樣的設計不夠人性化和可操作性,也不太符合實際情況。所以通過反復的修改最終是如下所示:</p><p><b>  圖3-7</b></p><p>  這樣的設計自己的感覺是比較滿意的。從主界面上可以一目了然的知道軟件的功能。三個功能模塊,通過按鈕來進行操作,而左邊的列表是通過下面的按鈕來進行查找的。開始是,建立會話是處于屏蔽狀態(tài),通過查找資源按鈕來進

58、行資源的查找工作,并將查找到的資源一一的列在列表框中。用戶可以通過雙擊任一個資源地址來激化建立會話按鈕并進行會話的建立工作。會話是否成功的建立會給出提示信息,以確保用戶的正確操作和使用。建立會話后,將會把建立會話按鈕變?yōu)殛P閉會話按鈕,來進行會話的關閉操作。也可以通過進入相應的模塊操作之后來對該按鈕進行屏蔽操作。進入相關的模塊的時候,無需用的對資源地址的記憶,程序會對用戶的操作進行判斷,以確保用戶進入正確的模塊中。函數信號發(fā)生器模塊的界面

59、如下:</p><p><b>  圖3-8</b></p><p>  在該模塊中可以完成幾種基本波形的產生以及各種基本的調試功能:正弦波,三角波,方波,鋸齒波,任意波等;調幅,調頻,脈沖調制,頻移鍵控;可以修改頻率,幅度,偏置以及占空比;可以配置輸出阻抗何同步信號。在該界面中還存在復位按鈕以及硬件連接按鈕,方便用戶的測試。從整體上看,符合人們的操作習慣。自己認為也

60、還可以,也不失有點人性化吧!</p><p>  其實,在界面的設計過程中,也一邊開始程序的構思。基本上界面是根據信號發(fā)生器的信號的產生過程及順序以及編程的思路來進行安排的,界面的定型也就意味著自己的編程思路已經基本成型了!下面是自己的編程思路結構:</p><p>  以上就是我的函數信號發(fā)生器的編程思想和設計思路。這是一個最基本的函數信號發(fā)生器模塊,具備基本的功能參數。有了界面和思路之

61、后就可以進行底下的編程操作了。</p><p>  3.2.3 函數信號發(fā)生器的編程</p><p>  首先,需要能使函數信號發(fā)生器根據用戶的輸入來產生相應的波形。我于是參看了</p><p>  33250A 80MHz的函數/任意波形發(fā)生器的電子資料以及網上關于該儀器的操作的SCPI指令。</p><p>  就像前面所說的那樣,函數信

62、號發(fā)生器是基于消息基,也就是說它具有自己的處理器來對用戶輸入的高級指令進行解釋和判斷以及進行執(zhí)行操作。譬如,如果希望產生一個正弦波,則輸入下面的語句既可:viPrintf(funcgen,"function :shape sin\n");就可以產生一個采用默認頻率和幅值的正弦波了!而viPrintf()就是VISA庫中的格式化輸入輸出操作函數,用來向儀器發(fā)送SCPI指令。在函數信號發(fā)生器的編程過程中,經常需要用到這個

63、函數,還有格式化輸入函數:viScanf()。在指令的測試過程中,也遇到了一些問題:如viPrintf(funcgen,"func:shape tri;freq 2000;volt 2\n");這條指令就有問題,只能顯示三角波,但是后面的參數就沒有根據我的指定來進行顯示。后來才發(fā)現,原來每一個指令后面加上回車符就可以正常的執(zhí)行了。譬如,下面一條語句:viQueryf(funcgen,"AM:SOUR?&qu

64、ot;,buf);該語句的功能是查詢AM的調制源的類型并將查詢到的類型字符以%t的格式給buf。注意:該語句是沒有錯誤,但是好像就沒有起到預期的效果。而當</p><p>  "FUNC SIN\nFREQ freq\nVOLT volt\n…\n"或是"FUNC SIN\n;FREQ freq\n;VOLT volt\n;…\n"可以看出執(zhí)行指令都加上了回車符(對于象這樣

65、的一串執(zhí)行指令,也可以在末尾加\n來執(zhí)行――只是需要使用分號來進行隔開,用逗號和空格均不行)</p><p>  下面是復位按鈕的執(zhí)行代碼: </p><p><b>  圖3-9</b></p><p>  原理是通過向儀器發(fā)送IDN的SCPI指令根據函數返回值來進行判斷,并給出相關的信息提示用戶。除了SCPI命令外,還有IEEE 488.2

66、命令,兩種命令之間用分號隔開如下所示:</p><p>  RST;OUTP:LOAD INF\n 又如:TRIG:SOUR BUS;TRG\n連接多個SCPI命令時,使用分號和冒號(冒號表示不同的命令系統(tǒng))如:OUTP:LOAD 50;:APPL:RAMP</p><p>  注意:函數viPrintf()和viScanf()都是單向的傳送命令和數據,而函數viQueryf()則是

67、雙向的傳送數據和命令。在格式化命令中不允許有兩條如似的命令"FREQ?\n VOLT?\n"。在我的測試命令以及組合發(fā)送命令過程中,我遇到這樣的問題:</p><p>  Cstring m_sFreq,m_sVolt; viQueryf(vi,"Freq?\n","%t",m_sFreq);</p><p>  viQuery

68、f(vi,"Volt?\n","%t",m_sVolt);</p><p>  SetDlgItemText(ID0,m_sFreq);</p><p>  SetDlgItemText(ID1,m_sVolt);如果以這種方式執(zhí)行的話,執(zhí)行的結果是m_sFreq和m_sVolt是同一個值,當把語句改為如下的形式的時候就正常了:</p>

69、<p>  Cstring m_sFreq,m_sVolt; viQueryf(vi,"Freq?\n","%t",m_sFreq);SetDlgItemText(ID0,m_sFreq);</p><p>  viQueryf(vi,"Volt?\n","%t",m_sVolt);SetDlgItemText(ID1,

70、m_sVolt);</p><p>  這也表示SCPI查詢命令不允許執(zhí)行多個,只能一條一條的執(zhí)行,否則,最后的結果會是以最后一條查詢指令的結果。</p><p>  通過反復的測試之后,理解了SCPI命令的執(zhí)行的一些格式及語法之后,就開始我的編程。下面列出了函數信號發(fā)生器的部分執(zhí)行代碼:</p><p>  //這是一個switch語句,對用戶的調制方式的判斷,其

71、中nID_Select_Modul保存的是用//戶選擇的調制方式的ID。通過GetCheckedRadioButton()函數獲得。</p><p>  switch(nID_Select_Modul)//對用戶通過單選按鈕選擇的調制參數的判斷</p><p>  { case IDC_RADIO_BW://無調制情況</p><p>  viPrintf(/*f

72、uncgen*/theApp.m_Session,"OUTPut:LOAD %s\n",m_nResistance);//輸出端的設置</p><p>  viPrintf(/*funcgen*/theApp.m_Session,"OUTPut:SYNC %s\n",m_nSignal);//設置同步信號</p><p>  CheckWaveRad

73、ioButton();//這是一個自己定義的函數,對用戶的波形的選擇進行判斷-將波形的字符串存儲在m_nBaseShape中,該函數的具體代碼將會在附錄中給出。</p><p>  //判斷用戶選擇的波形是否是方波,并通過函數viPrintf來進行各種SCPI命令的執(zhí)行</p><p>  if(GetCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_D

74、C)==IDC_RADIO_FWAVE)</p><p>  {viPrintf(/*funcgen*/theApp.m_Session,"FUNC %s\n",m_nBaseShape);</p><p>  viPrintf(/*funcgen*/theApp.m_Session,"FREQ %f\n",m_nFreq);</p>

75、<p>  viPrintf(/*funcgen*/theApp.m_Session,"VOLT %f\n",m_nAmpl);</p><p>  viPrintf(/*funcgen*/theApp.m_Session,"VOLT:OFFS %f\n",m_nOffs);</p><p>  viPrintf(/*funcgen*/t

76、heApp.m_Session,"FUNC:SQU:DCYC %f\n",m_nDcycle);</p><p>  }//判斷用戶選擇的是否是任意波</p><p>  else if(GetCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_DC)==IDC_RADIO_ARBI)</p><p>  {er

77、ror=viPrintf(/*funcgen*/theApp.m_Session,"APPL:USER %f,%f,%f\n",m_nFreq,m_nAmpl,m_nOffs);</p><p>  if(error!=VI_SUCCESS)</p><p>  {error_handler(/*funcgen*/theApp.m_Session,error);<

78、/p><p><b>  break;}</b></p><p>  viPrintf(/*funcgen*/theApp.m_Session,"FUNC:USER%s\n",WaveForm.m_Arbitrary);</p><p><b>  }</b></p><p>&l

79、t;b>  else</b></p><p>  {error=viPrintf(/*funcgen*/theApp.m_Session,"APPL:%s %f,%f,%f\n",m_nBaseShape,m_nFreq,m_nAmpl,m_nOffs);//這里的參數需要用戶自己添加</p><p>  if(error!=VI_SUCCESS)&l

80、t;/p><p>  { error_handler(/*funcgen*/theApp.m_Session,error);</p><p><b>  break;}}</b></p><p>  MessageBox("Successfully!");//給一個提示框--明示用戶的操作</p><p>

81、;<b>  break; </b></p><p>  以上只是無調制情況下的輸出代碼,而調幅、調頻等的實現代碼將會在附錄給給出。 </p><p>  對儀器的編程中,首先是先打開跟資源管理器的會話,然后通過資源管理器會話來進一步打開與某一臺儀器的會話(會話也就是與儀器進行通訊,所有被使用的儀器都需要建立連接,并且都要調用VISA函數viOpenDefaul

82、tRM來打開資源管理器,這個函數會初始化VISA系統(tǒng),包括資源管理系統(tǒng);如果在沒有器件連接的情況下調用該函數,則在有器件連接上時又進行一次操作,則連接的器件是不被認識的;你必須關閉所有的資源管理器會話,并重新的打開才行);當結束訪問之后需要對會話進行清除操作,調用函數viClose對資源會話和其他會話進行關閉。該操作會把所有分配給指定會話的數據結構資源進行釋放操作。上面給出的是在用戶配置好各種參數后的執(zhí)行代碼。然而,在自己的界面的設計過

83、程中也給出了一些配置信息,比如,頻率,幅值,偏移,占空比(其中對占空比也做了特別的處理,因為占空比參數只適合于方波,所以在選中其他波形的時候需要對該參數進行屏蔽,以防止用戶的輸入)。當用戶選擇調制方式的時候,會彈出對話框以提供用戶的輸入操作:</p><p><b>  圖3-10</b></p><p>  可以看出在該界面中共有四種調制方式,也是最基本的調制方式。

84、在彈出時,各個參數都有其初始值以方便用戶。對于其中的數據的處理比較簡單:通過VC的ClassWizard對界面中的各個控件進行變量的定義,以接收用戶的數據的輸入:</p><p><b>  圖3-11</b></p><p>  在程序的編寫過程中也遇到了一些問題:譬如,多個單選按鈕如何組合在一起,實現真正的單選;當用戶選中一個按鈕之后,如何對用戶的選擇進行判斷,以

85、正確的執(zhí)行用戶所需要的執(zhí)行指令;各個功能模塊之間如何的進行協(xié)調的工作等等。就拿單選按鈕的實現來說,因為我的基本波形的選擇設想是通過用戶的選擇(單選)來進行的,這樣的設計直觀且美觀,符合人們的操作習慣。但是應該如何去實現呢?通過查找書本上介紹的例子,首先進行一些測試例子。測試通過之后,再在程序中進行運用。但是也會遇上這樣那樣的一些問題:例子中能進行正確的執(zhí)行,但是移植到自己的程序中就不行了。(不過,我想說的一點是有許多書籍的內容是很垃圾的

86、,程序不完整不說,而且還誤人子弟)。我現在遇到的問題就是,已經將單選按鈕組合在一起了,也能實現單選了,可是,單擊的波形,與設計的并不一樣,也就是各個單選按鈕之間的功能出現了紊亂。而且還出現了跟另外一組的單選按鈕出現了沖突。當時我就有點懵了。怎么會出現這樣的情況呢??思索了蠻久,使自己對VC中的resource.h文件產生了懷疑:因為該文件中都是一些關于控件ID資源的定義。是不是ID資源沖突了呢?!通過自己的仔細的研究和</p>

87、;<p><b>  圖3-12</b></p><p>  象這樣的問題,如果沒有碰上過,也是有點不知所措的。這是我的小小的心得哦?。?lt;/p><p>  3.2.4函數信號發(fā)生器的程序的調試</p><p>  在調試前,先進行IO Config的配置,并通過VISA 助手進行儀器的連接的測試,通過之后,開始調試程序。<

88、/p><p>  我進行分塊的調試:首先是調試產生不同波形的功能塊是否正常。</p><p><b>  圖3-13</b></p><p><b>  相應的程序如下:</b></p><p>  //******以下是對單選按鈕的處理函數,通過單擊按鈕來進行相應的操作</p><

89、p>  void CGENERATER::OnRadioSin() </p><p>  { m_nEdit_Dcycle.EnableWindow(FALSE);}</p><p>  void CGENERATER::OnRadioTriangle() </p><p>  { m_nEdit_Dcycle.EnableWindow(FALSE);}&

90、lt;/p><p>  void CGENERATER::OnRadioFwave() </p><p>  { m_nEdit_Dcycle.EnableWindow(TRUE);}</p><p>  void CGENERATER::OnRadioRamp() </p><p>  { m_nEdit_Dcycle.EnableWind

91、ow(FALSE);}等等//********************************************以下是對基本波形選擇處理函數</p><p>  void CGENERATER::CheckWaveRadioButton()</p><p>  {int nID_SelectWaveF;</p><p>  nID_SelectWaveF=G

92、etCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_DC);</p><p>  switch(nID_SelectWaveF)</p><p>  {//添加處理代碼--即是對波形參數賦值</p><p>  case IDC_RADIO_SIN:m_nBaseShape="SIN";break;</

93、p><p>  case IDC_RADIO_TRIANGLE:m_nBaseShape="TRI";break;</p><p>  case IDC_RADIO_FWAVE:m_nBaseShape="SQU";break;</p><p>  case IDC_RADIO_RAMP:m_nBaseShape="RA

94、MP";break;</p><p>  case IDC_RADIO_ARBI:m_nBaseShape=m_nArbdlg.m_nSet_Arbitrary;break;</p><p>  case IDC_RADIO_NOISE:m_nBaseShape="NOISE";break;</p><p>  case IDC_RA

95、DIO_PULSE:m_nBaseShape="PULSE";break;</p><p>  case IDC_RADIO_DC:m_nBaseShape="DC";break;</p><p>  default:return;}}</p><p>  上面是對用戶的選擇進行的變量的賦值以備后用。</p>&

96、lt;p>  下面就是產生各種函數的部分(部分代碼):</p><p>  viPrintf(/*funcgen*/m_Session,"OUTPut:LOAD %s\n",m_nResistance);//輸出端的設置</p><p>  viPrintf(/*funcgen*/m_Session,"OUTPut:SYNC %s\n",m_n

97、Signal);//設置同步信號</p><p>  注意:下面這個是一個子程序,用來對用戶的選擇進行判斷,并將用戶選擇的波形的相應的參數傳遞給一個字符串變量中。</p><p>  CheckWaveRadioButton();//波形選擇的判斷--將波形的字符串存儲在m_nBaseShape中</p><p>  //**********************

98、************判斷用戶選擇的波形是否是方波</p><p>  if(GetCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_DC)==IDC_RADIO_FWAVE){viPrintf(/*funcgen*/m_Session,"FUNC %s\n",m_nBaseShape);</p><p>  viPrintf

99、(/*funcgen*/m_Session,"FREQ %f\n",m_nFreq);</p><p>  viPrintf(/*funcgen*/m_Session,"VOLT %f\n",m_nAmpl);</p><p>  viPrintf(/*funcgen*/m_Session,"VOLT:OFFS %f\n",m_n

100、Offs);</p><p>  viPrintf(/*funcgen*/m_Session,"FUNC:SQU:DCYC %f\n",m_nDcycle);</p><p>  }//******************************判斷用戶選擇的是否是任意波</p><p><b>  Else</b><

101、/p><p>  if(GetCheckedRadioButton(IDC_RADIO_SIN,IDC_RADIO_DC)==IDC_RADIO_ARBI)</p><p><b>  {</b></p><p>  error=viPrintf(/*funcgen*/m_Session,"APPL:USER %f,%f,%f\n&quo

102、t;,m_nFreq,m_nAmpl,m_nOffs);</p><p>  if(error!=VI_SUCCESS)</p><p>  {error_handler(/*funcgen*/m_Session,error);</p><p><b>  break;</b></p><p><b>  }&

103、lt;/b></p><p>  viPrintf(/*funcgen*/m_Session,"FUNC:USER %s\n",WaveForm.m_Arbitrary);</p><p><b>  }</b></p><p><b>  else</b></p><p>

104、;  {error=viPrintf(/*funcgen*/m_Session,"APPL:%s %f,%f,%f\n",m_nBaseShape,m_nFreq,m_nAmpl,m_nOffs);//這里的參數需要用戶自己添加</p><p>  if(error!=VI_SUCCESS)</p><p><b>  {</b></p>

105、;<p>  error_handler(/*funcgen*/m_Session,error);</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  Message

106、Box("Successfully!");//給一個提示框--明示用戶的操作</p><p><b>  break;</b></p><p>  上面的程序中對方波進行了特別的處理,因為占空比只適合方波,所以對方波進行另行的處理。其中下面的語句給我?guī)砹艘欢ǖ膯栴}:</p><p>  nID_Select_Modul=G

107、etCheckedRadioButton(IDC_RADIO_BW,IDC_RADIO_FM);</p><p>  //問題的關鍵就出現在這里--該函數沒有執(zhí)行--2005、4、28 //問題解決了!!原來是單選按鈕的ID的值的大小問題!!

108、 //在該函數中,小的在前,大的在后!!!--2005/4/29</p><p>  問題就向注釋的文字所說的那樣,單選按鈕的ID在這個函數中是有大小區(qū)分的,當時卻沒有進行留意,結果把我給郁悶了!點擊按鈕卻沒有執(zhí)行相應的功能。不過我利用設置斷點進行分段調試,被我給發(fā)現了這個函數并沒有執(zhí)行。于是我就思索著是否是ID的原因,就

109、像我前面所說的那樣去查看resource.h文件中的ID的關系。最后,對自己的猜測進行試驗,結果一切OK了!!“試驗是檢驗真理的唯一標準”是一個不變的真理。</p><p>  基本波形在測試成功之后,需要將其與調制方式結合起來。因為調制需要一個調制波和一個載波。我就利用基本波作為調制波,而通過另外一組單選按鈕來進行載波的配置。這樣就比較的清晰。而為了方便用戶的操作,我調制方式的單選按鈕中加入了一個無調制的按鈕,

110、并作為一個默認的設置,如下圖:</p><p><b>  圖3-14</b></p><p>  這樣的處理就可以把基波的產生和最為載波進行很好區(qū)別。不至于使用戶分辨不清哪個是載波與調制波。而當用戶單擊調制方式中的一個的時候就會彈出另外一個對話框:</p><p><b>  圖3-15</b></p>&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論