曾浩然 張琳娜 趙鳳霞
(鄭州大學機械工程學院,河南鄭州450001)
圓度誤差是控制回轉體零件精度的一個重要指標,運用各種測量儀器對圓度誤差進行測量時,不僅要運算大量的數據,而且需要將圖形實時地顯示出來,單純采用一種編程語言很難滿足要求。
Visual Basic由于其可視化的用戶界面設計功能使程序設計人員擺脫繁瑣復雜的界面設計,已經成為快速應用程序開發(RAD,Rapid Application Development)工具的代表;但其數學計算能力不強,尤其是在大量的數據處理、矩陣運算、優化計算時,編程復雜,工作量大,對程序設計人員要求高,開發效率低。
Matlab是Mathworks公司開發的一種用于算法開發、數據可視化、數據分析以及數值計算的高級技術計算語言。它編程效率高,用戶使用方便,語句簡單,開放性較好,而且具有高效方便的矩陣運算,被廣泛用于工程計算及數值分析等領域。但Matlab也是一種腳本解釋語言,運算速度慢;且底層硬件操作和界面開發能力差;源代碼的公開不利于算法和數據的保密,不能用于開發商用軟件。而且,由于Matlab開發平臺的局限性,在其上面開發的程序不能夠脫離Matlab運行環境,在處理實際問題時就顯得有些靈活性不足。
由于二者各自的特點,使用一種方法將他們結合起來,各獻所長,將會給用戶的開發帶來極大的方便。本文基于VB和Matlab混合編程對圓度誤差的評定進行了研究,重點研究了利用MatrixVB和COM組件實現VB和Matlab的混合編程,通過零件圓度誤差評定的實例證明了該方法的可行性。
VB與Matlab混合編程方法主要有以下幾種:①DDE編程實現VB與Matlab混合編程。DDE(Dynamic Data Exchange,動態數據交換)是一種開放的、與語言無關的、基于消息的協議。它允許應用程序之間共享數據,是一種建立在Windows消息系統上支持應用程序之間數據交換的方法;②借助ActiveX技術實現VB與Matlab混合編程。它與具體的編程語言無關,是一種用于模塊集成的新協議,允許應用程序或者組件控制另一個應用程序或組件的運行。ActiveX部件是一些遵循ActiveX規范編寫的具有特定功能的可執行代碼,在某一應用程序中增加ActiveX部件后,它將為應用程序增加新的功能。在VB環境下可以通過ActiveX自動化接口將Matlab作為VB的一個ActiveX部件調用;③通過COM組件技術實現VB與Matlab混合編程。Matlab 6.5以后的版本都提供了Matlab COM Builder,利用該工具能夠將M函數文件編譯成COM組件。生成的COM組件以DLL形式存在,VB集成開發環境可以直接調用。利用該方式可以脫離Matlab環境,具有很大的靈活性;④利用MatrixVB實現VB與Matlab混合編程。MatrixVB是MathWorks公司針對Visual Basic開發的一個插件,它包含了600多個Matlab基本函數,可以提供大量有效的算法,包括基本的數學運算、功能強大的信號處理、線性代數、優化運算及圖形圖像處理功能等。利用MatrixVB可以大大增強Visual Basic的計算功能和圖形圖像處理功能;⑤通過中間文件傳遞的方法實現VB與Matlab混合編程。用VB編寫前端用戶交互界面,收集一些必要的參數信息,并保存在一個中間文件中,可以利用異步程序調用的方法執行Matlab程序。
通過對以上5種混合編程方法的分析介紹,可以了解幾種方法各有其特點。通過ActiveX實現VB和Matlab二者通信編程效率高,但脫離不了Matlab環境,占用內存大,執行速度慢,且在開發應用程序時使用不便。DDE方式時,必須打開Matlab,同樣不能脫離Matlab環境。與ActiveX方式不同的是,使用DDE方式必須預先打開Matlab,而ActiveX可以自動打開Matlab軟件。使用COM組件技術,可以將Matlab函數打包,完全脫離Matlab環境,在應用程序開發時使用此方法將特定功能函數打包使用,可以提高程序的開發效率。但在調用時,運行速度較低。matrixVB方法簡單,編程效率高。
各種混合編程方法都有其優缺點,根據圓度誤差評定的技術要求和特點,同時選擇MatrixVB和COM組件兩種方式實現VB和Matlab的混合編程,在系統軟件開發過程中,充分利用了各自語言的優點。
Matlab 6.5以后的版本都提供了 Matlab COM Builder,在使用COM Builder創建COM 組件之前需要對Matlab COM Builde進行配置,選擇一種編譯器,如Borland C++Builder 4、Borland C++Builder 5、Microsoft Visual Studio 6.0和 Microsoft Visual Studio.NET等。在Matlab中創建COM組件具體步驟如下:①以函數形式編寫M文件。在M文件中,給出Matlab要完成的功能;②配置編譯器,選擇VC++或C;③在Matlab命令窗口輸入 comtool,打開 Matlab/COM/Builder(如圖1);④點擊“file”按鈕,選擇“new/project”,新建一個工程;⑤加載編寫好的M文件,并編譯,生成 COM組件;待編譯完成,選擇 Component/Package Component,用以發布應用程序。打包后的主要文件及其功能見表1。


表1 應用COM Builder工具生成的文件
在VB中調用COM組件時事先需要將組件注冊到目標計算機上,如果組件的創建與調用在同一臺計算機則無需注冊即可直接調用。注冊的方法是將上面組件創建過程中第⑤步產生的文件夾拷貝到目標計算機上并執行解壓縮操作,然后執行解壓文件夾中distrib文件夾下的組件動態鏈接文件進行注冊,之后把注冊生成的所有DLL文件拷貝到計算機的$windowssystem32目錄下即可完成注冊。最后在VB中新建一個工程項目,打開該工程項目的ProjectReference對話框,引用已經注冊完成的組件就可以在下面的程序中調用M文件編寫的相應函數。
在圓度誤差評定的4種方法中,除最小二乘法外,其他3種評定方法:最小區域法、最小外接法和最大內接法在擬合時都會涉及到一個非線性優化函數(linprog函數)。直接用VB編寫優化函數技術難度太大,效率太低,不易實現。雖然MatrixVB也提供了優化運算函數(如lp函數),但經過實際測試,在處理大量數據時,這些函數運算速度慢,效率低,精度不高。因此,我們采用COM組件的方式,將linprog函數打包直接在VB中調用。經過實際測試發現該方法效率高,速度快,精度也較高。具體步驟為:
(1)編寫優化算法的M文件。注意:一定是Matlab函數形式的M文件。代碼如下:

(2)確認 M文件無誤后,根據前面講述的方法打開 Matlab COM Builder,并新建工程。新建工程名和類名分別為 lpcom和 lpcomclass,如圖2所示。
(3)加載編好的 M文件,并打包。
(4)打包之后,在程序設計時,打開VB引用對話框,選擇 lpcom 1.0 Type Library(如圖3所示)。編寫代碼時,就可以直接引用了。調用部分關鍵代碼如下:



優化求解的結果保存在變量yp中??梢姴捎么朔椒▽崿F混合編程方法簡單、實用。
下面以回轉體幾何誤差中圓度誤差為例,利用VB和Matlab混合編程,開發了圓度誤差評定系統,該系統是VB對已經生成的COM組件的引用。評定結果如圖4~7所示,圓度誤差的計量結果如表2所示。





表2 圓度誤差計量結果 μm
本文研究了VB與Matlab混合編程方法,利用Matlab強大的計算與數值分析能力,結合VB豐富的可視化界面功能,可以提高開發軟件的性能,降低開發難度,縮短開發周期。因此,將VB和Matlab有機地結合起來將會對科研過程和工程實際產生巨大的影響,使程序更加專業和靈活,為商業軟件的開發提供了可能性,具有較高的實際意義。
本文所有程序均在VB6.0和Matlab6.5下調試通過,而且這里所得到的評定結果十分理想,代碼簡單、程序可移植性更高。結合實驗室現有圓柱度儀通過大量測量實例證明了該方法的正確性。這種方法還可以推廣到圓柱度、直線度、平面度等形狀誤差的評定計算過程中。
[1]岳玉芳,尤忠生,張玉雙.基于COM的VB與Matlab混合編程[J].計算機工程與設計,2005(1),61 -65.
[2]王夢蛟,王麗莉.基于COM組件的VB與Matlab混合編程在醫學影像處理中的應用[J].醫院數字化,2009(24):32-33.
[3]管亮,馮新滬.VB6.0調用 Matlab6.5編程的實現[J].控制工程,2004(11):54-56.
[4]Matlab COM Builder user's guide[Z].TheMathworks Inc,2002.
[5]方沁林,徐振高.圓度誤差評定的算法研究與軟件設計[D].中國優秀碩士學位論文全文數據庫,2009(3).
[6]周劍平.基于MATLAB的圓度評定方法[J].計量與測試技術,2005(32).