劉金鳳,張現(xiàn)廣
(1.長安大學(xué)汽車學(xué)院,陜西 西安 710064;2.上海海事大學(xué)物流工程學(xué)院,上海 201306)
活塞是汽車發(fā)動機(jī)的重要組成部件,在工作過程中承受較高的機(jī)械負(fù)荷和熱負(fù)荷,因此其設(shè)計質(zhì)量的優(yōu)劣直接關(guān)系到發(fā)動機(jī)的工作可靠性,繼而影響汽車的工作性能。隨著計算機(jī)技術(shù)的不斷發(fā)展,如同大多數(shù)機(jī)械零件的設(shè)計一樣,汽車發(fā)動機(jī)活塞的設(shè)計過程中也廣泛應(yīng)用了CAD 技術(shù)。而在CAD 技術(shù)的實(shí)際應(yīng)用中,參數(shù)化設(shè)計技術(shù)是目前主流的發(fā)展方向之一。參數(shù)化設(shè)計技術(shù)大多通過對某款三維設(shè)計軟件(如Solidworks,Pro/E,CATIA,UG 等)進(jìn)行二次開發(fā),以實(shí)現(xiàn)在輸入基本參數(shù)的情況下自動建立零件的三維模型。這種方法解決了傳統(tǒng)設(shè)計方法在設(shè)計大量結(jié)構(gòu)相似而幾何參數(shù)不同的零件時重復(fù)工作量大的問題,提升了設(shè)計的工作效率。
Solidworks 通過OLE 和COM 技術(shù)提供了豐富的官方應(yīng)用程序接口(API)以方便用戶通過二次開發(fā)對其功能進(jìn)行定制。用戶編寫的程序通過API 可以訪問Solidworks 的各種功能。
Solidworks 中所有的操作都包含在Solidworks API 對象的屬性或者方法中。本課題的開發(fā)常用的為Sldworks 對象和ModelDoc2 對象。Sldworks 對象是最高層次的對象,Solid works 軟件中對文件的打開、關(guān)閉、保存等操作包含在此對象的屬性或者方法中,在編寫二次開發(fā)程序時,首先應(yīng)當(dāng)聲明的對象便是Sldworks;ModelDoc2 是Sldworks 對象的子對象,該對象的屬性以及方法包含了參數(shù)修改、目標(biāo)選取等操作。
支持OLE 和COM 技術(shù)的編程語言(VB/VB.net、C++、C#等)都可以用來進(jìn)行Solidworks 二次開發(fā)[1]。C#是目前較為流行的編程語言之一,相對簡單易學(xué)且功能強(qiáng)大,適合作為Solidworks 二次開發(fā)的編程語言[2]。
Solidworks 本身自帶有宏錄制工具,通過宏錄制可以記錄下相關(guān)操作的宏代碼,然后刪除宏代碼中一些輔助操作的代碼(如縮放,視圖轉(zhuǎn)換等),即可使用。這種方法可以快速地獲取相關(guān)操作所用到的Solidworks API 對象中的方法或?qū)傩?,特別適合初學(xué)者。
Solidworks 二次開發(fā)產(chǎn)生的應(yīng)用程序有兩種形式:AddIn插件形式以及獨(dú)立的EXE 程序形式。前者作為插件集成到Solidworks 中,后者獨(dú)立于Solidworks,跨進(jìn)程調(diào)用Solid-works API。后者在運(yùn)行時較為穩(wěn)定,因此本課題開發(fā)獨(dú)立的EXE 程序形式。
基于Solidworks 二次開發(fā)的參數(shù)化設(shè)計方法有兩種:編程驅(qū)動法與尺寸驅(qū)動法[3]。前者是將整個零件模型的繪制過程用代碼描述,從無到有地生成模型。這種方法需要編程大量的代碼,且對計算機(jī)性能要求比較高;后者是預(yù)先定義一個零件模板,并將該模板的尺寸參數(shù)設(shè)定為變量,通過改變這些變量的賦值來快速地生成一系列結(jié)構(gòu)相似但尺寸不同的零件。這種方法代碼量少且執(zhí)行效率高,因此本課題選用尺寸驅(qū)動法。
圖1 活塞結(jié)構(gòu)示意圖
發(fā)動機(jī)活塞的設(shè)計中的重要結(jié)構(gòu)參數(shù)有:活塞高度、活塞外徑、火力岸高度、環(huán)岸高度、壓縮高度、裙部高度以及銷孔內(nèi)徑等[4],如圖1 所示。此外,活塞外徑與其他結(jié)構(gòu)參數(shù)尺寸之間應(yīng)當(dāng)滿足一定的比例關(guān)系[5],如表1 所示。
表1 活塞結(jié)構(gòu)參數(shù)代號及其比例關(guān)系
表1 中的參數(shù)為參數(shù)化設(shè)計的變量,此外,為加強(qiáng)活塞頭部的設(shè)計細(xì)節(jié),額外選取第一環(huán)岸高度c1 以及第二環(huán)岸高度c2 作為設(shè)計變量[6]。
依據(jù)本課題的設(shè)計需求,用戶應(yīng)當(dāng)能夠通過活塞參數(shù)化設(shè)計系統(tǒng)的人機(jī)交互界面建立與Solidworks 軟件的連接、加載活塞的模型、輸入活塞的關(guān)鍵尺寸參數(shù)、對活塞參數(shù)庫進(jìn)行存取以及生成新的活塞模型等操作。
完成后的人機(jī)交互界面如圖2 所示。在進(jìn)行參數(shù)化設(shè)計之前,用戶先通過界面上側(cè)的菜單欄相關(guān)命令進(jìn)行打開Solidworks 軟件以及加載活塞的模型等準(zhǔn)備工作;完成準(zhǔn)備工作后,結(jié)合界面中部的活塞參數(shù)尺寸示意圖,在界面左側(cè)的文本框中輸入相關(guān)的參數(shù),或者通過下拉框選取活塞參數(shù)庫中的尺寸參數(shù),當(dāng)文本框填寫完成后,即可生成新的活塞模型,或者將輸入的參數(shù)存儲到活塞參數(shù)庫中。
圖2 活塞參數(shù)化設(shè)計系統(tǒng)人機(jī)交互界面
由于參數(shù)化設(shè)計系統(tǒng)是獨(dú)立的應(yīng)用程序,與Solidworks分屬兩個獨(dú)立的進(jìn)程,因此需要實(shí)現(xiàn)系統(tǒng)對Solidworks 的跨進(jìn)程調(diào)用。
當(dāng)Solidworks 處于關(guān)閉狀態(tài)時,通過菜單欄的“打開Solidworks”選項(xiàng)即可完成Solidworks 的啟動。相關(guān)的實(shí)現(xiàn)代碼如下:SldWorks swApp = null;//聲明一個SldWorks 對象swApp = new SldWorks();//實(shí)例化SldWorks 對象swApp.Visible = true;// Solidworks 窗口可見
當(dāng)Solidworks已經(jīng)處于打開狀態(tài)時,需要獲取Solidworks的進(jìn)程,實(shí)現(xiàn)代碼為:
get_swProcess("",getProcesson("SldWorks"),"Sldworks.Application");//獲取solidworks 進(jìn)程get_swProcess 與get Processon 函數(shù)的詳細(xì)定義見參考文獻(xiàn)[7]。
基于尺寸驅(qū)動的參數(shù)化設(shè)計方法需要加載預(yù)先設(shè)計好的活塞零件模板(為保證該模板的重用性,應(yīng)當(dāng)將模板的文件屬性設(shè)定為“只讀”。),相關(guān)的代碼如下:
string filepath = @"D:汽車實(shí)用技術(shù)活塞Piston. SLD-PRT"; // 活塞模板的保存文件路徑 int IntError = -1,IntWraning = -1;
swApp.OpenDoc6(filepath, 1, (int)swOpenDocOptions_e.swOpenDocOptions_LoadModel, "", IntError, IntWraning);//Sldworks 對象中的OpenDoc6 方法
為保證用戶輸入的數(shù)值符合表1 中的比例關(guān)系,可以對與活塞直徑參數(shù)有關(guān)聯(lián)的文本框內(nèi)容進(jìn)行控制,以活塞高度參數(shù)對應(yīng)的文本框?yàn)榫唧w實(shí)現(xiàn)方式如下:
if (textBox2.Text != "")//當(dāng)文本框內(nèi)容不為空時進(jìn)行約束
{
if (0.6 * Convert.ToDouble(textBox1.Text) > Convert.ToDouble(textBox2.Text) || Convert.ToDouble(textBox1.Text) <Convert.ToDouble(textBox2.Text))//約束條件
{
MessageBox.Show("輸入的活塞高度值不符合比例關(guān)系!");//彈出提示
textBox2.Clear();//清空文本框
}
}
基于尺寸驅(qū)動的參數(shù)化設(shè)計方法最核心的內(nèi)容便是對活塞零件模板的尺寸參數(shù)進(jìn)行修改。ModelDoc2 對象包含了代表草圖尺寸參數(shù)的屬性,通過對這些屬性的修改即可完成對草圖尺寸參數(shù)的修改,繼而通過重建模型即可完成對零件模板的修改。
下面以活塞高度的尺寸修改為例來說明具體實(shí)現(xiàn)代碼:
double H = Convert.ToDouble(textBox2.Text);//將輸入值傳遞到變量H 中。
ModelDoc2 SwPartDoc = (ModelDoc2)swApp.ActiveDoc;//聲明一個ModelDoc2 對象。
SwPartDoc.Parameter("D3@草圖 1").SystemValue=H/1000.0;//修改參數(shù)。D3@草圖1 表示草圖1 中代號為D3 的尺寸參數(shù);參數(shù)的默認(rèn)單位為m,而設(shè)計時往往以mm 為單位,因此需要單位換算。
SwPartDoc.EditRebuild3();//重建模型。
3.6.1 數(shù)據(jù)表的設(shè)計
在名為" Piston "的數(shù)據(jù)庫中建立一個" PistonParameter "的數(shù)據(jù)表。數(shù)據(jù)表的第一個字段" ID "為活塞的型號,其余字段代表圖4 中的各個參數(shù)。由于字段值大小寫不敏感,因此參數(shù)h 和d 分別的字段分別為hh 和dd。數(shù)據(jù)表各字段的屬性如表2 所示。此外,SQL Server 2008 字段沒有double 類型,在這里可以用float 類型代替。
表2 數(shù)據(jù)表字段及屬性
3.6.2 參數(shù)庫的讀取
當(dāng)用戶通過界面中的下拉框選取活塞的型號時,該型號對應(yīng)的各個參數(shù)便會自動地填充到界面對應(yīng)的文本框中。
(1)首先,建立與數(shù)據(jù)庫" Piston "的連接[8]:
string constr = "Server=localhost;database= Piston; Integra-ted Security=True";//SQL 字符串語句;
SqlConnection con = new SqlConnection(constr);//建立連接。
(2)建立連接后,在" PistonParameter "數(shù)據(jù)表中查詢所選取型號對應(yīng)的參數(shù):
sql_str = "select D,H,H1,H2,hh1,c1,c2,dd from PistonPara-meter where ID ='" + comboBox1.SelectedValue.ToString() +"'";//SQL 查詢語句;
SqlDataAdapter myda = new SqlDataAdapter(sql_str, con);//實(shí)例化SqlDataAdapter 對象。
(3)然后將查詢到數(shù)據(jù)填充到一個DataSet 對象中:DataSet myds = new DataSet(); //實(shí)例化DataSet 對象;myda.Fill(myds, " PistonParameter ");//數(shù)據(jù)填充。
(4)最后,將DataSet 對象中的數(shù)據(jù)填充到文本框中,以參數(shù)活塞直徑" D "的填充為例,代碼為:
textBox1.Text = myds.Tables[0].Rows[0]["D"].ToString()。
3.6.3 參數(shù)庫參數(shù)的添加
用戶可以將自行輸入到文本框中的參數(shù)存儲到現(xiàn)有參數(shù)庫中,具體實(shí)現(xiàn)方式如下:
(1)首先查詢整個數(shù)據(jù)表,并將所查詢到的數(shù)據(jù)填充到一個DataSet 對象中,該過程的代碼與3.6.2 中的步驟(1)~(3)類似,不再贅述,唯一不同的是SQL 查詢語句變?yōu)椋?/p>
sql_str = "select ID,D,H,H1,H2,hh1,c1,c2,dd from Piston-Parameter";
(2)然后在DataSet 對象保存的數(shù)據(jù)表中新建一行,并寫入新的參數(shù):
DataRow mydr = myds.Tables[0].NewRow();//新建一行;
string str = Interaction.InputBox("型號需為純數(shù)字", "請輸入型號", "", -1, -1);//提示用戶輸入型號;
mydr["ID"] = int.Parse(str);//將輸入的型號存為"ID"字段;
mydr["D"] = textBox1.Text;// 將輸入的活塞直徑存為"D"字段。
(3)最后更新數(shù)據(jù)庫:
SqlCommandBuilder myscb = new SqlCommandBuilder(myda);
myds.Tables[0].Rows.Add(mydr);//把新建的一行加入到數(shù)據(jù)表中;
myda.Update(myds, " PistonParameter ");//更新數(shù)據(jù)庫中的數(shù)據(jù)表。
在對汽車發(fā)動機(jī)活塞結(jié)構(gòu)進(jìn)行分析的基礎(chǔ)上,借助Solidworks 官方的二次開發(fā)API,在Visual Studio 2010 開發(fā)環(huán)境下利用C#語言開發(fā)了汽車發(fā)動機(jī)活塞的參數(shù)化設(shè)計系統(tǒng),并依托SQL Server 2008 建立了活塞零件的參數(shù)庫。用戶可以根據(jù)設(shè)計需求自行輸入?yún)?shù),或者調(diào)用參數(shù)庫中的參數(shù)快速建立活塞產(chǎn)品的三維模型,提升了設(shè)計效率。此外,用戶可以將符合設(shè)計需求的參數(shù)存儲到參數(shù)庫中,實(shí)現(xiàn)設(shè)計數(shù)據(jù)的有效管理。