LabVIEW與C接口設(shè)計(jì)
介紹一種LabVIEW與C接口的設(shè)計(jì)方法。利用此接口方法,可以根據(jù)實(shí)際應(yīng)用的要求,擴(kuò)展LabVIEW的功能。
關(guān)鍵詞:LabVIEW;CIN;Visual C++
Wuxi 214028, China)
LabViEW提供支持VXI總線(xiàn)、GPIB總線(xiàn)、RS?232串行總線(xiàn)接口硬件的驅(qū)動(dòng)程序庫(kù),但它對(duì)物理內(nèi)存的操作受到限制,且對(duì)硬件操作的實(shí)時(shí)性不好。但它提供了CIN(Code Interface Node)節(jié)點(diǎn)。用戶(hù)可在LabVIEW中確定CIN節(jié)點(diǎn)的入口與出口參數(shù)個(gè)數(shù)類(lèi)型,在C編譯環(huán)境下,生成.lsb文件,然后在LabVIEW中對(duì)CIN節(jié)點(diǎn)選擇Load cin object code,最后將該節(jié)點(diǎn)封裝成一個(gè)VI,由主程序調(diào)用。采用CIN節(jié)點(diǎn),也可充分利用Win95支持多線(xiàn)程的功能,提高運(yùn)行效率,利用主線(xiàn)程監(jiān)控各子線(xiàn)程,有效地避免因硬件通信錯(cuò)誤而導(dǎo)致程序被掛起的現(xiàn)象,同時(shí),可充分利用Win95有效的內(nèi)存管理技術(shù),提高數(shù)據(jù)處理及運(yùn)算速度。
2.1VI設(shè)計(jì)
首先在塊流圖(Block Diagram)上放置一個(gè)CIN VI,然后通過(guò)CIN彈出菜單中的Add Parameter增加接線(xiàn)端子(Terminal),通過(guò)接線(xiàn)端子來(lái)標(biāo)識(shí)CIN的輸入和輸出。接線(xiàn)端子通常有輸入輸出接線(xiàn)端子(Input?Output Terminal)和輸出接線(xiàn)端子(Output?Only Terminal),在缺省情況下,接線(xiàn)端子是輸入輸出接線(xiàn)端子,其左邊是輸入,而右邊是輸出。在生成的代碼中,與輸入輸出接線(xiàn)端子對(duì)應(yīng)的是一個(gè)參數(shù),通過(guò)該參數(shù),數(shù)據(jù)輸入CIN,CIN可以使用該參數(shù)的值或修改參數(shù)的值能夠由該參數(shù)返回;如果輸入輸出接線(xiàn)端子的右邊沒(méi)有使用,即只有輸入,則CIN只能使用該參數(shù)的值而不能修改它。對(duì)于輸出接線(xiàn)端子,它只有輸出端,沒(méi)有輸入端。由LabVIEW在內(nèi)存中設(shè)置空間保存CIN的返回值。在定義了CIN接線(xiàn)端子后,將設(shè)定的數(shù)據(jù)控制器(Control,連接輸入)、數(shù)據(jù)指示器(Indicator,連接輸出)與對(duì)應(yīng)的接線(xiàn)端子用線(xiàn)(Wire,代表數(shù)據(jù)流)連接起來(lái),這樣將確定所生成代碼中的參數(shù)類(lèi)型。
上面的過(guò)程只是定義了CIN的內(nèi)部接口,還必須定義VI的編程接口,即肖像/連接器,通過(guò)它才能在程序中調(diào)用設(shè)計(jì)好的VI。在肖像/連接器的設(shè)計(jì)中,盡量使所畫(huà)的肖像能夠表達(dá)出所設(shè)計(jì)的VI的功能,采用在肖像上標(biāo)識(shí)該VI名稱(chēng)的方法。連接器則是標(biāo)明肖像的輸入輸出屬性,數(shù)據(jù)和信息通過(guò)連接器的端點(diǎn)在兩個(gè)VI間傳遞。這樣就設(shè)計(jì)好了一個(gè)VI,但要給它裝入目標(biāo)代碼后才能執(zhí)行。
2.2生成.c文件
在設(shè)計(jì)好CIN VI后,可用LabVIEW生成C語(yǔ)言格式的.c文件。下面是我們?cè)O(shè)計(jì)的StdCMD.VI所生成的StdCMD.c文件:
在所生成的文件中,自動(dòng)包含了文件extcode.h,它是定義能夠被CIN使用的基本數(shù)據(jù)類(lèi)型和外部子程序的頭文件。如果設(shè)計(jì)的CIN代碼含有系統(tǒng)調(diào)用,還必須包含文件hosttype.h。當(dāng)CIN代碼執(zhí)行時(shí),LabVIEW調(diào)用CINRun函數(shù),通過(guò)CINRun函數(shù)的參數(shù)傳遞VI的輸入輸出值。LabVIEW定義的程序返回值是MgErr數(shù)據(jù)類(lèi)型,在執(zhí)行完CIN代碼后,LabVIEW能夠檢查返回值并確定代碼執(zhí)行是否有錯(cuò)誤。
2.3用戶(hù)代碼設(shè)計(jì)
在CINRun函數(shù)體內(nèi)編寫(xiě)用戶(hù)代碼是實(shí)現(xiàn)所設(shè)計(jì)的CIN VI功能的關(guān)鍵。在我們所設(shè)計(jì)的5個(gè)VI中,這部分代碼的編寫(xiě)主要是利用設(shè)計(jì)好的驅(qū)動(dòng)程序完成多機(jī)測(cè)控系統(tǒng)的控制任務(wù),將驅(qū)動(dòng)程序的接口函數(shù)封裝在VI內(nèi),在用LabVIEW編制測(cè)試軟件時(shí),通過(guò)調(diào)用VI來(lái)實(shí)現(xiàn)對(duì)多機(jī)測(cè)控系統(tǒng)的控制操作。
2.4編譯代碼生成.lsb文件
在Windows95/98下,利用Visual C+ 5.0 IDE編譯設(shè)計(jì)代碼,具體操作過(guò)程如下:
(1)創(chuàng)建一個(gè)新的DLL項(xiàng)目。在Visual C++ 5.0 IDE環(huán)境中選擇菜單命令FileNew…..在彈出的對(duì)話(huà)框中New:域中選擇Project Workspace項(xiàng),按OK鍵。在接著彈出的對(duì)話(huà)框中Type:域中選擇Dynamic?Link Library項(xiàng),在Name:域中輸入StdCMD(該項(xiàng)目的名稱(chēng)),在Platforms:域中選擇Win32(表示將要生成的DLL是32位的),在Location:域中輸入(或按Browser…鍵,選擇)源代碼文件所在的路徑(注:編譯過(guò)程中生成的中間文件和可執(zhí)行代碼也會(huì)產(chǎn)生在這個(gè)路徑下),按Create…鍵完成DLL項(xiàng)目的創(chuàng)建。
(2)把CIN的目標(biāo)文件和運(yùn)行庫(kù)添加到項(xiàng)目中。選擇菜單InsertFiles into Project…。把文件…\StdCMD\StdCMD.c添加到項(xiàng)目中;文件把存放在子目錄…\LABVIEW\Cintools\Win32下的文件cin.obj,labview.lib,lvsb.lib和lvsbmain.def添加到項(xiàng)目中。這些文件對(duì)于創(chuàng)建CIN節(jié)點(diǎn)都是必須的;把項(xiàng)目包含的頭文件(.h文件)添加到項(xiàng)目中,這些文件必須在同一目錄(文件夾)中。
(3)把生成節(jié)點(diǎn)的工具所在子目標(biāo)添加到包含路徑中。選擇菜單命令…,在彈出的對(duì)話(huà)框中,選中Settings For:域中的全部?jī)?nèi)容;選中C/C++標(biāo)簽,將其中的Category置為Preprocessor;在A(yíng)dditional include directories域中輸入CIN節(jié)點(diǎn)工具所在的子目錄…\LabVIEW\Cintools。
(4)設(shè)置校準(zhǔn)為1Byte。選擇菜單命令…。在彈出的對(duì)話(huà)框中,選出Settings For:域中的全部?jī)?nèi)容;選中C++標(biāo)簽,將其中的Category置為Code Generations;從Struct member alignment域中選擇1Byte。
(5)選用多線(xiàn)程run-time函數(shù)庫(kù)。選擇菜單命令…,在彈出的對(duì)話(huà)框中,選出Settings For:域中的全部?jī)?nèi)容;選中C/C++標(biāo)簽,將其中的Category置為Code Generations;從Use run?time library域中選擇Multithreaded。
(6)建立一個(gè)定制的生成命令來(lái)運(yùn)行l(wèi)vsbutil程序。選擇菜單命令…在彈出的對(duì)話(huà)框中,選中Settings For:域中的全部?jī)?nèi)容;選中Custom Build標(biāo)簽,在Build command(s):域中輸入…\LabVIEW\Cintools\Win32\lvsbutil$(TargeName)-d$(WkspDir)\$(OutDir);在Output file(s):域中輸入$(OutDir)$(TargetName).lsb。
(7)執(zhí)行生成動(dòng)態(tài)庫(kù)命令。執(zhí)行菜單命令Build?Build StdCMD.Dll。編譯連接正常的情況下,Visual C++編輯器會(huì)按照定制的要求在…\StdCMD\debug目錄下生成StdCMD.lsb文件。
由于編譯代碼的過(guò)程比較煩瑣,容易出錯(cuò),因此我們?cè)O(shè)計(jì)了CIN模板應(yīng)用向?qū)?CinTemp AppWizard),并給出CinTemp.awx和CinTemp.pdb文件。將其添加到Visual C++ 5.0 IDE中,可以由用戶(hù)方便地自動(dòng)生成編譯CIN代碼的項(xiàng)目。
2.5裝載CIN目標(biāo)代碼
裝載CIN目標(biāo)代碼是將生成的.lsb文件裝入VI的過(guò)程。這一過(guò)程將目標(biāo)代碼裝入內(nèi)存并與VI的前面板/塊流圖鏈接起來(lái),保存VI后,即可在程序中調(diào)用該VI實(shí)現(xiàn)設(shè)定的功能。這一過(guò)程的操作是在LabVIEW環(huán)境中打開(kāi)StdCMD.VI程序,將光標(biāo)指到框圖中的CIN節(jié)點(diǎn)按右鍵。選中彈出菜單中的命令,將StdCMD.lsb文件裝載到CIN節(jié)點(diǎn)上。在使用過(guò)程中,也可修改CIN代碼以擴(kuò)充其功能,只需重新裝入新的.lsb文件即可。
首先在塊流圖(Block Diagram)上放置一個(gè)CIN VI,然后通過(guò)CIN彈出菜單中的Add Parameter增加接線(xiàn)端子(Terminal),通過(guò)接線(xiàn)端子來(lái)標(biāo)識(shí)CIN的輸入和輸出。接線(xiàn)端子通常有輸入輸出接線(xiàn)端子(Input?Output Terminal)和輸出接線(xiàn)端子(Output?Only Terminal),在缺省情況下,接線(xiàn)端子是輸入輸出接線(xiàn)端子,其左邊是輸入,而右邊是輸出。在生成的代碼中,與輸入輸出接線(xiàn)端子對(duì)應(yīng)的是一個(gè)參數(shù),通過(guò)該參數(shù),數(shù)據(jù)輸入CIN,CIN可以使用該參數(shù)的值或修改參數(shù)的值能夠由該參數(shù)返回;如果輸入輸出接線(xiàn)端子的右邊沒(méi)有使用,即只有輸入,則CIN只能使用該參數(shù)的值而不能修改它。對(duì)于輸出接線(xiàn)端子,它只有輸出端,沒(méi)有輸入端。由LabVIEW在內(nèi)存中設(shè)置空間保存CIN的返回值。在定義了CIN接線(xiàn)端子后,將設(shè)定的數(shù)據(jù)控制器(Control,連接輸入)、數(shù)據(jù)指示器(Indicator,連接輸出)與對(duì)應(yīng)的接線(xiàn)端子用線(xiàn)(Wire,代表數(shù)據(jù)流)連接起來(lái),這樣將確定所生成代碼中的參數(shù)類(lèi)型。
上面的過(guò)程只是定義了CIN的內(nèi)部接口,還必須定義VI的編程接口,即肖像/連接器,通過(guò)它才能在程序中調(diào)用設(shè)計(jì)好的VI。在肖像/連接器的設(shè)計(jì)中,盡量使所畫(huà)的肖像能夠表達(dá)出所設(shè)計(jì)的VI的功能,采用在肖像上標(biāo)識(shí)該VI名稱(chēng)的方法。連接器則是標(biāo)明肖像的輸入輸出屬性,數(shù)據(jù)和信息通過(guò)連接器的端點(diǎn)在兩個(gè)VI間傳遞。這樣就設(shè)計(jì)好了一個(gè)VI,但要給它裝入目標(biāo)代碼后才能執(zhí)行。
2.2生成.c文件
在設(shè)計(jì)好CIN VI后,可用LabVIEW生成C語(yǔ)言格式的.c文件。下面是我們?cè)O(shè)計(jì)的StdCMD.VI所生成的StdCMD.c文件:
在所生成的文件中,自動(dòng)包含了文件extcode.h,它是定義能夠被CIN使用的基本數(shù)據(jù)類(lèi)型和外部子程序的頭文件。如果設(shè)計(jì)的CIN代碼含有系統(tǒng)調(diào)用,還必須包含文件hosttype.h。當(dāng)CIN代碼執(zhí)行時(shí),LabVIEW調(diào)用CINRun函數(shù),通過(guò)CINRun函數(shù)的參數(shù)傳遞VI的輸入輸出值。LabVIEW定義的程序返回值是MgErr數(shù)據(jù)類(lèi)型,在執(zhí)行完CIN代碼后,LabVIEW能夠檢查返回值并確定代碼執(zhí)行是否有錯(cuò)誤。
2.3用戶(hù)代碼設(shè)計(jì)
在CINRun函數(shù)體內(nèi)編寫(xiě)用戶(hù)代碼是實(shí)現(xiàn)所設(shè)計(jì)的CIN VI功能的關(guān)鍵。在我們所設(shè)計(jì)的5個(gè)VI中,這部分代碼的編寫(xiě)主要是利用設(shè)計(jì)好的驅(qū)動(dòng)程序完成多機(jī)測(cè)控系統(tǒng)的控制任務(wù),將驅(qū)動(dòng)程序的接口函數(shù)封裝在VI內(nèi),在用LabVIEW編制測(cè)試軟件時(shí),通過(guò)調(diào)用VI來(lái)實(shí)現(xiàn)對(duì)多機(jī)測(cè)控系統(tǒng)的控制操作。
2.4編譯代碼生成.lsb文件
在Windows95/98下,利用Visual C+ 5.0 IDE編譯設(shè)計(jì)代碼,具體操作過(guò)程如下:
(1)創(chuàng)建一個(gè)新的DLL項(xiàng)目。在Visual C++ 5.0 IDE環(huán)境中選擇菜單命令FileNew…..在彈出的對(duì)話(huà)框中New:域中選擇Project Workspace項(xiàng),按OK鍵。在接著彈出的對(duì)話(huà)框中Type:域中選擇Dynamic?Link Library項(xiàng),在Name:域中輸入StdCMD(該項(xiàng)目的名稱(chēng)),在Platforms:域中選擇Win32(表示將要生成的DLL是32位的),在Location:域中輸入(或按Browser…鍵,選擇)源代碼文件所在的路徑(注:編譯過(guò)程中生成的中間文件和可執(zhí)行代碼也會(huì)產(chǎn)生在這個(gè)路徑下),按Create…鍵完成DLL項(xiàng)目的創(chuàng)建。
(2)把CIN的目標(biāo)文件和運(yùn)行庫(kù)添加到項(xiàng)目中。選擇菜單InsertFiles into Project…。把文件…\StdCMD\StdCMD.c添加到項(xiàng)目中;文件把存放在子目錄…\LABVIEW\Cintools\Win32下的文件cin.obj,labview.lib,lvsb.lib和lvsbmain.def添加到項(xiàng)目中。這些文件對(duì)于創(chuàng)建CIN節(jié)點(diǎn)都是必須的;把項(xiàng)目包含的頭文件(.h文件)添加到項(xiàng)目中,這些文件必須在同一目錄(文件夾)中。
(3)把生成節(jié)點(diǎn)的工具所在子目標(biāo)添加到包含路徑中。選擇菜單命令…,在彈出的對(duì)話(huà)框中,選中Settings For:域中的全部?jī)?nèi)容;選中C/C++標(biāo)簽,將其中的Category置為Preprocessor;在A(yíng)dditional include directories域中輸入CIN節(jié)點(diǎn)工具所在的子目錄…\LabVIEW\Cintools。
(4)設(shè)置校準(zhǔn)為1Byte。選擇菜單命令…。在彈出的對(duì)話(huà)框中,選出Settings For:域中的全部?jī)?nèi)容;選中C++標(biāo)簽,將其中的Category置為Code Generations;從Struct member alignment域中選擇1Byte。
(5)選用多線(xiàn)程run-time函數(shù)庫(kù)。選擇菜單命令…,在彈出的對(duì)話(huà)框中,選出Settings For:域中的全部?jī)?nèi)容;選中C/C++標(biāo)簽,將其中的Category置為Code Generations;從Use run?time library域中選擇Multithreaded。
(6)建立一個(gè)定制的生成命令來(lái)運(yùn)行l(wèi)vsbutil程序。選擇菜單命令…在彈出的對(duì)話(huà)框中,選中Settings For:域中的全部?jī)?nèi)容;選中Custom Build標(biāo)簽,在Build command(s):域中輸入…\LabVIEW\Cintools\Win32\lvsbutil$(TargeName)-d$(WkspDir)\$(OutDir);在Output file(s):域中輸入$(OutDir)$(TargetName).lsb。
(7)執(zhí)行生成動(dòng)態(tài)庫(kù)命令。執(zhí)行菜單命令Build?Build StdCMD.Dll。編譯連接正常的情況下,Visual C++編輯器會(huì)按照定制的要求在…\StdCMD\debug目錄下生成StdCMD.lsb文件。
由于編譯代碼的過(guò)程比較煩瑣,容易出錯(cuò),因此我們?cè)O(shè)計(jì)了CIN模板應(yīng)用向?qū)?CinTemp AppWizard),并給出CinTemp.awx和CinTemp.pdb文件。將其添加到Visual C++ 5.0 IDE中,可以由用戶(hù)方便地自動(dòng)生成編譯CIN代碼的項(xiàng)目。
2.5裝載CIN目標(biāo)代碼
裝載CIN目標(biāo)代碼是將生成的.lsb文件裝入VI的過(guò)程。這一過(guò)程將目標(biāo)代碼裝入內(nèi)存并與VI的前面板/塊流圖鏈接起來(lái),保存VI后,即可在程序中調(diào)用該VI實(shí)現(xiàn)設(shè)定的功能。這一過(guò)程的操作是在LabVIEW環(huán)境中打開(kāi)StdCMD.VI程序,將光標(biāo)指到框圖中的CIN節(jié)點(diǎn)按右鍵。選中彈出菜單中的命令,將StdCMD.lsb文件裝載到CIN節(jié)點(diǎn)上。在使用過(guò)程中,也可修改CIN代碼以擴(kuò)充其功能,只需重新裝入新的.lsb文件即可。
評(píng)論