曾浩然 張琳娜 趙鳳霞
(鄭州大學機械工程學院,河南鄭州450001)
圓度誤差是控制回轉(zhuǎn)體零件精度的一個重要指標,運用各種測量儀器對圓度誤差進行測量時,不僅要運算大量的數(shù)據(jù),而且需要將圖形實時地顯示出來,單純采用一種編程語言很難滿足要求。
Visual Basic由于其可視化的用戶界面設(shè)計功能使程序設(shè)計人員擺脫繁瑣復雜的界面設(shè)計,已經(jīng)成為快速應用程序開發(fā)(RAD,Rapid Application Development)工具的代表;但其數(shù)學計算能力不強,尤其是在大量的數(shù)據(jù)處理、矩陣運算、優(yōu)化計算時,編程復雜,工作量大,對程序設(shè)計人員要求高,開發(fā)效率低。
Matlab是Mathworks公司開發(fā)的一種用于算法開發(fā)、數(shù)據(jù)可視化、數(shù)據(jù)分析以及數(shù)值計算的高級技術(shù)計算語言。它編程效率高,用戶使用方便,語句簡單,開放性較好,而且具有高效方便的矩陣運算,被廣泛用于工程計算及數(shù)值分析等領(lǐng)域。但Matlab也是一種腳本解釋語言,運算速度慢;且底層硬件操作和界面開發(fā)能力差;源代碼的公開不利于算法和數(shù)據(jù)的保密,不能用于開發(fā)商用軟件。而且,由于Matlab開發(fā)平臺的局限性,在其上面開發(fā)的程序不能夠脫離Matlab運行環(huán)境,在處理實際問題時就顯得有些靈活性不足。
由于二者各自的特點,使用一種方法將他們結(jié)合起來,各獻所長,將會給用戶的開發(fā)帶來極大的方便。本文基于VB和Matlab混合編程對圓度誤差的評定進行了研究,重點研究了利用MatrixVB和COM組件實現(xiàn)VB和Matlab的混合編程,通過零件圓度誤差評定的實例證明了該方法的可行性。
VB與Matlab混合編程方法主要有以下幾種:①DDE編程實現(xiàn)VB與Matlab混合編程。DDE(Dynamic Data Exchange,動態(tài)數(shù)據(jù)交換)是一種開放的、與語言無關(guān)的、基于消息的協(xié)議。它允許應用程序之間共享數(shù)據(jù),是一種建立在Windows消息系統(tǒng)上支持應用程序之間數(shù)據(jù)交換的方法;②借助ActiveX技術(shù)實現(xiàn)VB與Matlab混合編程。它與具體的編程語言無關(guān),是一種用于模塊集成的新協(xié)議,允許應用程序或者組件控制另一個應用程序或組件的運行。ActiveX部件是一些遵循ActiveX規(guī)范編寫的具有特定功能的可執(zhí)行代碼,在某一應用程序中增加ActiveX部件后,它將為應用程序增加新的功能。在VB環(huán)境下可以通過ActiveX自動化接口將Matlab作為VB的一個ActiveX部件調(diào)用;③通過COM組件技術(shù)實現(xiàn)VB與Matlab混合編程。Matlab 6.5以后的版本都提供了Matlab COM Builder,利用該工具能夠?qū)函數(shù)文件編譯成COM組件。生成的COM組件以DLL形式存在,VB集成開發(fā)環(huán)境可以直接調(diào)用。利用該方式可以脫離Matlab環(huán)境,具有很大的靈活性;④利用MatrixVB實現(xiàn)VB與Matlab混合編程。MatrixVB是MathWorks公司針對Visual Basic開發(fā)的一個插件,它包含了600多個Matlab基本函數(shù),可以提供大量有效的算法,包括基本的數(shù)學運算、功能強大的信號處理、線性代數(shù)、優(yōu)化運算及圖形圖像處理功能等。利用MatrixVB可以大大增強Visual Basic的計算功能和圖形圖像處理功能;⑤通過中間文件傳遞的方法實現(xiàn)VB與Matlab混合編程。用VB編寫前端用戶交互界面,收集一些必要的參數(shù)信息,并保存在一個中間文件中,可以利用異步程序調(diào)用的方法執(zhí)行Matlab程序。
通過對以上5種混合編程方法的分析介紹,可以了解幾種方法各有其特點。通過ActiveX實現(xiàn)VB和Matlab二者通信編程效率高,但脫離不了Matlab環(huán)境,占用內(nèi)存大,執(zhí)行速度慢,且在開發(fā)應用程序時使用不便。DDE方式時,必須打開Matlab,同樣不能脫離Matlab環(huán)境。與ActiveX方式不同的是,使用DDE方式必須預先打開Matlab,而ActiveX可以自動打開Matlab軟件。使用COM組件技術(shù),可以將Matlab函數(shù)打包,完全脫離Matlab環(huán)境,在應用程序開發(fā)時使用此方法將特定功能函數(shù)打包使用,可以提高程序的開發(fā)效率。但在調(diào)用時,運行速度較低。matrixVB方法簡單,編程效率高。
各種混合編程方法都有其優(yōu)缺點,根據(jù)圓度誤差評定的技術(shù)要求和特點,同時選擇MatrixVB和COM組件兩種方式實現(xiàn)VB和Matlab的混合編程,在系統(tǒng)軟件開發(fā)過程中,充分利用了各自語言的優(yōu)點。
Matlab 6.5以后的版本都提供了 Matlab COM Builder,在使用COM Builder創(chuàng)建COM 組件之前需要對Matlab COM Builde進行配置,選擇一種編譯器,如Borland C++Builder 4、Borland C++Builder 5、Microsoft Visual Studio 6.0和 Microsoft Visual Studio.NET等。在Matlab中創(chuàng)建COM組件具體步驟如下:①以函數(shù)形式編寫M文件。在M文件中,給出Matlab要完成的功能;②配置編譯器,選擇VC++或C;③在Matlab命令窗口輸入 comtool,打開 Matlab/COM/Builder(如圖1);④點擊“file”按鈕,選擇“new/project”,新建一個工程;⑤加載編寫好的M文件,并編譯,生成 COM組件;待編譯完成,選擇 Component/Package Component,用以發(fā)布應用程序。打包后的主要文件及其功能見表1。
表1 應用COM Builder工具生成的文件
在VB中調(diào)用COM組件時事先需要將組件注冊到目標計算機上,如果組件的創(chuàng)建與調(diào)用在同一臺計算機則無需注冊即可直接調(diào)用。注冊的方法是將上面組件創(chuàng)建過程中第⑤步產(chǎn)生的文件夾拷貝到目標計算機上并執(zhí)行解壓縮操作,然后執(zhí)行解壓文件夾中distrib文件夾下的組件動態(tài)鏈接文件進行注冊,之后把注冊生成的所有DLL文件拷貝到計算機的$windowssystem32目錄下即可完成注冊。最后在VB中新建一個工程項目,打開該工程項目的ProjectReference對話框,引用已經(jīng)注冊完成的組件就可以在下面的程序中調(diào)用M文件編寫的相應函數(shù)。
在圓度誤差評定的4種方法中,除最小二乘法外,其他3種評定方法:最小區(qū)域法、最小外接法和最大內(nèi)接法在擬合時都會涉及到一個非線性優(yōu)化函數(shù)(linprog函數(shù))。直接用VB編寫優(yōu)化函數(shù)技術(shù)難度太大,效率太低,不易實現(xiàn)。雖然MatrixVB也提供了優(yōu)化運算函數(shù)(如lp函數(shù)),但經(jīng)過實際測試,在處理大量數(shù)據(jù)時,這些函數(shù)運算速度慢,效率低,精度不高。因此,我們采用COM組件的方式,將linprog函數(shù)打包直接在VB中調(diào)用。經(jīng)過實際測試發(fā)現(xiàn)該方法效率高,速度快,精度也較高。具體步驟為:
(1)編寫優(yōu)化算法的M文件。注意:一定是Matlab函數(shù)形式的M文件。代碼如下:
(2)確認 M文件無誤后,根據(jù)前面講述的方法打開 Matlab COM Builder,并新建工程。新建工程名和類名分別為 lpcom和 lpcomclass,如圖2所示。
(3)加載編好的 M文件,并打包。
(4)打包之后,在程序設(shè)計時,打開VB引用對話框,選擇 lpcom 1.0 Type Library(如圖3所示)。編寫代碼時,就可以直接引用了。調(diào)用部分關(guān)鍵代碼如下:
優(yōu)化求解的結(jié)果保存在變量yp中??梢姴捎么朔椒▽崿F(xiàn)混合編程方法簡單、實用。
下面以回轉(zhuǎn)體幾何誤差中圓度誤差為例,利用VB和Matlab混合編程,開發(fā)了圓度誤差評定系統(tǒng),該系統(tǒng)是VB對已經(jīng)生成的COM組件的引用。評定結(jié)果如圖4~7所示,圓度誤差的計量結(jié)果如表2所示。
表2 圓度誤差計量結(jié)果 μm
本文研究了VB與Matlab混合編程方法,利用Matlab強大的計算與數(shù)值分析能力,結(jié)合VB豐富的可視化界面功能,可以提高開發(fā)軟件的性能,降低開發(fā)難度,縮短開發(fā)周期。因此,將VB和Matlab有機地結(jié)合起來將會對科研過程和工程實際產(chǎn)生巨大的影響,使程序更加專業(yè)和靈活,為商業(yè)軟件的開發(fā)提供了可能性,具有較高的實際意義。
本文所有程序均在VB6.0和Matlab6.5下調(diào)試通過,而且這里所得到的評定結(jié)果十分理想,代碼簡單、程序可移植性更高。結(jié)合實驗室現(xiàn)有圓柱度儀通過大量測量實例證明了該方法的正確性。這種方法還可以推廣到圓柱度、直線度、平面度等形狀誤差的評定計算過程中。
[1]岳玉芳,尤忠生,張玉雙.基于COM的VB與Matlab混合編程[J].計算機工程與設(shè)計,2005(1),61 -65.
[2]王夢蛟,王麗莉.基于COM組件的VB與Matlab混合編程在醫(yī)學影像處理中的應用[J].醫(yī)院數(shù)字化,2009(24):32-33.
[3]管亮,馮新滬.VB6.0調(diào)用 Matlab6.5編程的實現(xiàn)[J].控制工程,2004(11):54-56.
[4]Matlab COM Builder user's guide[Z].TheMathworks Inc,2002.
[5]方沁林,徐振高.圓度誤差評定的算法研究與軟件設(shè)計[D].中國優(yōu)秀碩士學位論文全文數(shù)據(jù)庫,2009(3).
[6]周劍平.基于MATLAB的圓度評定方法[J].計量與測試技術(shù),2005(32).