□ 金洋洋 □ 李居峰 □ 袁 麗
上海大學 機電工程與自動化學院 上海 200072
水泵是發動機冷卻系統的重要部件,它的作用是泵送冷卻液,使冷卻液在發動機的冷卻水道內快速流動,以帶走工作時產生的熱量,保持發動機正常的工作溫度。汽車發動機使用的是離心式水泵,由殼體、葉輪、軸承、泵軸、水封以及傳動帶輪等組成。
水泵殼體由鑄鐵或鑄鋁制成。鑄鐵殼體壁厚且質量大,隨著對發動機輕量化要求的提高,目前只在某些商用汽車的大型發動機上還在使用鑄鐵殼體的水泵。很多鑄鐵殼體上還帶有部分水道和節溫器安裝室,這使殼體的質量進一步增加。大多數轎車水泵采用了鑄鋁殼體,而且尺寸越來越小,很多殼體已經不再具有水道的功能。本文所研究的大眾汽車EA211發動機冷卻系統的水泵殼體也是采用鑄鋁材料,在其生產過程中,水泵殼體上下面的平行度是一個重要指標,它直接影響到水泵整體的性能以及汽車的行車安全。水泵殼體上下面的平行度要求如圖1所示。
當下,Matlab已成為應用最廣泛的科學工程計算軟件,它廣泛應用于自動控制、數學運算、信號分析、圖象處理、財務分析等各領域。Matlab所使用的是一種腳本語言,是逐行解釋執行的,程序中所有的變量都是通過mxArray來實現的,所以為了保證通用性,它的執行效率非常低,在開發一些復雜算法時會發現程序執行得特別慢,雖然MathWorks公司已竭力提高M腳本文件的運算速度,但到目前為止,效果仍然不能和同樣功能的可執行程序相比。而且,M文件不能脫離Matlab的應用程序環境,這就大大制約了程序的可移植性和通用性,因此,Matlab不適合作為通用的編程平臺,這給混合編程出了一個大難題。
C#是微軟公司發布的一種面向對象的、運行于.NETFramework之上的高級程序設計語言。它是一種安全、穩定、簡單、優雅的,由C和C++衍生出來的面向對象的編程語言。C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優雅的語法風格、創新的語言特性和便捷的面向組件編程的支持成為.NET開發的首選語言。
如果利用C#與Matlab接口技術,一方面充分發揮Matlab的數值計算功能,并且可以不依賴它的軟件運行,另一方面在C#里做出漂亮的界面,把復雜的數據處理交給Matlab去做,這樣有助于發揮程序各自的優點,降低開發難度,縮短編程時間,提高執行效率。基于C#和Matlab結合優勢的考慮,本文介紹一種C#與Matlab通過COM組件混合編程的技術,并且將這種技術成功地用于平行度在線自動檢測項目。

▲圖1 EA211發動機水泵殼體的示意圖
通過COM組件的形式進行混合編程,首先要考慮的問題是編好的程序到了工廠的電腦上能否正常運行。經過實際操作試驗,發現只要拷貝一下Matlab的MCR(即 MatlabCompilerRuntime)安裝文件,然后到所要運行的電腦上安裝一下就可使用。如果電腦上安裝了Matlab,則不需要再重新安裝這個軟件。另外,不同的Matlab版本提供的MCR可能會不同,如果在另一臺電腦上自己編寫的軟件運行有問題,可能是編譯器的版本不同引起的。
使用混合編程,首先把Matlab提供的MWARRAY類庫MWARRAY.dll添加到C#程序中。它的作用是把C#中的數組轉化為Matlab中的數組。同時需要在程序開始部分添加下面兩句話:
using MathWorks.Matlab.NET.Arrays; using MathWorks.Matlab.NET.Utility;
接下來需對Matlab進行編譯,然后生成.dll文件,和添加MWARRAY一樣,添加到C#引用之中,并在程序開始處添加下面一句話:
usingmyFuti;(假設函數名為 myFuti)
這里有一點要注意,就是Matlab中M文件里編寫的程序必須是函數格式,不然就生成不了所需要的.dll文件。如果不是函數格式,需將其轉換成函數合適之后再進行轉換。具體操作就是在程序的第一行添加:function[]=myFuti(即建立一個空函數),在程序的最后一行添加:end,這樣就將其轉成函數格式了。
最后通過C#編程調用Matlab進行計算,實現混合編程的任務。
掌握了混合編程的技術之后,筆者打算把它應用在近期所做的EA211水泵殼體平行度檢測項目上。在計算平行度的算法選擇中,決定使用當今最流行的最小二乘法進行曲面擬合,即根據空間所給的n個點坐標來擬合一個面,使各個點到這個擬合面之間的距離最小,那么這個平面就是所要求的面。從另一角度來看,就是求得一個平面方程 z=a(1)*x+a(2)*y+a(3),使各個點盡可能都是此方程的解。
現在就以具體數據為例,取空間8個點,各點的空間坐標 x、y、z 如下:
x=[2020.0520171616.0511.059.05];y=[1520231810583];
z=[4.04664.01034.05384.01804.0119
4.04394.03244.0360]
利用Matlab最小二乘算法編程如下:
A=[x′,y′,ones(size(x′))];
a=A/z′,其中a為擬合曲面的3個未知系數。
將 3 個系數分離下來為:a(1)=[1,0,0]a; a(2)=[0,1,0]a; a(3)=[0,0,1]a
最后可以得到:a(1)=0.0010, a(2)=-0.0006,a(3)=4.0233
與傳統的三坐標測量的結果對比發現,兩者的誤差非常小,說明使用該算法是切實可行的。這樣就得到了擬合曲面的方程 z=a(1)x+a(2)y+a(3),為下一步計算平行度打下了基礎。
在項目方案中,筆者打算通過 “基恩士”LK-G30系列激光位移傳感器采點的方法來測EA211水泵殼體上下面的平行度。初步計劃在上平面采7個點,在下平面采8個點,采完這些點之后計算平行度。先利用下面8個點擬合一個虛擬平面,然后再計算上面7個點分別到這個擬合面的距離,取這些距離中的最大值和最小值,兩者相減即得到所求的平行度。圖2和圖3分別為水泵殼體上下面的采點情況示意圖。

▲圖2 上平面的采點情況

▲圖3 下平面的采點情況
本文主要介紹了基于Matlab與C#的混合編程技術,并通過EA211水泵殼體平行度檢測的案例說明了這種方法的可行性與優越性。文中的程序結合了C#與Matlab各自的優勢,不僅提高了工作效率,使程序員更容易開發出功能強大、界面友好的軟件,同時也提高了系統的運行效率與精確性。這對于實現系統的無縫集成、有效縮短軟件開發周期、優化系統性能是十分有意義的。
[1] 施杰,嚴慎.用最小條件法求解平面度誤差[J].計量技術,1993(3):3-4.
[2] 張眆.平面度誤差的最小二乘法分析[J].機械制造與研究,2002(3):17-19.
[3] 馮俊艷,馮其波,匡萃方.高精度激光三角位移傳感器的技術現狀[J].應用光學,2004,25(3).
[4] 張文選.曲臂兩臂軸線平行度誤差非接觸檢測技術研究[D].長春:長春理工大學,2002.
[5] 肖永韌,解習農,劉曉峰.VC與Matlab混合編程之dll實現方法[J].計算機工程與應用,2001(13):174-176.