□ 金洋洋 □ 李居峰 □ 袁 麗
上海大學(xué) 機電工程與自動化學(xué)院 上海 200072
水泵是發(fā)動機冷卻系統(tǒng)的重要部件,它的作用是泵送冷卻液,使冷卻液在發(fā)動機的冷卻水道內(nèi)快速流動,以帶走工作時產(chǎn)生的熱量,保持發(fā)動機正常的工作溫度。汽車發(fā)動機使用的是離心式水泵,由殼體、葉輪、軸承、泵軸、水封以及傳動帶輪等組成。
水泵殼體由鑄鐵或鑄鋁制成。鑄鐵殼體壁厚且質(zhì)量大,隨著對發(fā)動機輕量化要求的提高,目前只在某些商用汽車的大型發(fā)動機上還在使用鑄鐵殼體的水泵。很多鑄鐵殼體上還帶有部分水道和節(jié)溫器安裝室,這使殼體的質(zhì)量進一步增加。大多數(shù)轎車水泵采用了鑄鋁殼體,而且尺寸越來越小,很多殼體已經(jīng)不再具有水道的功能。本文所研究的大眾汽車EA211發(fā)動機冷卻系統(tǒng)的水泵殼體也是采用鑄鋁材料,在其生產(chǎn)過程中,水泵殼體上下面的平行度是一個重要指標(biāo),它直接影響到水泵整體的性能以及汽車的行車安全。水泵殼體上下面的平行度要求如圖1所示。
當(dāng)下,Matlab已成為應(yīng)用最廣泛的科學(xué)工程計算軟件,它廣泛應(yīng)用于自動控制、數(shù)學(xué)運算、信號分析、圖象處理、財務(wù)分析等各領(lǐng)域。Matlab所使用的是一種腳本語言,是逐行解釋執(zhí)行的,程序中所有的變量都是通過mxArray來實現(xiàn)的,所以為了保證通用性,它的執(zhí)行效率非常低,在開發(fā)一些復(fù)雜算法時會發(fā)現(xiàn)程序執(zhí)行得特別慢,雖然MathWorks公司已竭力提高M腳本文件的運算速度,但到目前為止,效果仍然不能和同樣功能的可執(zhí)行程序相比。而且,M文件不能脫離Matlab的應(yīng)用程序環(huán)境,這就大大制約了程序的可移植性和通用性,因此,Matlab不適合作為通用的編程平臺,這給混合編程出了一個大難題。
C#是微軟公司發(fā)布的一種面向?qū)ο蟮?、運行于.NETFramework之上的高級程序設(shè)計語言。它是一種安全、穩(wěn)定、簡單、優(yōu)雅的,由C和C++衍生出來的面向?qū)ο蟮木幊陶Z言。C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優(yōu)雅的語法風(fēng)格、創(chuàng)新的語言特性和便捷的面向組件編程的支持成為.NET開發(fā)的首選語言。
如果利用C#與Matlab接口技術(shù),一方面充分發(fā)揮Matlab的數(shù)值計算功能,并且可以不依賴它的軟件運行,另一方面在C#里做出漂亮的界面,把復(fù)雜的數(shù)據(jù)處理交給Matlab去做,這樣有助于發(fā)揮程序各自的優(yōu)點,降低開發(fā)難度,縮短編程時間,提高執(zhí)行效率?;贑#和Matlab結(jié)合優(yōu)勢的考慮,本文介紹一種C#與Matlab通過COM組件混合編程的技術(shù),并且將這種技術(shù)成功地用于平行度在線自動檢測項目。
▲圖1 EA211發(fā)動機水泵殼體的示意圖
通過COM組件的形式進行混合編程,首先要考慮的問題是編好的程序到了工廠的電腦上能否正常運行。經(jīng)過實際操作試驗,發(fā)現(xiàn)只要拷貝一下Matlab的MCR(即 MatlabCompilerRuntime)安裝文件,然后到所要運行的電腦上安裝一下就可使用。如果電腦上安裝了Matlab,則不需要再重新安裝這個軟件。另外,不同的Matlab版本提供的MCR可能會不同,如果在另一臺電腦上自己編寫的軟件運行有問題,可能是編譯器的版本不同引起的。
使用混合編程,首先把Matlab提供的MWARRAY類庫MWARRAY.dll添加到C#程序中。它的作用是把C#中的數(shù)組轉(zhuǎn)化為Matlab中的數(shù)組。同時需要在程序開始部分添加下面兩句話:
using MathWorks.Matlab.NET.Arrays; using MathWorks.Matlab.NET.Utility;
接下來需對Matlab進行編譯,然后生成.dll文件,和添加MWARRAY一樣,添加到C#引用之中,并在程序開始處添加下面一句話:
usingmyFuti;(假設(shè)函數(shù)名為 myFuti)
這里有一點要注意,就是Matlab中M文件里編寫的程序必須是函數(shù)格式,不然就生成不了所需要的.dll文件。如果不是函數(shù)格式,需將其轉(zhuǎn)換成函數(shù)合適之后再進行轉(zhuǎn)換。具體操作就是在程序的第一行添加:function[]=myFuti(即建立一個空函數(shù)),在程序的最后一行添加:end,這樣就將其轉(zhuǎn)成函數(shù)格式了。
最后通過C#編程調(diào)用Matlab進行計算,實現(xiàn)混合編程的任務(wù)。
掌握了混合編程的技術(shù)之后,筆者打算把它應(yīng)用在近期所做的EA211水泵殼體平行度檢測項目上。在計算平行度的算法選擇中,決定使用當(dāng)今最流行的最小二乘法進行曲面擬合,即根據(jù)空間所給的n個點坐標(biāo)來擬合一個面,使各個點到這個擬合面之間的距離最小,那么這個平面就是所要求的面。從另一角度來看,就是求得一個平面方程 z=a(1)*x+a(2)*y+a(3),使各個點盡可能都是此方程的解。
現(xiàn)在就以具體數(shù)據(jù)為例,取空間8個點,各點的空間坐標(biāo) 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個未知系數(shù)。
將 3 個系數(shù)分離下來為: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
與傳統(tǒng)的三坐標(biāo)測量的結(jié)果對比發(fā)現(xiàn),兩者的誤差非常小,說明使用該算法是切實可行的。這樣就得到了擬合曲面的方程 z=a(1)x+a(2)y+a(3),為下一步計算平行度打下了基礎(chǔ)。
在項目方案中,筆者打算通過 “基恩士”LK-G30系列激光位移傳感器采點的方法來測EA211水泵殼體上下面的平行度。初步計劃在上平面采7個點,在下平面采8個點,采完這些點之后計算平行度。先利用下面8個點擬合一個虛擬平面,然后再計算上面7個點分別到這個擬合面的距離,取這些距離中的最大值和最小值,兩者相減即得到所求的平行度。圖2和圖3分別為水泵殼體上下面的采點情況示意圖。
▲圖2 上平面的采點情況
▲圖3 下平面的采點情況
本文主要介紹了基于Matlab與C#的混合編程技術(shù),并通過EA211水泵殼體平行度檢測的案例說明了這種方法的可行性與優(yōu)越性。文中的程序結(jié)合了C#與Matlab各自的優(yōu)勢,不僅提高了工作效率,使程序員更容易開發(fā)出功能強大、界面友好的軟件,同時也提高了系統(tǒng)的運行效率與精確性。這對于實現(xiàn)系統(tǒng)的無縫集成、有效縮短軟件開發(fā)周期、優(yōu)化系統(tǒng)性能是十分有意義的。
[1] 施杰,嚴(yán)慎.用最小條件法求解平面度誤差[J].計量技術(shù),1993(3):3-4.
[2] 張眆.平面度誤差的最小二乘法分析[J].機械制造與研究,2002(3):17-19.
[3] 馮俊艷,馮其波,匡萃方.高精度激光三角位移傳感器的技術(shù)現(xiàn)狀[J].應(yīng)用光學(xué),2004,25(3).
[4] 張文選.曲臂兩臂軸線平行度誤差非接觸檢測技術(shù)研究[D].長春:長春理工大學(xué),2002.
[5] 肖永韌,解習(xí)農(nóng),劉曉峰.VC與Matlab混合編程之dll實現(xiàn)方法[J].計算機工程與應(yīng)用,2001(13):174-176.