第6章Advanced子模板及LabVIEW與C語(yǔ)言的接口方法_第1頁(yè)
第6章Advanced子模板及LabVIEW與C語(yǔ)言的接口方法_第2頁(yè)
第6章Advanced子模板及LabVIEW與C語(yǔ)言的接口方法_第3頁(yè)
第6章Advanced子模板及LabVIEW與C語(yǔ)言的接口方法_第4頁(yè)
第6章Advanced子模板及LabVIEW與C語(yǔ)言的接口方法_第5頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第6 6章章AdvancedAdvanced子模板及子模板及LabVIEWLabVIEW與與C C語(yǔ)言的接口方法語(yǔ)言的接口方法6.1 概概 述述 用前面介紹的知識(shí)完全可以完成一個(gè)完整的虛擬儀器測(cè)試系統(tǒng)的基本編程,但是LabVIEW并不是萬(wàn)能的,它所提供的圖標(biāo)功能是有限的,實(shí)際系統(tǒng)中仍然有某些功能是LabVIEW無(wú)法或難以實(shí)現(xiàn)的。針對(duì)這個(gè)問(wèn)題,LabVIEW在Advanced子模板上提供了和C語(yǔ)言的接口,還提供了調(diào)用Windows動(dòng)態(tài)鏈接庫(kù)DLL函數(shù)以及實(shí)現(xiàn)多線(xiàn)程編程等高級(jí)功能。 6.2 Advanced子模板1. 調(diào)用路徑FunctionsAdvancedAdvanced子模板如圖61所示。

2、圖61 Advanced子模板Advanced 子模板上提供了五類(lèi)圖標(biāo),其簡(jiǎn)述如下。 2Advanced 子模板簡(jiǎn)介 Call Library Function 圖標(biāo)。用來(lái)調(diào)用動(dòng)態(tài)鏈接庫(kù)函數(shù)。 Code Interface Node 圖標(biāo)。用來(lái)調(diào)用源代碼程序。 Data Manipulation 圖標(biāo)。用于實(shí)現(xiàn)對(duì)兩個(gè)數(shù)據(jù)進(jìn)行合并,或把一個(gè)數(shù)進(jìn)行分離等任務(wù)。 Synchronization 圖標(biāo)。用于多線(xiàn)程的開(kāi)發(fā)。 Memory 圖標(biāo)。用于直接訪(fǎng)問(wèn)硬件地址。 本章主要介紹 CIN (Code Interface Node) 的使用方法。 6.3 CIN(代碼接口節(jié)點(diǎn))圖標(biāo)及其與C語(yǔ)言接口技術(shù) C

3、IN是Code Interface Node的簡(jiǎn)稱(chēng)。Advanced子模板上提供了CIN圖標(biāo),可以實(shí)現(xiàn)在LabVIEW中引入C語(yǔ)言源代碼,因此它是LabVIEW圖形化編程語(yǔ)言環(huán)境與C語(yǔ)言的接口。C語(yǔ)言是功能非常強(qiáng)大的文本式編程語(yǔ)言,當(dāng)遇到某些LabVIEW圖標(biāo)難以實(shí)現(xiàn)的功能時(shí),就可以通過(guò)CIN圖標(biāo)在LabVIEW中引入C語(yǔ)言源代碼來(lái)實(shí)現(xiàn),從而大大提高了LabVIEW數(shù)據(jù)處理的整體功能。 作為L(zhǎng)abVIEW與C編程語(yǔ)言的接口圖標(biāo),CIN是通過(guò)輸入、輸出端口實(shí)現(xiàn)兩種語(yǔ)言之間的數(shù)據(jù)傳遞的。輸入、輸出端口的個(gè)數(shù)可由設(shè)計(jì)者根據(jù)實(shí)際需要確定。當(dāng)LabVIEW的程序運(yùn)行到CIN節(jié)點(diǎn)時(shí),數(shù)據(jù)由CIN的輸入端口

4、傳遞給C源代碼圖標(biāo),程序轉(zhuǎn)去執(zhí)行C源代碼,代碼執(zhí)行完后,得到的數(shù)據(jù)結(jié)果由CIN的輸出端口返回給LabVIEW。 CIN的設(shè)計(jì)方法大致包括以下幾個(gè)步驟: (1) 確定CIN圖標(biāo)的輸入、輸出參數(shù)個(gè)數(shù)和數(shù)據(jù)類(lèi)型。 (2) 生成C源代碼編輯格式文件。 (3) 在編輯格式文件中的規(guī)定位置(/*Enter Your Code Here*/)填寫(xiě)實(shí)現(xiàn)某種測(cè)量功能的C源代碼,生成最終的C源代碼文件。 (4) 在LabVIEW指定的環(huán)境下編譯步驟(3)中生成的C源代碼文件,并生成可執(zhí)行文件。 (5) 調(diào)用CIN的功能菜單將生成的可執(zhí)行文件載入CIN圖標(biāo)。這樣就基本形成了一個(gè)具備某種功能的CIN圖標(biāo)。 本章以實(shí)現(xiàn)

5、c=a+b為例,介紹CIN圖標(biāo)的使用方法,同時(shí)著重介紹它在驅(qū)動(dòng)數(shù)據(jù)采集卡方面的應(yīng)用。 LabVIEW支持的數(shù)據(jù)采集卡(當(dāng)然NI公司生產(chǎn)的數(shù)據(jù)采集卡在其中之列),是Measurement & Automation軟件檢驗(yàn)時(shí)可識(shí)別的,從而是可以進(jìn)行參數(shù)設(shè)置的數(shù)采卡。這種數(shù)采卡可以調(diào)用第4章介紹的Data Acquisition子模板上的數(shù)據(jù)采集圖標(biāo)進(jìn)行各種方式的數(shù)據(jù)采集。 LabVIEW不支持的數(shù)據(jù)采集卡,Measurement & Automation軟件檢驗(yàn)時(shí)是不可識(shí)別的,當(dāng)然非NI公司生產(chǎn)的數(shù)據(jù)采集卡通常都屬此列,則一般需要設(shè)計(jì)者自己開(kāi)發(fā)驅(qū)動(dòng)程序。通常驅(qū)動(dòng)程序是采用C語(yǔ)言編寫(xiě)

6、的,用CIN接口圖標(biāo)驅(qū)動(dòng)數(shù)據(jù)采集卡的實(shí)質(zhì)與關(guān)鍵步驟是,將C語(yǔ)言編寫(xiě)的驅(qū)動(dòng)程序添入規(guī)定的位置/*Enter Your Code Here*/。6.4 CIN圖標(biāo)的調(diào)用及參數(shù)設(shè)置6.4.1 CIN圖標(biāo)的調(diào)用路徑圖標(biāo)的調(diào)用路徑FunctionsAdvancedCode Interface NodeCode Interface Node子模板如圖62所示。圖62 Code Interface Node子模板 6.4.2 CIN 圖標(biāo)及其端口參數(shù)設(shè)置圖標(biāo)及其端口參數(shù)設(shè)置 初始化時(shí)的CIN圖標(biāo)如圖63所示。CIN圖標(biāo)中表格狀圖案的每一行代表一個(gè)參數(shù),左側(cè)為參數(shù)的輸入值,右側(cè)為CIN運(yùn)行后該參數(shù)的返回值。參

7、數(shù)1輸入口參數(shù)1返回值的輸出口圖63 初始時(shí)的CIN圖標(biāo) 6.4.2.1 設(shè)置設(shè)置CIN圖標(biāo)的輸入、輸出參數(shù)個(gè)數(shù)圖標(biāo)的輸入、輸出參數(shù)個(gè)數(shù) 這里以實(shí)現(xiàn)ca+b運(yùn)算為例來(lái)說(shuō)明CIN圖標(biāo)參數(shù)的添加方法。 初始時(shí),CIN只有一個(gè)參數(shù)的輸入、輸出口。欲增添新的參數(shù)輸入、輸出口,可以利用工具模板上的選擇工具拖放CIN圖標(biāo)來(lái)實(shí)現(xiàn),也可以從CIN圖標(biāo)的快捷菜單中選擇Add Parameter選項(xiàng)來(lái)添加。 有些情況下,有的參數(shù)只能作為輸出值,而沒(méi)有對(duì)應(yīng)的輸入。當(dāng)欲實(shí)現(xiàn)ca+b運(yùn)算時(shí),則c參數(shù)只能是輸出值,它是CIN的運(yùn)行結(jié)果,沒(méi)有對(duì)應(yīng)的輸入值,這時(shí)應(yīng)當(dāng)將其對(duì)應(yīng)的輸入口置為無(wú)效。方法是,把鼠標(biāo)放在相應(yīng)的輸入口,用

8、鼠標(biāo)右擊CIN圖標(biāo),彈出快捷菜單,從中選擇Only Output項(xiàng),則該輸入口變暗,表明其無(wú)效。圖64為本例的CIN圖標(biāo)輸入、輸出口的設(shè)置情況。無(wú)效a返回值b返回值CIN輸出b輸入值a輸入值圖64 添加參數(shù)后的CIN圖標(biāo) 6.4.2.2 設(shè)置參數(shù)的數(shù)據(jù)類(lèi)型設(shè)置參數(shù)的數(shù)據(jù)類(lèi)型 CIN輸入 (輸出) 口參數(shù)的數(shù)據(jù)類(lèi)型由連接在該輸入 (輸出) 口上的控件的數(shù)據(jù)類(lèi)型決定。例如,如果某參數(shù)的輸入 (輸出) 端口連接在一個(gè)數(shù)據(jù)類(lèi)型為int32的數(shù)字控件上,則該參數(shù)的數(shù)據(jù)類(lèi)型為int32型。 有些時(shí)候,設(shè)計(jì)者并不希望將CIN的運(yùn)行結(jié)果顯示到面板上,而只是作為整個(gè)程序的一個(gè)中間運(yùn)行結(jié)果傳遞下去。這時(shí)可以在流程

9、圖上,用鼠標(biāo)右擊該控件對(duì)應(yīng)的終端,從彈出的快捷菜單中選擇Hide Control項(xiàng)將該控件從前面板上隱藏掉。6.5 CIN設(shè)計(jì)步驟 6.5.1 生成生成C源代碼編輯格式文件源代碼編輯格式文件(*.C文件文件)代碼框架代碼框架 從CIN圖標(biāo)的快捷菜單中選擇Create.C File項(xiàng),會(huì)彈出一個(gè)文件存儲(chǔ)對(duì)話(huà)框,鍵入文件名 (本例中文件名設(shè)為add.c),則生成LabVIEW的C語(yǔ)言代碼框架;然后用任意一種文本編輯器將它打開(kāi)。該C文件的代碼框架為/* CIN source file */ 注釋#include extcode.hCIN MgErr CINRun(float64 *a, float6

10、4 *b, float64 *c); 函數(shù)聲明CIN MgErr CINRun(float64 *a, float64 *b, float64 *c) 函數(shù)體 /* ENTER YOUR CODE HERE */ 填入C語(yǔ)言源代碼 return noErr; 6.5.2 添加添加C源代碼源代碼 在/*ENTER YOUR CODE HERE*/處填入設(shè)計(jì)者所編寫(xiě)的C源代碼。對(duì)于本例,填寫(xiě)后的C源代碼文件為/* * CIN source file */#include extcode.hCIN MgErr CINRun(float64 *a, float64 *b, float64 *c);CI

11、N MgErr CINRun(float64 *a, float64 *b, float64 *c)*c=*a+*b;/*添加的代碼*/return noErr; 注:在C源代碼的編寫(xiě)過(guò)程中,除可直接調(diào)用C語(yǔ)言的基本庫(kù)函數(shù)外,LabVIEW提供有專(zhuān)門(mén)支持CIN設(shè)計(jì)的庫(kù)函數(shù),如存儲(chǔ)空間(Memory)的動(dòng)態(tài)分配(后面的采樣舉例中會(huì)用到)、文件的操作等,供設(shè)計(jì)者使用,詳細(xì)內(nèi)容可查看LabVIEW的在線(xiàn)幫助(Online Help)。 6.5.3 *.C文件源代碼的編譯文件源代碼的編譯 *.C文件源代碼的編譯主要是在以C語(yǔ)言為主的開(kāi)發(fā)系統(tǒng)中進(jìn)行。編譯完畢形成一個(gè)可以和CIN圖標(biāo)進(jìn)行動(dòng)態(tài)連接的工程文件

12、*.lsb。下面介紹在VC+集成環(huán)境下編譯*.C源代碼的具體步驟。 (1) 新建一個(gè)DLL工程文件,命名為Add。打開(kāi)VC+開(kāi)發(fā)平臺(tái),執(zhí)行FileNew 操作。 進(jìn)行選項(xiàng):win32 Dynamic Link Library。 添加工程文件名:Add。 location:填寫(xiě)工程文件的存放路徑。也可以采用其默認(rèn)路徑D:Microsoft Visual StudioMyProjects。最后形成工程文件add.cpp。 (2) 向工程文件中添加cin.obj、labview.lib、lvsb.lib、lvsbmain.def四個(gè)文件。執(zhí)行ProjectAdd to ProjectFiles操作,

13、向工程文件添加上述四個(gè)文件。這四個(gè)文件在LabVIEW安裝路徑下的cintools文件夾下的win32子文件夾中。 (3) 向工程文件中添加上面的*.C源代碼文件add.c。添加方法同(2)。 (4) *.C源代碼文件編譯前的設(shè)置。 由菜單項(xiàng)ProjectSetting打開(kāi)設(shè)置對(duì)話(huà)框,逐項(xiàng)設(shè)置。 Setting for選項(xiàng)設(shè)置。All Configuration。 C/C+標(biāo)簽頁(yè)設(shè)置。用鼠標(biāo)左擊C/C+標(biāo)簽頁(yè)按鈕,逐項(xiàng)設(shè)置。l Category:由下拉菜單選擇為Preprocessor。Additional include directories:添加LabVIEW的cintools文件夾的路

14、徑。 假設(shè)LabVIEW安裝路徑為d:LabVIEW,則在Additional include directories處添加路徑d:LabVIEWcintools。l Category:由下拉菜單另選為Code Generation。Strict member alignment:設(shè)置為1 Byte。Use run-time library:設(shè)置為Multithreaded DLL。 Custom Build標(biāo)簽頁(yè)設(shè)置。用鼠標(biāo)左擊Custom Build標(biāo)簽頁(yè),逐項(xiàng)設(shè)置。l Commands:輸入命令行如下:d:labviewcintoolswin32lvsbutil $(TargetName

15、) d “$(WkspDir)$(OurDir)” (假設(shè)LabVIEW的安裝路徑為:d:labview。)l Outputs:輸入命令行如下:$(OutDir)$(TargetName).lsb (5) 添加C源代碼程序。 可在Workspace wizard窗口中雙擊add.c,打開(kāi)源文件添加C源代碼。如果已經(jīng)添加過(guò),則繼續(xù)下一步。 (6) 編譯*.C源代碼文件。 在主菜單Build下選擇Compile add.c選項(xiàng),則進(jìn)行add.c程序的編譯,如有語(yǔ)法等錯(cuò)誤, 則給出錯(cuò)誤提示,按提示修改程序,重新編譯。重復(fù)這一過(guò)程,直至沒(méi)有錯(cuò)誤。 (7) 生成可執(zhí)行文件。 在主菜單Build下選擇Bu

16、ild Add.dll選項(xiàng),即生成可執(zhí)行文件Add.lsb,同時(shí)生成如Add.dll等所需的全部文件。 圖65 CIN圖標(biāo)主菜單 1. 裝載可執(zhí)行文件到CIN圖標(biāo) 回到LabVIEW流程圖窗口,窗口中CIN圖標(biāo)的快捷菜單如圖65所示。從中選擇Load Code Resource項(xiàng),即彈出一個(gè)Choose a code resource file對(duì)話(huà)框,如圖66所示。按照Add.工程文件存入的路徑尋找Debug目錄下的Add.lsb文件,然后點(diǎn)擊“打開(kāi)”按鈕,于是Add.lsb文件就裝入CIN圖標(biāo)中。圖66 Choose a code resource file對(duì)話(huà)框 2. 可執(zhí)行文件的重新裝載

17、及錯(cuò)誤文件的清除 如果在裝載完可執(zhí)行文件后,你對(duì)源代碼又進(jìn)行了修改,則必須重新編譯,重新裝載。 在重新裝載的時(shí)候,CIN圖標(biāo)在再次裝載時(shí),它的快捷菜單發(fā)生了相應(yīng)的改變,如圖67所示。利用其中的Reload Code Resource (對(duì)同一可執(zhí)行文件)或Reload Code Resource From (如果是其它可執(zhí)行文件) 選項(xiàng),可實(shí)現(xiàn)可執(zhí)行文件的重新裝載。圖67 Reload Code Resource菜單 6.5.5 運(yùn)行程序運(yùn)行程序 至此,就完成了CIN的全部設(shè)計(jì)過(guò)程,可運(yùn)行該程序, 改變a、b的值,察看c的輸出顯示。 關(guān)于數(shù)據(jù)采集卡的驅(qū)動(dòng)程序,LabVIEW提供的開(kāi)發(fā)方式有兩個(gè)

18、: 利用端口操作圖標(biāo)In Port.vi和Out Port.vi 開(kāi)發(fā)數(shù)據(jù)采集卡驅(qū)動(dòng)程序。這種方法實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,適于采集精度要求不高的情況, 但對(duì)于精度要求高且較復(fù)雜的采集系統(tǒng), 如包含對(duì)物理內(nèi)存大量操作的情況,這種方法是遠(yuǎn)遠(yuǎn)不能滿(mǎn)足設(shè)計(jì)需要的。 采用LabVIEW提供的CIN (Code Interface Node)圖標(biāo)開(kāi)發(fā)數(shù)據(jù)采集卡驅(qū)動(dòng)程序。這種方法適用于精度要求高且功能復(fù)雜的采集系統(tǒng)的設(shè)計(jì),是一種理想的設(shè)計(jì)方法。 本章我們以非NI公司生產(chǎn)的HY1232型數(shù)據(jù)采集卡的驅(qū)動(dòng)為例,重點(diǎn)介紹利用CIN (代碼接口)子模板驅(qū)動(dòng)數(shù)據(jù)采集卡的方法。最后簡(jiǎn)單介紹利用In Port.vi和Out P

19、ort.vi兩個(gè)端口的操作圖標(biāo)實(shí)現(xiàn)數(shù)據(jù)采集卡驅(qū)動(dòng)的方法。 CIN子模板是LabVIEW與C語(yǔ)言之間的一種接口圖標(biāo)。設(shè)計(jì)者可以將那些在LabVIEW下難以實(shí)現(xiàn)和無(wú)法實(shí)現(xiàn)的功能,利用C語(yǔ)言來(lái)完成,然后再將結(jié)果通過(guò)CIN傳遞回LabVIEW。 在實(shí)際設(shè)計(jì)應(yīng)用中,經(jīng)常會(huì)遇到某些想實(shí)現(xiàn)的功能,利用LabVIEW中現(xiàn)成的圖標(biāo)無(wú)法實(shí)現(xiàn),而利用其它編程語(yǔ)言則很容易實(shí)現(xiàn)的情況,這時(shí)就 需要利用LabVIEW中的接口圖標(biāo)以實(shí)現(xiàn)LabVIEW和其它編程語(yǔ)言之間的連接。CIN圖標(biāo)就是其中的一種。6.6 應(yīng)用舉例:用CIN圖標(biāo)實(shí)現(xiàn)對(duì)HY1232數(shù)據(jù)采集卡的驅(qū)動(dòng) 6.6.1 HY1232數(shù)據(jù)采集卡簡(jiǎn)介數(shù)據(jù)采集卡簡(jiǎn)介 HY

20、1232是一種IBMPC XT/AT總線(xiàn)兼容的數(shù)據(jù)采集卡,其主要性能指標(biāo)如下: 32路單端模擬輸入通道; A/D分辨率為12 bit; 1路模擬輸出通道; D/A分辨率為12 bit;D/A輸出上電清零;模擬輸入電壓范圍:5 V;模擬輸出電壓范圍:5 V或0+5 V;軟件觸發(fā)方式;數(shù)據(jù)傳輸方式采用軟件查詢(xún)方式和中斷方式。 6.6.1.1 HY1232數(shù)據(jù)采集卡工作原理數(shù)據(jù)采集卡工作原理 將HY1232數(shù)據(jù)采集卡插入PC機(jī)的PCI插槽中,待采集的多路模擬信號(hào)通過(guò)一個(gè)40芯的輸入輸出插座分別接到采集卡內(nèi)部的32選1的模擬輸入多路開(kāi)關(guān)上。通過(guò)軟件設(shè)置,選通某模擬輸入通道。對(duì)于HY1232數(shù)據(jù)采集卡,

21、在選通某模擬信號(hào)輸入通道的同時(shí)即啟動(dòng)了該路的A/D轉(zhuǎn)換。當(dāng)A/D轉(zhuǎn)換完成時(shí),采集卡上的轉(zhuǎn)換完成位寄存器的最高位(D7)被置為“1”。用軟件查詢(xún)方式查詢(xún)?cè)摷拇嫫鞯腄7位,當(dāng)查詢(xún)到該位為“1”時(shí),即表明采樣已結(jié)束,可將12 bit的數(shù)據(jù)讀入計(jì)算機(jī)內(nèi)存中。如果采用中斷方式,則在A/D轉(zhuǎn)換完成后,采集卡會(huì)自動(dòng)向計(jì)算機(jī)發(fā)出中斷請(qǐng)求信號(hào)。在中斷服務(wù)程序內(nèi),將12 bit數(shù)據(jù)讀入計(jì)算機(jī)內(nèi)存。 HY1232數(shù)據(jù)采集卡中采用的是12位A/D轉(zhuǎn)換器,轉(zhuǎn)換完畢的12位二進(jìn)制數(shù)中的低八位AD7、AD6AD1、AD0存放在低八位緩沖寄存器中,其高四位AD11、AD10、AD9、AD8存放在高四位緩沖寄存器中。 HY12

22、32數(shù)據(jù)采集卡有32路單端模擬輸入通道,由八位輸入通道選擇寄存器低六位(C4、C3、C2、C1、C0)的二進(jìn)制狀態(tài)字選擇被測(cè)信號(hào)的輸入通道。例如,選擇第4通道輸入信號(hào)的二進(jìn)制狀態(tài)字為00100。表61列入了各寄存器的讀/寫(xiě)操作功能與占用地址。表61 HY1232數(shù)據(jù)采集卡板基地址分配與寄存器讀/寫(xiě)操作功能 6.6.1.2 對(duì)采集卡進(jìn)行參數(shù)設(shè)置對(duì)采集卡進(jìn)行參數(shù)設(shè)置 (1) 確定采集卡的板基地址。板基地址是CPU分配給采集卡內(nèi)存空間的首地址。首地址后面的內(nèi)存空間供采集卡內(nèi)部寄存器分配使用。 HY1232數(shù)據(jù)采集卡板基地址的可選范圍為:200H3FFH (5121023)。通常選0 x280,即28

23、0H (640)。 (2) 確定信號(hào)的輸入方式。選擇設(shè)置信號(hào)是單端輸入還是雙端輸入,單極性信號(hào)還是雙極性信號(hào)。HY1232數(shù)據(jù)采集卡只有32路單端輸入一種方式,故不需要用戶(hù)來(lái)設(shè)置。 (3) 設(shè)置信號(hào)的輸入范圍。根據(jù)輸入信號(hào)幅值范圍和分辨率的要求進(jìn)行選擇。HY1232數(shù)據(jù)采集卡信號(hào)輸入范圍不可選,只能為5 V+5 V,且內(nèi)部的放大器增益固定為1。 (4) 確定采樣觸發(fā)方式。一般分外觸發(fā)、定時(shí)觸發(fā)、軟件觸發(fā)等幾種方式。但對(duì)于HY1232采集卡,只有軟件觸發(fā)一種方式,即在往輸入通道寄存器寫(xiě)入所選通道號(hào)的同時(shí)即觸發(fā)了A/D轉(zhuǎn)換。 (5) A/D轉(zhuǎn)換結(jié)束的判斷。對(duì)于HY1232采集卡分查詢(xún)方式和中斷方式

24、兩種。 (6) 采樣速率的設(shè)置。對(duì)于有些數(shù)據(jù)采集卡(如LabPC1200卡),用戶(hù)可在其最大采樣速率范圍內(nèi)進(jìn)行選擇設(shè)置,以滿(mǎn)足實(shí)際的需要。但HY1232數(shù)據(jù)采集卡的采樣速率是固定的,用戶(hù)不可選。 (7) 設(shè)置信號(hào)輸入通道。在031可選范圍內(nèi)選擇。 (8) 設(shè)置一次采集點(diǎn)數(shù)。6.6.1.3 采集程序流程圖與編程要點(diǎn)采集程序流程圖與編程要點(diǎn)1流程圖HY1232數(shù)采卡單點(diǎn)數(shù)據(jù)采集程序流程圖如圖68所示。圖68 HY1232數(shù)采卡單點(diǎn)數(shù)據(jù)采集程序流程圖開(kāi)始定義全局變量定義局部變量設(shè)置A / D通道號(hào),采樣并啟動(dòng)A / D轉(zhuǎn)換A / D轉(zhuǎn)換結(jié)束否?讀A / D結(jié)果低八位和高四位合并A / D結(jié)果,并將A

25、 / D結(jié)果存于數(shù)據(jù)組中結(jié)束NY2. 數(shù)據(jù)采集程序 HY1232數(shù)據(jù)采集卡采集一個(gè)點(diǎn)的C源程序如下:#include #include #include void main(void) int basea, channel; float value,lo,hi; basea=0 x280; /*板基地址設(shè)為640*/ printf(“Input channel number:”); /*設(shè)置采集通道號(hào)*/ scanf(“%d”,&channel); outp(base, channel); /*往輸入通道寄存器寫(xiě)入所選通道號(hào),并觸發(fā)A/D轉(zhuǎn)換*/ do /*查詢(xún)A/D轉(zhuǎn)換完成寄存器的最

26、高位,若為1,則表明A/D;換結(jié)束,否則繼續(xù)查詢(xún)*/ while(! (inp(basea+5) & 0 x80); lo=inp(base+1); /*讀入A/D結(jié)果的低八位*/hi=inp(base+2); /*讀入A/D結(jié)果的高四位*/value=(lo+hi&0 xf)*256)-2047)*10.0/4096; /*合并后,再將A/D轉(zhuǎn)換的二進(jìn)制結(jié)果轉(zhuǎn)換 成對(duì)應(yīng)的模擬量值*/ getch( ); 3. 編程要點(diǎn)說(shuō)明 1) outp(x,y)和inp(x)函數(shù) C語(yǔ)言接口函數(shù) outp(x,y)函數(shù)的功能是把函數(shù)y送入端口地址為x的寄存器中。outp(base,chan

27、nel) 是把通道號(hào)channel (程序中是由前面板控件設(shè)置)送入地址為base的輸入通道選擇寄存器,并啟動(dòng)該通道的A/D轉(zhuǎn)換。 inp(x)函數(shù)的功能是從端口地址為x的寄存器中讀取二進(jìn)制數(shù)據(jù)。inp(base+1) 從地址為base1的低八位寄存器讀取A/D轉(zhuǎn)換結(jié)果。inp(base+2)從地址為base+2的高四位寄存器讀取A/D轉(zhuǎn)換結(jié)果二進(jìn)制數(shù)的高四位,并清除A/D完成位寄存器和中斷請(qǐng)求信號(hào)。inp(base+5)從地址為base+5的完成位寄存器讀取完成標(biāo)志位I/O顯示值,當(dāng)IO=0時(shí),表示A/D轉(zhuǎn)換未完成;當(dāng)IO=1時(shí),表示A/D轉(zhuǎn)換完畢。 2) A/D轉(zhuǎn)換完成的判別采用Do wh

28、ile循環(huán)語(yǔ)句如下:Do while(! (inp(basea+5) & 0 x80); 句中0 x80的十進(jìn)制數(shù)為128,相應(yīng)二進(jìn)制數(shù)為10000000,故inp(base+5)&0 x80屏蔽了低七位,保留了第八位結(jié)果IO,則:IO=0 (A/D轉(zhuǎn)換未完畢) 時(shí),條件! (inp(basea+6) & 0 x80)為真,Dowhile循環(huán)繼續(xù);IO=1 (A/D轉(zhuǎn)換完畢) 時(shí),條件! (inp(basea+6) & 0 x80)為假,Dowhile循環(huán)停止。 3) A/D轉(zhuǎn)換結(jié)果的合并及工程運(yùn)算 hi&oxf是將A/D結(jié)果高四位 (二進(jìn)制數(shù)) 轉(zhuǎn)化為

29、十六進(jìn)制數(shù), (hi&oxf) *256則將十六進(jìn)制數(shù)轉(zhuǎn)化為十進(jìn)制數(shù),lo+ (hi&0 xf) *256將數(shù)據(jù)合并為一個(gè)十進(jìn)制數(shù)。這里,被測(cè)信號(hào)的輸入范圍設(shè)置為5 V5 V,HY1232卡的分辨率為12位,則量化值Q為10.0/4096 (V) ,而十進(jìn)制數(shù)也需減去滿(mǎn)量程的一半:4096/22048,由于十進(jìn)制數(shù)從0開(kāi)始,故滿(mǎn)量程的一半是2047。因此,用value=(lo+hi&oxf)*256)-2047)*10.0/4096就可以將A/D輸出的二進(jìn)制數(shù)轉(zhuǎn)換為與模擬輸入電壓相對(duì)應(yīng)的電壓值。 例如,若hi=1011、lo=11010011,那么hi&oxf=

30、0 xb, (hi&oxf) *256=11*266,lo+(hi&oxf)*256=(27+26+24+21+20+11*256=3027,則采集卡的模擬輸入電壓為 value=(3027-2047)*10.0/4096=2.3926V 6.6.2 具體設(shè)計(jì)方法具體設(shè)計(jì)方法 1. 模擬信號(hào)采集系統(tǒng)功能描述 使用CIN實(shí)現(xiàn)非LabVIEW支持的HY1232數(shù)據(jù)采集卡的驅(qū)動(dòng)。要求在LabVIEW下利用HY1232采集卡實(shí)現(xiàn)一個(gè)模擬信號(hào)(200 Hz的正弦波)的采集和波形顯示。要求采樣點(diǎn)數(shù)、板基地址和通道號(hào)可設(shè)。 2. 設(shè)計(jì)提示 1) 前面板設(shè)計(jì) 放置三個(gè)輸入控制型數(shù)字控件和一個(gè)圖

31、形控件。 數(shù)字控件1:用來(lái)設(shè)置HY1232數(shù)據(jù)采集卡的板基地址。 基地址basea的數(shù)據(jù)類(lèi)型選為U16 (因?yàn)镠Y1232的基地址最大為3FFH),默認(rèn)值設(shè)為640 (即0 x280)。 數(shù)字控件2:用來(lái)設(shè)置信號(hào)的輸入通道。 通道號(hào)channel的數(shù)據(jù)類(lèi)型選為U8 (因?yàn)镠Y1232的模擬輸入通道為031),默認(rèn)值為0,數(shù)據(jù)范圍為031。數(shù)字控件3:用來(lái)設(shè)置采樣點(diǎn)數(shù)??偛蓸狱c(diǎn)數(shù)samples的數(shù)據(jù)類(lèi)型為32,默認(rèn)值設(shè)為100。圖形控件:用來(lái)顯示采集的波形。設(shè)計(jì)好的前面板如圖69所示。圖69 模擬信號(hào)采集程序前面板 2) 流程圖設(shè)計(jì) (1) 放置CIN圖標(biāo),并設(shè)置圖標(biāo)的輸入、輸出參數(shù)個(gè)數(shù)及數(shù)據(jù)類(lèi)

32、型。 調(diào)用路徑。 由FunctionsAdvancedCode Interface Node路徑調(diào)入Code Interface Node。 參數(shù)設(shè)置。 本例中,CIN圖標(biāo)有三個(gè)輸入?yún)?shù)basea、channel、samples和一個(gè)輸出參數(shù)Waveform。Waveform是一個(gè)double型數(shù)組,用于存放采集結(jié)果。參數(shù)數(shù)據(jù)類(lèi)型的選擇與前面板一致。 (2) C源代碼文件的生成。選擇如圖610所示的CIN圖標(biāo)快捷菜單選項(xiàng)中的Create.c File選項(xiàng),生成C源代碼格式文件(*.C文件)。圖610 CIN圖標(biāo)屬性對(duì)話(huà)框本例生成的格式文件內(nèi)容如下:/* CIN source file */#i

33、nclude extcode.h /* * typedefs */typedef struct int32 dimSize;float64 arg11; TD1;typedef TD1 *TD1Hdl; CIN MgErr CINRun(uInt16 *basea, uInt8 *channel, int32 *samples, TD1Hdl Waveform); CIN MgErr CINRun(uInt16 *basea, uInt8 *channel, int32 *samples, TD1Hdl Waveform) /* ENTER YOUR CODE HERE */ return n

34、oErr;從上面生成的代碼可以看到,因?yàn)槎x的CIN圖標(biāo)輸出參數(shù)是數(shù)組型的,而LabVIEW向CIN傳遞數(shù)組類(lèi)數(shù)據(jù)時(shí),用的是句柄handle。傳遞數(shù)組的句柄結(jié)構(gòu)是這樣定義的:typedef struct int32 dimSize; /*數(shù)組尺寸*/ float64 arg11; /*數(shù)組首地址指針*/ TD1;typedef TD1 *TD1Hdl;對(duì)于一個(gè)有n個(gè)元素的一維數(shù)組,用dimsize函數(shù)表示為dimsizen。對(duì)于一個(gè)mn的二維數(shù)組amn, 用dimSize函數(shù)表示為dimSize0=m,dimSize1=n。 (3) 填寫(xiě)C源代碼。將6.6.1.3節(jié)中的HY1232的C語(yǔ)言采集

35、程序填入到上面的C源代碼框架中。最終完成的C源代碼文件(sampdata.c文件)如下: (注:設(shè)計(jì)者自行添加的語(yǔ)句為黑斜體,其余為自動(dòng)生成的語(yǔ)句) /* * CIN source file */#include extcode.h /*自動(dòng)生成*/#include hosttype.h/*調(diào)用了系統(tǒng)及功能函數(shù),因此添加此頭文件*/#include dos.h /*調(diào)用了C語(yǔ)言中的inp ( )、outp ( )函數(shù),因此添加此頭文件*/* typedefs */typedef struct int32 dimSize; /*數(shù)組尺寸*/ float64 arg11; /*數(shù)組首地址指針*/

36、TD1;typedef TD1 *TD1Hdl;CIN MgErr CINRun(uInt16 *basea, uInt8 *channel, int32 samples, TD1Hdl Waveform); /*函數(shù)聲明*/CIN MgErr CINRun(uInt16 *basea, uInt8 *channel, int32 *samples, TD1Hdl Waveform) /*函數(shù)體*/* ENTER YOUR CODE HERE */ int16 dbyte;/*定義16位字(A/D轉(zhuǎn)換結(jié)果)*/ float64 value; /*定義變量,存放單點(diǎn)的A/D轉(zhuǎn)換結(jié)果對(duì)應(yīng)的模擬量*

37、/ float64 array;/*定義數(shù)組,存放所有點(diǎn)的A/D轉(zhuǎn)換結(jié)果對(duì)應(yīng)的模擬量*/ int32 i;/*定義變量,存放循環(huán)采樣次數(shù)*/ MgErr err=noErr; /*動(dòng)態(tài)設(shè)定數(shù)組Waveform的大小*/ if (err = SetCINArraySize(UHandle)Waveform, 3, *samples)goto out;(*Waveform)dimSize=*samples;/*取數(shù)組組Waveform的參數(shù):dimSize,將其置為samples */array=(*Waveform)arg1;/*取數(shù)組Waveform的參數(shù):arg1e,置給array */*軟

38、件查詢(xún)式采集程序*/for(i=0;i*samples;i+)/*重復(fù)采樣,采樣點(diǎn)數(shù)由samples確定*/ outp(*basea, channel);/*向板基地址寫(xiě)入所選模擬信號(hào)通道號(hào)并啟動(dòng)A/D轉(zhuǎn)換*/dbyte=0;do /*以查詢(xún)方式循環(huán)采樣。采樣結(jié)果送入dbyte(12位)*/ ; while(! (inp(*basea+6) & 0 x80); dbyte=inp(*basea+1) | (inp(*basea+2) & 0 xf)AdvancedMemoryIn Port.viFunctionsAdvancedMemoryOut Port.vi圖612 Memory子模板6.7.2 In Port.vi、Out Port.vi圖標(biāo)端口參數(shù)設(shè)置圖標(biāo)端口參數(shù)設(shè)置1. In Port.vi圖標(biāo)及其端口參數(shù)設(shè)置In Port.vi圖標(biāo)及其端口參數(shù)設(shè)置如圖613所示。圖613 In Port.vi圖標(biāo)及其輸入、輸出參數(shù)設(shè)置 該函數(shù)完成從指定地址讀取一個(gè)字節(jié)或一個(gè)字的操作,其輸入、輸出口參數(shù)及其含義為: 輸入端口: register address:U32型

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論