最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

LabVIEW與LabWindows CVI的聯(lián)合編程

2020-05-31 14:07 作者:江南拱橋夜  | 我要投稿

前言:

? ? ? ?本文主要介紹NI公司圖形化編程語言-虛擬儀器LabVIEW軟件如何調(diào)用NI公司的?基于C語言的開發(fā)環(huán)境-LabWindows CVI開發(fā)語言生產(chǎn)的(Dynamic Link Library,縮寫為 DLL),實現(xiàn)不同開發(fā)環(huán)境之間LabVIEW和C語言的接口互連,提高不同開發(fā)環(huán)境之間的互操作性,極大方便了使用不同開發(fā)環(huán)境的軟件工程師之間實現(xiàn)系統(tǒng)和軟件集成;

? ? ?? LabVIEW是一種圖形化編程語言,具有簡單易學(xué)、形象直觀的特點。同時,LabVIEW作為一種通用的、完善的高級編程語言,具有強大的外部接口能力,這些接口包括DLL、C語言接口(CIN)、 ActiveX、NET. DDE、MATLAB等。通過這些接口,用戶能夠方便地調(diào)用C、VC、VB、Labwindows CVI等編程語言編寫的程序??梢詫崿F(xiàn)LabVIEW與C、Basic、Matlab、Labwindows CVI等編程語言,甚至與外部應(yīng)用軟件(如Word、Excel等)之間的通信,達到代碼復(fù)用及提高開發(fā)效率的目的。通過動態(tài)連接庫DLL文件實現(xiàn)LabVIEW中與外部程序的接口技術(shù),是最常用的一種方式,通過這種技術(shù)可以編寫出功能更加強大的應(yīng)用軟件。

? ? ? ?因此,通過示例來學(xué)習(xí)如何調(diào)用外部dll。動態(tài)鏈接庫(Dynamic Link Library,DLL)是一個可以多方共享的程序模塊,內(nèi)部對共享的例程和資源進行了封裝。動態(tài)鏈接庫文件的擴展名一般是.dll,DLL 和可執(zhí)行文件(EXE)非常類似,最大的區(qū)別在于DLL雖然包含了可執(zhí)行代碼卻不能單獨執(zhí)行, 必須由Windows應(yīng)用程序直接或間接調(diào)用。

一、簡單實例

? ? ? ?本節(jié)我們通過調(diào)用外部鏈接庫的方式,來實現(xiàn):輸入一個 Double 型數(shù)組數(shù)組及其長度,輸出一個整型數(shù)組。該整型數(shù)組中每個元素對應(yīng)輸入數(shù)組中每個元素求平方后的基數(shù)。

1.1?生成DLL文件

? 首先我們在Labwindows CVI中新建一個項目,寫入算法代碼并生成目標(biāo)DLL文件:

? 方法如下:

? 打開LabWindows CVI 2019,選擇 New-project,如下圖所示;

選擇File-New-Source(*.c)和File-New-Include(*.h),如下圖所示;

選擇Edit-Insert Construct-Insert Code Snippet DllMain,如下圖所示;

? ? ? ?此時,cvi會自動創(chuàng)建主函數(shù)DllMain,點擊保存命名:保存源文件,頭文件以及項目文件,并在源文件和頭文件中加入ArrayFloor1d函數(shù),如下圖所示;Dll工程的.c代碼如下所示:


#include <ansi_c.h>

#include <cvirte.h>

?int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

{

?????? switch (fdwReason)

?????? {

????????????? case DLL_PROCESS_ATTACH:

???????????????????? if (InitCVIRTE (hinstDLL, 0, 0) == 0)

??????????????????????????? return 0; ? /* out of memory */

???????????????????? break;

????????????? case DLL_PROCESS_DETACH:

???????????????????? CloseCVIRTE ();

???????????????????? break;

? ? ?? }

?????? return 1;

}

void __stdcall ArrayFloor1d(double *intput,int length,int *output)

{

?????? int i ;

?????? for (i=0;i<length ;i++)

?????? {

????????????? output[i]=(int)(intput[i]*intput[i]);

?????? }

}

? ? ? ?對LabwindowsCVI Dll工程來說,需要配置IDE來告訴其哪些DLL函數(shù)是可以被外部程序加載和調(diào)用的,其步驟如下所示:1) 單擊Build->Target Settings,2)在彈出的對話框中,在Exports方框中單擊Chang. 3)在彈出的對話框中,選擇要導(dǎo)出的DLL函數(shù)聲明的頭文件ArrayFloor.h并在Export what選擇 Include file and marked symbols。4) 單OK按鈕,完成配置。(注意:Labwindows2019只有32位,因此LabVIEW2019也要選擇32位)。

1.2? 編寫LabVIEW程序

在前面板上編寫程序:

? ? ?? 通過外部編譯器(例如Labwindows)將代碼編譯為動態(tài)鏈接庫DLL文件后,在調(diào)用庫函數(shù)對話框中指定該動態(tài)鏈接庫的地址,選擇函數(shù)名:

? ? ? 線程設(shè)置可以任意,調(diào)用規(guī)范必須設(shè)置為C。

? ? ? 在調(diào)用庫函數(shù)“參數(shù)”選項卡中,“ArrayFloor1d”函數(shù)本身返回值為“void”,所以,其返回類型設(shè)置為空即可。對其它3個參數(shù)設(shè)置如下:input:該參數(shù)為指向“double”的指針類型,對應(yīng)LabVIEW的一維數(shù)組。所以,“類型”設(shè)為“數(shù)組”;“維數(shù)”設(shè)為1;“數(shù)據(jù)類型”設(shè)為“8字節(jié)雙精度”;“數(shù)組格式”設(shè)為“數(shù)組數(shù)據(jù)指針”;最小尺寸設(shè)為“<None>”;length:“類型”設(shè)為“數(shù)值”;“數(shù)據(jù)類型”設(shè)為“有符號32位整型”選項;“傳遞”設(shè)為“值”; output:該參數(shù)為指向“int”的指針類型,對應(yīng)LabVIEW的一維數(shù)組。所以,“類型”設(shè)為“數(shù)組”;“維數(shù)”設(shè)為1;“數(shù)據(jù)類型”設(shè)為“有符號32位整型”;“數(shù)組格式”設(shè)為“數(shù)組數(shù)據(jù)指針”。如下所示:

?

? ? ? ?配置好參數(shù)后,就需要要添加輸入輸出,由于Output用于得到函數(shù)汁算結(jié)果,因此輸入時只需要輸入一個常數(shù)初始化數(shù)組即可。運行程序,可以在前面板看到:

二、學(xué)以致用

? ? ??上節(jié)我們已經(jīng)介紹了如何利用LabWindows CVI編寫DLL文件,以及LabVIEW如何調(diào)用DLL文件。本節(jié)我們對其學(xué)以致用,我們通過仿真信號函數(shù)來產(chǎn)生一個帶白噪聲的正弦信號,然后調(diào)用C語言寫的一階簡單低通濾波算法來處理該信號。首先仿真信號函數(shù)在函數(shù)面板中的位置為:

我們在LabWindows CVI 2019中新建一個項目,編寫一階簡單低通濾波算法的代碼:

void __stdcall Filter(double *intput,int length,float coef,double *output)

?{

?????? ?int i;

?????? ?for(i=0;i<length;i++)

?????? ?{

????????????? ?if(i==0) ?

? ? ? ? ? ? ?? output[i]=intput[i];

? ? ? ? ? ? ? output[i]=coef*output[i-1]+(1-coef)*intput[i];

?????? ?}

}

然后生成目標(biāo)DLL文件(生成DLL文件的步驟前面已經(jīng)贅述了,下面就不在介紹):然后在labVIEW中新建一個空白 VI,編寫如下代碼:

然后在調(diào)用庫函數(shù)對話框進行參數(shù)的配置:

?

? ? ? ?這里需要格外注意:我在C語言的程序中對形參使用了double,int,float等類型的數(shù)據(jù)類型:它們在labVIEW中有相對應(yīng)的數(shù)據(jù)類型:這個數(shù)據(jù)類型一定要配置正確,否則程序就會出錯。配置完成以后,我們就可以運行程序,在前面板觀察:我們可以看出通過調(diào)用DLL文件來濾波的效果和利用自帶函數(shù)濾波的效果相差不大,這說明了調(diào)用DLL文件是一個可行的方案。

三、局限性

由于LabVIEW自身的一些特點,并非所有的DLL都能在LabVIEW中直接調(diào)用。遇到下列情形不能直接調(diào)用DLL。

A. LabVIEW以CLN方式調(diào)用DLL時只能使用導(dǎo)出函數(shù),不允許使用導(dǎo)出變量。

B. LabVIEW目前僅支持有限的面向?qū)ο缶幊?,無法直接使用導(dǎo)出類的DLL。

C. MFC擴展DLL是基于面向?qū)ο蟮恼Z言的,LabVIEW無法直接使用。

D. 包含復(fù)雜數(shù)據(jù)結(jié)構(gòu),如鏈表或者需要動態(tài)分配內(nèi)存的DLL函數(shù)。

E. 函數(shù)的返回值是復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

四、結(jié)論

? ? ? ? 通過以上實例,由上面的例子可以看出,LabVIEW中調(diào)用動態(tài)連接庫DLL文件中函數(shù)的編程并不復(fù)雜,關(guān)鍵是要知道被調(diào)用函數(shù)的名稱,并且保證輸入、輸出參數(shù)的順序及數(shù)據(jù)類型要配置正確即可。我們可以也看出LabVIEW可以方便地調(diào)用各種編譯軟件生成的DLL文件,這樣,用戶在編寫大型項目時更加靈活,也為熟悉C語言的工程師提供了巨大的方便。


LabVIEW與LabWindows CVI的聯(lián)合編程的評論 (共 條)

分享到微博請遵守國家法律
扬州市| 郎溪县| 长阳| 台东市| 得荣县| 内乡县| 宝清县| 灵丘县| 邛崃市| 卓尼县| 泌阳县| 永年县| 含山县| 沐川县| 黑河市| 潢川县| 宁化县| 高雄市| 永和县| 卢湾区| 封丘县| 沂南县| 武隆县| 改则县| 禄劝| 青龙| 马公市| 四子王旗| 阿图什市| 台东县| 衡水市| 大名县| 定襄县| 定边县| 武胜县| 堆龙德庆县| 龙门县| 抚州市| 司法| 云南省| 乳山市|