新聞中心

EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > Labview與其他應(yīng)用程序的接口設(shè)計(jì)

Labview與其他應(yīng)用程序的接口設(shè)計(jì)

作者: 時(shí)間:2017-01-09 來(lái)源:網(wǎng)絡(luò) 收藏

下面的內(nèi)容將具體講解:

配置Call library function node (CFN)

無(wú)論在labview中使用自己開(kāi)發(fā)的DLL,或者硬件驅(qū)動(dòng)供應(yīng)商(操作系統(tǒng))提供的API,都可以通過(guò)配置CFN來(lái)完成。如下圖



在CFN圖標(biāo)的右鍵菜單選擇“配置”,打開(kāi)配置對(duì)話(huà)框,通過(guò)該對(duì)話(huà)框,可以指定動(dòng)態(tài)庫(kù)存放路徑、調(diào)用函數(shù)名以及傳遞給函數(shù)的參數(shù)類(lèi)型和函數(shù)返回值的類(lèi)型。在配置完成后,CFN節(jié)點(diǎn)會(huì)根據(jù)用戶(hù)的配置自動(dòng)更新其顯示。



通過(guò)browse按鈕或者直接在library name or path輸入框中指定調(diào)用函數(shù)多在.dll文件的路徑。

通過(guò)browse按鈕下的控件用戶(hù)可以指定多個(gè)線(xiàn)程同時(shí)調(diào)用DLL。默認(rèn)情況下,labview以run in UI Thread方式調(diào)用DLL,調(diào)用的函數(shù)將直接在用戶(hù)線(xiàn)程中運(yùn)行。另外一種方式是遞歸方式reentrant,在這種情況下可以允許多個(gè)線(xiàn)程同時(shí)調(diào)用DLL中的函數(shù)。但要確保正常調(diào)用,必須使dll中的代碼線(xiàn)程安全。

在“Function Name”輸入框中指定要調(diào)用函數(shù)的函數(shù)名。
通過(guò)“Call Conventions”下拉列表框指定調(diào)用DLL 中函數(shù)的方式??梢灾付ㄕ{(diào)用方式為“C”(默認(rèn)方式)或Windows 標(biāo)準(zhǔn)調(diào)用方式“stdcall”。一般來(lái)說(shuō)用“C”方式調(diào)用開(kāi)發(fā)人員自己寫(xiě)的DLL 函數(shù),而 “stdcall”一般做為標(biāo)準(zhǔn)調(diào)用方式來(lái)調(diào)用windows 的API
通過(guò)Parameter 域可以指定所調(diào)用函數(shù)的返回值類(lèi)型。默認(rèn)情況下CFN 節(jié)點(diǎn)沒(méi)有輸入?yún)?shù)而且只有一個(gè)void 類(lèi)型的返回參數(shù)。該參數(shù)由CFN 節(jié)點(diǎn)第一對(duì)連接點(diǎn)的右端返回,代表CFN 執(zhí)行結(jié)果。如果返回參數(shù)的類(lèi)型是void 類(lèi)型,則CFN 連接點(diǎn)為未啟用狀態(tài)(保持為灰色)。CFN 的每一對(duì)連接點(diǎn)代表一個(gè)輸入或輸出參數(shù),若要傳遞參數(shù)給CFN 則將參數(shù)連接至相應(yīng)連接點(diǎn)的左端,若要讀取返回值,則將相應(yīng)連接點(diǎn)的右端連接到Indicator。CFN 返回參數(shù)的類(lèi)型可以是Void,Numeric 或String。只能為返回參數(shù)指定Void 類(lèi)型,輸入?yún)?shù)不能指定為Void 類(lèi)型。調(diào)用的函數(shù)沒(méi)有返回值時(shí),指定CFN 的返回參數(shù)類(lèi)型為void 類(lèi)型。即使參數(shù)有確定類(lèi)型的返回值,也可以指定CFN 的返回類(lèi)型為Void,但是此時(shí),函數(shù)的返回值將被忽略。有些時(shí)候,調(diào)用的函數(shù)返回值不是以上三種類(lèi)型,可以使用與以上三種類(lèi)中有相同大小的一個(gè)來(lái)代替。例如如果調(diào)用的函數(shù)返回一個(gè)Char 類(lèi)型數(shù)據(jù),則可以用一個(gè)8-bit unsigned integer Numeric 類(lèi)型來(lái)代替。此外,由于LabVIEW 中沒(méi)有指針,因此調(diào)用DLL 中的返回指針的函數(shù)似乎不可能。但是可以設(shè)定返回值類(lèi)型為一個(gè)與指針有相同大小的Integer 類(lèi)型,LabVIEW 將把地址以整型值來(lái)看待,并且用戶(hù)可以在以后的調(diào)用中直接使用它。

通過(guò)Parameter 域和其右邊的“Add a Parameter Before”,“Add a Parameter After” 和“Delete thisParameter”三個(gè)按鈕可以增加、刪除以及修改CFN 的輸入?yún)?shù)和類(lèi)型。當(dāng)用戶(hù)選擇某參數(shù)的類(lèi)型后,其詳細(xì)的數(shù)據(jù)類(lèi)型列表和參數(shù)傳遞方式列表將顯示出來(lái),以方便進(jìn)行詳細(xì)設(shè)定。下表列出了可以設(shè)定的輸入?yún)?shù)類(lèi)型及其詳細(xì)數(shù)據(jù)類(lèi)型信息。



有時(shí)可能在CFN 配置對(duì)話(huà)框中并不能找到要傳遞給它的參數(shù)類(lèi)型,在這種情況下可以通過(guò)下面方法來(lái)解決。如果參數(shù)不含指針,則可以通過(guò)Flatten to String 函數(shù)將參數(shù)轉(zhuǎn)換為字符串,并將此字符串指針傳遞給函數(shù)。還有其它一些技巧請(qǐng)參見(jiàn)NI 手冊(cè)。設(shè)定后的最終結(jié)果顯示在“Function Prototype”文本框中,在確認(rèn)前,可以在此檢查設(shè)定是否正確。如果不正確可以在此修改設(shè)定。

調(diào)用自己開(kāi)發(fā)DLL中的函數(shù)

開(kāi)發(fā)人員可以在LabVIEW 中指定DLL 函數(shù)的原型,然后在外部IDE 中完成代碼并編譯生成.dll 文件以
供項(xiàng)目使用。
下面就以一個(gè)簡(jiǎn)單的求數(shù)組求和的項(xiàng)目為例來(lái)說(shuō)明這種開(kāi)發(fā)過(guò)程。
1. 在LabVIEW 中創(chuàng)建DLL 函數(shù)原型。
a) 在LabVIEW 的diagram 面板上添加一個(gè)CFN 并通過(guò)其右鍵菜單打開(kāi)CFN 的配置對(duì)話(huà)框;
b) 使“Library Name or Path”輸入框?yàn)榭眨?br />c) 指定函數(shù)名“Function Name”和調(diào)用方式“Calling Conventions”分別為add_num和C;
d) 重命名返回參數(shù)的名稱(chēng)為“error”,并指定其類(lèi)型為Numeric 的Signed 32-bit Integer;
e) 用“Add a Parameter After”按鈕添加第一個(gè)參數(shù)p,指定其類(lèi)型為Array 的4-byte Single 并設(shè)定Array Format 為Array Data Pointer;
f) 用“Add a Parameter After”按鈕添加第二個(gè)參數(shù)size,指定其類(lèi)型為為Numeric 的Signed32-bit Integer 并設(shè)置參數(shù)傳遞方式為Value;
g) 用“Add a Parameter After”按鈕添加第三個(gè)參數(shù)sum,指定其類(lèi)型為為Numeric 的4-byteSingle 并設(shè)置參數(shù)傳遞方式為Pointer to Value;
h) 至此,函數(shù)的原型應(yīng)如下圖所示

long add_num(float *p, long size, float *sum);


i) 確定后會(huì)發(fā)現(xiàn)CFN 根據(jù)配置自動(dòng)進(jìn)行了更新更新后的情況如圖示。



2. 生成.C 或.C++文件,完成實(shí)現(xiàn)函數(shù)功能的代碼并為函數(shù)添加DLL 導(dǎo)出聲明;
在CFN 節(jié)點(diǎn)上通過(guò)右鍵菜單選擇“Create .C File…”生成mydll.c 文件,其內(nèi)容如下:



將以下代碼插入到句之后實(shí)現(xiàn)函數(shù)的功能。
int i;
float tmpSum = 0;
if(p != NULL)
{
for(i=0; i < size; i++)
tmpSum = tmpSum + p[i];
}
else
return (1);
* sum = tmpSum;
return (0);
在完成實(shí)現(xiàn)函數(shù)功能的代碼后,還必須為函數(shù)添加導(dǎo)出聲明以便能在LabVIEW 中使用這些函數(shù)。
C/C++聲名導(dǎo)出函數(shù)的關(guān)鍵字是_declspec (dllexport),使用該關(guān)鍵字可以代替模塊定義文件。
對(duì)于此處的例子來(lái)說(shuō),只要在函數(shù)聲明和定義部分添加關(guān)鍵字即可。最終代碼如下:



3. 在外部IDE(以VC++為例)中創(chuàng)建DLL 項(xiàng)目并編譯生成.dll 文件。
用VC++ 6.0 進(jìn)行編譯生成.dll 文件的步驟如下:
a) 在VC++中創(chuàng)建一個(gè)DLL 項(xiàng)目,如果在DLL 中沒(méi)有使用MFC 就選擇創(chuàng)建“Win32Dynamic-Link Library”,否則選擇“MFC AppWizard(dll)”,對(duì)此例子來(lái)說(shuō)選擇前者。選定后進(jìn)入下一步選擇創(chuàng)建一個(gè)空的DLL 項(xiàng)目。
b) 通過(guò)Project»Add to Project»Files 添加mydll.c 到創(chuàng)建的mydll 項(xiàng)目之中
c) 通過(guò)Project»Settings 打開(kāi)項(xiàng)目配置對(duì)話(huà)框,選擇C/C++選項(xiàng)卡。
d) 配置項(xiàng)目的All Configurations。選擇Settings For 下拉列表框中的All Configurations,選擇Category下拉列表框中的Code Generation,最后設(shè)置Struct member alignment 為1 Byte。



e) 配置項(xiàng)目的Release 版本。選擇Settings For 下拉列表框中的Win32 Release,選擇Category下拉列表框中的Code Generation,最后從Use run-time library 下拉列表框中選擇Multithreaded DLL。配置結(jié)果如圖。




f) 配置項(xiàng)目的Debug 版本。選擇Settings For 下拉列表框中的Win32 Debug,選擇Category
下拉列表框中的Code Generation,最后從Use run-time library 下拉列表框中選擇Debug
Multithreaded DLL。配置結(jié)果如圖


4. 在LabVIEW 項(xiàng)目中調(diào)用.dll 中的函數(shù)。創(chuàng)建如圖所示的VI,其中Array 為Representation»Single Precision 類(lèi)型的數(shù)組,Sum 為Representation»Single Precision 類(lèi)型的Indicator, error 為Representation»Long 類(lèi)型的Indicator。運(yùn)行后可以看到對(duì)數(shù)組求和的結(jié)果。




調(diào)用API的例子不細(xì)述了。

5、調(diào)用ActiveX控件:不細(xì)述??磍abview自帶的例子。

6、調(diào)用.dll程序集和共享庫(kù)。通過(guò).net容器,查看自己編寫(xiě)的光功率計(jì)采樣程序。有時(shí)間會(huì)加到這里面來(lái)。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: Labview接口設(shè)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉