摘 要:介紹在LabVIEW編程環(huán)境下,通過調(diào)用動(dòng)態(tài)鏈接庫(kù),進(jìn)行非配套四軸運(yùn)動(dòng)控制卡ADT850的驅(qū)動(dòng)和控制,實(shí)現(xiàn)了LabVIEW與普通運(yùn)動(dòng)控制卡的結(jié)合,快速開發(fā)多軸運(yùn)動(dòng)控制程序的方法。文章給出了設(shè)計(jì)的方法和步驟,現(xiàn)實(shí)應(yīng)用證明,該方法不僅可以很好地發(fā)揮運(yùn)動(dòng)控制卡的性能,而且可以借助LabVIEW強(qiáng)大的界面編輯功能,縮短程序開發(fā)周期,美化人機(jī)界面。
1 引言
1.1 LabVIEW簡(jiǎn)介
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是實(shí)驗(yàn)室虛擬儀器開發(fā)平臺(tái)的簡(jiǎn)稱。它是美國(guó)NI公司(National Instrument Company, 美國(guó)國(guó)家儀器公司)80年代推出的一種基于G語(yǔ)言(Graphics Language,圖形化編程語(yǔ)言)的虛擬儀器軟件開發(fā)平臺(tái)。LabVIEW是專門用于虛擬儀器開發(fā)的圖形化軟件編程平臺(tái),目前最新版本為8.5。圖形化的表示方式是比文本代碼更為自然的設(shè)計(jì)表示法,在這個(gè)平臺(tái)上,用戶通過定義和連接代表各種功能模塊的圖標(biāo)來方便迅速地建立起自己的應(yīng)用程序。
LabVIEW在運(yùn)動(dòng)控制方面有專門的運(yùn)動(dòng)控制模塊,并且NI公司為其所有的運(yùn)動(dòng)控制卡配備相應(yīng)的驅(qū)動(dòng)程序,可以方便實(shí)現(xiàn)即插即用功能,但是價(jià)格昂貴。如果用戶所使用的板卡不是NI公司的產(chǎn)品,又沒有提供與LabVIEW兼容的驅(qū)動(dòng)程序,就不能為L(zhǎng)abVIEW所用。但是作為一個(gè)開放式開發(fā)平臺(tái),LabVIEW提供了DLL接口,用戶在LabVIEW平臺(tái)上能調(diào)用其他軟件平臺(tái)編譯的模塊,并提供對(duì)對(duì)象鏈接和嵌入技術(shù)(簡(jiǎn)稱OLE)的支持。這樣LabVIEW能夠通過調(diào)用Windows32動(dòng)態(tài)連接庫(kù)(Dynamic Link Library,簡(jiǎn)稱DLL)來編寫與LabVIEW兼容的驅(qū)動(dòng)程序,實(shí)現(xiàn)該運(yùn)動(dòng)控制卡在LabVIEW環(huán)境下二次開發(fā)。同時(shí),利用此軟件平臺(tái)可大大降低成本,縮短項(xiàng)目開發(fā)時(shí)間。
2 開發(fā)背景
根據(jù)某玻璃加工企業(yè)要求,我們?cè)O(shè)計(jì)了其加工機(jī)械包含四軸運(yùn)動(dòng)控制要求的電氣控制系統(tǒng)。在設(shè)計(jì)過程中,本著節(jié)約成本,實(shí)現(xiàn)功能的態(tài)度,我們采用了眾為興深圳市眾為興數(shù)控技術(shù)有限公司生產(chǎn)的ADT850四軸運(yùn)動(dòng)控制卡,ADT850運(yùn)動(dòng)控制卡的動(dòng)態(tài)鏈接庫(kù)是標(biāo)準(zhǔn)的Windows32位動(dòng)態(tài)鏈接庫(kù),選用的開發(fā)工具應(yīng)支持Windows標(biāo)準(zhǔn)的32位DLL調(diào)用。我們?cè)赩C編譯環(huán)境中編譯出運(yùn)動(dòng)控制所需要的動(dòng)態(tài)鏈接庫(kù)文件,(即DLL格式),將編寫好的動(dòng)態(tài)鏈接庫(kù)文件按照功能塊區(qū)分,封裝成靜態(tài)鏈接庫(kù)即(LIB格式)。如果使用DLL方式,則編譯后的程序不但要包括EXE程序,還要包括DLL文件。而如果采用靜態(tài)鏈接庫(kù)方式,分發(fā)程序時(shí)只需要一個(gè)EXE文件就可以了,分發(fā)時(shí)簡(jiǎn)單,可以更方便打包發(fā)布。在LabVIEW將環(huán)境中編寫程序主界面時(shí),調(diào)用封裝好的LIB文件來編寫所需的運(yùn)動(dòng)控制程序。其主要過程如圖1所示。
[align=center]

圖1[/align]
3 程序設(shè)計(jì)
3.1 編寫動(dòng)態(tài)鏈接庫(kù)
自從微軟推出第一個(gè)版本的Windows操作系統(tǒng)以來,動(dòng)態(tài)鏈接庫(kù)(DLL)一直是Windows操作系統(tǒng)的基礎(chǔ)。動(dòng)態(tài)鏈接庫(kù)通常都不能直接運(yùn)行,也不能接收消息。它們是一些獨(dú)立的文件,其中包含能被可執(zhí)行程序或其它DLL調(diào)用來完成某項(xiàng)工作的函數(shù)。只有在其它模塊調(diào)用動(dòng)態(tài)鏈接庫(kù)中的函數(shù)時(shí),它才發(fā)揮作用。Windows API中的所有函數(shù)都包含在DLL中。DLL的編制與具體的編程語(yǔ)言及編譯器無關(guān),只要遵循約定的DLL接口規(guī)范和調(diào)用方式,用各種語(yǔ)言編寫的DLL都可以相互調(diào)用。
為了便于以后工程的維護(hù)與開發(fā),我們將運(yùn)動(dòng)控制按照實(shí)現(xiàn)功能的不同,編寫出DLL,每個(gè)DLL中都包含ADT850運(yùn)動(dòng)控制庫(kù)中一個(gè)或多個(gè)函數(shù),稱之為功能函數(shù)。主要的功能函數(shù)有板卡初始化,單軸點(diǎn)動(dòng),兩軸直線插補(bǔ)運(yùn)動(dòng),兩軸圓弧插補(bǔ)運(yùn)動(dòng),實(shí)現(xiàn)急停與緩?fù)5耐V购瘮?shù),邏輯坐標(biāo)清零函數(shù),軸狀態(tài)檢測(cè)函數(shù)等,每個(gè)功能函數(shù)都有自己的獨(dú)立接口,可以方便調(diào)用。
在VC++6.0軟件環(huán)境中選擇File—>New,單擊Project標(biāo)簽,從左側(cè)列表中選擇Windows 32 Dynamic Link Library,輸入項(xiàng)目名后,添加上ADT850相應(yīng)運(yùn)動(dòng)控制卡的運(yùn)動(dòng)控制函數(shù)庫(kù)文件,按功能編譯成需要的DLL文件。
3.2 動(dòng)態(tài)鏈接庫(kù)的調(diào)用
我在開發(fā)中使用LabVIEW8.2中文版本,較8.0有很大的改進(jìn)。首先在LabVIEW的后面板中選擇互連接口中的庫(kù)與可執(zhí)行程序,然后選擇調(diào)用庫(kù)函數(shù),將其拖到適當(dāng)?shù)奈恢?。在新建的空?kù)函數(shù)中選擇配置,正確配置DLL參數(shù)。本文以continue_move函數(shù)為例做一下詳細(xì)介紹,如圖2所示:
[align=center]

圖2[/align]
在庫(kù)名或路徑中,選擇DLL的存放路徑C:\WINDOWS\system32\adt850.dll,在函數(shù)名下選擇封裝好的功能函數(shù)continue_move,在右側(cè)菜單線程選項(xiàng)中選擇“在UI線程中運(yùn)行”,在調(diào)用規(guī)范中選擇應(yīng)與用C++語(yǔ)言編寫的動(dòng)態(tài)庫(kù)的編譯模式相一致。如果C++的調(diào)用方式為extern"C"declspec(dllexport), 那么Calling Conventions的選項(xiàng)為“C”,如果調(diào)用方式為extern declspec (dllexport) stdcall,則Conventions的選項(xiàng)為默認(rèn)值“stdcall(WINAPI)”,此處一定要設(shè)定正確,否則會(huì)出現(xiàn)不可預(yù)知的錯(cuò)誤。在第二項(xiàng)參數(shù)選項(xiàng)中,設(shè)置好對(duì)應(yīng)的參數(shù)值,此函數(shù)有4個(gè)參數(shù),speed1,speed2,acc,value,在參數(shù)選項(xiàng)中設(shè)置完成后,可以在函數(shù)原型下顯示出來。最后在回調(diào)中選擇需要的回調(diào)函數(shù)。
為了這樣經(jīng)過編譯后的ADT850功能函數(shù)就可以被LabVIEW調(diào)用了。為了分發(fā)時(shí)簡(jiǎn)單,可以更方便打包發(fā)布,我們將DLL文件封裝成靜態(tài)鏈接庫(kù)方式,這樣分發(fā)程序時(shí)只需要一個(gè)EXE文件就可以了。封裝好的LIB文件如圖3所示。
[align=center]

圖3[/align]
3.3 程序?qū)崿F(xiàn)
將功能函數(shù)配置好,打包封裝成靜態(tài)鏈接庫(kù)后,我們可以像使用基本函數(shù)一樣調(diào)用這些函數(shù)了。針對(duì)自動(dòng)控制的要求,需要對(duì)兩軸順序?qū)崿F(xiàn)單軸點(diǎn)動(dòng),兩軸直線插補(bǔ)的運(yùn)動(dòng)要求。同時(shí)要實(shí)現(xiàn)急停,各軸運(yùn)動(dòng)狀態(tài)檢測(cè)等功能。
整個(gè)LabVIEW程序的結(jié)構(gòu)以順序結(jié)構(gòu)和條件結(jié)構(gòu)為主,每一框架對(duì)應(yīng)固定的邏輯功能。圖4為整個(gè)運(yùn)動(dòng)控制前兩個(gè)框圖。最左面是板卡的初始化函數(shù),通過封裝好的上電脈沖函數(shù)在程序最初運(yùn)行時(shí)僅調(diào)用一次。第二個(gè)框?yàn)楣に噮?shù)的控制,由條件語(yǔ)句嵌套13個(gè)條目的選擇語(yǔ)句構(gòu)成,在加減速控制中嵌入運(yùn)動(dòng)狀態(tài)檢測(cè),一個(gè)條件分支動(dòng)作完成后,自動(dòng)傳送狀態(tài)值至運(yùn)動(dòng)階段,進(jìn)入下一分支程序,直到結(jié)束,完成工藝加工要求。設(shè)置一個(gè)等待時(shí)間100ms,增加緩沖時(shí)間。右側(cè)的XY兩軸插補(bǔ)函數(shù),Y2軸定量運(yùn)動(dòng)函數(shù)已經(jīng)在上一節(jié)中封裝完畢。
[align=center]

圖4[/align]
圖5為接下來的兩個(gè)框圖,主要實(shí)現(xiàn)運(yùn)動(dòng)暫停功能和繼續(xù)運(yùn)動(dòng)功能。在左側(cè)的順序圖中,一個(gè)條件結(jié)構(gòu)嵌套兩個(gè)條件結(jié)構(gòu)組成。觸發(fā)條件為單位脈沖觸發(fā),在真條件中實(shí)現(xiàn)運(yùn)動(dòng)暫停,同時(shí)存儲(chǔ)坐標(biāo)的當(dāng)前值,在假狀態(tài)中實(shí)現(xiàn)繼續(xù)運(yùn)動(dòng)。右側(cè)順序圖主要通過局部變量實(shí)現(xiàn)運(yùn)動(dòng)參數(shù)的實(shí)時(shí)傳遞。
[align=center]

圖5[/align]
圖6為存儲(chǔ)框圖的一部分,主要實(shí)現(xiàn)數(shù)據(jù)硬盤存儲(chǔ)功能。封裝的子VI為數(shù)據(jù)存讀功能。首先將改變數(shù)值傳至硬盤存儲(chǔ)區(qū),數(shù)據(jù)的讀出使用真值觸發(fā),實(shí)現(xiàn)常讀。因?yàn)閰?shù)比較多,采用數(shù)組格式傳遞數(shù)值,,使程序更簡(jiǎn)潔,易于維護(hù)。
[align=center]

圖6[/align]
圖7為運(yùn)動(dòng)控制程序的前面板,按照實(shí)際控制要求可以選擇相應(yīng)界面。主要實(shí)現(xiàn)的功能有工藝參數(shù)設(shè)定、機(jī)床參數(shù)設(shè)定、自動(dòng)控制界面、兩軸運(yùn)動(dòng)軌跡的圖形化實(shí)時(shí)顯示、手動(dòng)控制各軸運(yùn)動(dòng)。在運(yùn)動(dòng)控制界面中實(shí)現(xiàn)兩軸直線插補(bǔ)功能、暫停功能、急停功能、機(jī)械坐標(biāo)和工作坐標(biāo)的實(shí)時(shí)顯示以及通過狀態(tài)燈來顯示各個(gè)電磁閥的運(yùn)動(dòng)狀態(tài)。
[align=center]

圖7[/align]
4 結(jié)束語(yǔ)
一般情況下,現(xiàn)在工程師仍然多采用VB、VC或者C++等編譯語(yǔ)言對(duì)運(yùn)動(dòng)控制卡進(jìn)行二次開發(fā),很多時(shí)候圖形界面的編寫就耗費(fèi)很多的程序編寫工作時(shí)間,效率相對(duì)不是很高。本文采用的這種新方法的主要優(yōu)點(diǎn)是采用了LabVIEW圖形化編程語(yǔ)言,強(qiáng)大的界面編輯功能可以節(jié)省大量的開發(fā)時(shí)間,同時(shí)利用了LabVIEW支持動(dòng)態(tài)鏈接庫(kù)調(diào)用等功能,實(shí)現(xiàn)了不是NI公司提供的運(yùn)動(dòng)控制卡也可以在LabVIEW平臺(tái)下進(jìn)行二次開發(fā)。這種方法可以有效降低成本,減少程序編程時(shí)間。本文中程序經(jīng)過在工廠現(xiàn)場(chǎng)調(diào)試,現(xiàn)在已經(jīng)可以穩(wěn)定運(yùn)行。