董瑞剛, 周 吉, 程 松, 尹冠群
(上海電氣集團(tuán)股份有限公司中央研究院,上海200070)
Visual C++6.0(VC++)是 Microsoft公司推出的基于C/C++語言的集成開發(fā)工具。它不僅擁有C/C++語言的集成開發(fā)環(huán)境,而且與Win32緊密相連,功能相當(dāng)強(qiáng)大,代碼效率很高,可以實現(xiàn)從底層軟件直到上層直接面向用戶的軟件。VC++也是目前最為流行、使用最為廣泛的軟件開發(fā)工具之一,其向用戶提供了一個面向?qū)ο?、可視化的編程環(huán)境。它的微軟基礎(chǔ)類庫(Microsoft Foundation Class,MFC)封裝了大部分應(yīng)用程序編程接口(Application Programming Interface,API)函數(shù),大大簡化了用戶的編程工作,提高了代碼的可重用性,使得用戶可以快速地進(jìn)行軟件開發(fā)[1]。
在數(shù)控機(jī)床上,由于各坐標(biāo)軸進(jìn)給傳動鏈上驅(qū)動部件(如伺服電動機(jī)、伺服液壓馬達(dá)和步進(jìn)電動機(jī)等)的反向死區(qū)、各機(jī)械運動傳動副(如齒輪傳動和滾珠絲杠螺母副)的反向間隙等誤差的存在,造成各坐標(biāo)軸在由正向運動轉(zhuǎn)為反向運動時形成反向偏差,通常也稱反向間隙或失動量。反向間隙直接影響伺服系統(tǒng)的高定位精度和快速響應(yīng)特性的發(fā)揮,進(jìn)而影響設(shè)備加工精度。目前,大多數(shù)數(shù)控系統(tǒng)都內(nèi)嵌了反向間隙補(bǔ)償功能,以提高數(shù)控設(shè)備的精度和快速響應(yīng)性。但與此同時,一些老舊數(shù)控機(jī)床的數(shù)控系統(tǒng)缺乏該功能,由于系統(tǒng)的封閉性,也不可能直接在系統(tǒng)中加入反向間隙補(bǔ)償功能。另外,在一些基于計算機(jī)的專用數(shù)控系統(tǒng)的開發(fā)中也遇到反向間隙的補(bǔ)償問題。
本文探討了基于VC++的反向間隙補(bǔ)償處理設(shè)計方法,它可在不改變數(shù)控系統(tǒng)及機(jī)械結(jié)構(gòu)的前提下實現(xiàn)反向間隙補(bǔ)償。
軟件開發(fā)平臺:VC++(MFC)。
運行平臺:Windows xp/Windows 2000。
MFC的本質(zhì)就是一個包含許多微軟公司已經(jīng)定義好的對象類庫,雖然用戶要編寫的程序在功能上是千差萬別的,但從本質(zhì)上講,都可以劃分為對用戶界面的設(shè)計、文件的操作、多媒體的使用和數(shù)據(jù)庫的訪問等方面[2]。
正是由于MFC編程方法充分利用了面向?qū)ο蠹夹g(shù)的優(yōu)點,使得編程時不必關(guān)心對象方法的實現(xiàn)細(xì)節(jié)。同時,類庫中的各種對象足以完成程序中的絕大部分功能,從而大幅度減少應(yīng)用程序中編寫的代碼,有力地保證了程序的良好性和可調(diào)試性。
本文正是利用VC++的MFC編程方法對反向間隙補(bǔ)償處理軟件進(jìn)行設(shè)計。
因為絲杠和絲母之間肯定存在一定的間隙,所以在正轉(zhuǎn)后變換成反轉(zhuǎn)的時候,在一定的角度內(nèi),盡管絲杠轉(zhuǎn)動,但是絲母還要等間隙消除(受力一側(cè)的)以后才能帶動工作臺運動,這個間隙就是反向間隙。
反向間隙補(bǔ)償又稱為齒隙補(bǔ)償。機(jī)械傳動鏈在改變轉(zhuǎn)向時,由于反向間隙的存在,會引起伺服電動機(jī)的空轉(zhuǎn),而不發(fā)生工作臺的實際運動,又稱失動。在半閉環(huán)系統(tǒng)中,反向間隙對機(jī)床的加工精度具有很大的影響,必須加以補(bǔ)償[3-4]。反向間隙補(bǔ)償原理是在無補(bǔ)償?shù)臈l件下,在軸線測量行程內(nèi)將測量行程等分為若干段,測量出各目標(biāo)位置Pi的平均反向差值作為機(jī)床的補(bǔ)償參數(shù)輸入系統(tǒng)。數(shù)控系統(tǒng)在控制坐標(biāo)軸反向運動時,自動先讓該坐標(biāo)反向運動值,然后按指令進(jìn)行運動。如圖1所示,工作臺正向移動到0點,然后反向移動到Pi點;反向時,電機(jī)(絲桿)先反向移動,后移動到Pi點;該過程數(shù)控系統(tǒng)實際指令運動值為
圖1 反向間隙補(bǔ)償示意圖
本文所提的反向間隙補(bǔ)償處理是反向間隙的預(yù)補(bǔ)償,是指在數(shù)控代碼傳入數(shù)控系統(tǒng)之前將反向間隙補(bǔ)償?shù)綌?shù)控代碼中。經(jīng)過反向間隙預(yù)補(bǔ)償?shù)臄?shù)控代碼可直接傳入數(shù)控系統(tǒng)進(jìn)行加工,數(shù)控設(shè)備不用因反向間隙的影響而進(jìn)行機(jī)械結(jié)構(gòu)或控制系統(tǒng)改動。對于沒有反向間隙補(bǔ)償功能的數(shù)控設(shè)備,其預(yù)補(bǔ)償處理的情況如圖2所示。
圖2 反向間隙預(yù)補(bǔ)償處理示意圖
3.1.1 功能需求
軟件功解需求如下:① 反向間隙補(bǔ)償軸數(shù)5;②軸符號可由用戶自定義;③界面友好提示,如補(bǔ)償完成提示、覆蓋確認(rèn)提示等;④ 系統(tǒng)運行穩(wěn)定,安全可靠;⑤ 界面設(shè)計美觀實用,人機(jī)交互界面友好;⑥ 補(bǔ)償功能靈活、方便、快捷、準(zhǔn)確,數(shù)據(jù)存儲安全可靠。
3.1.2 軟件功能介紹
反向間隙補(bǔ)償處理軟件是為消除數(shù)控機(jī)床的反向間隙對加工精度的影響而制作的一款專用軟件。它主要實現(xiàn)功能有自由選擇待補(bǔ)償文件、自由選擇軸數(shù)和軸符號、自動存儲補(bǔ)償后文件和正確補(bǔ)償反向間隙值。
反向間隙補(bǔ)償處理軟件功能的實現(xiàn)可分為以下幾個步驟:① 選擇文件,即選擇原始的數(shù)控程序代碼文件,文件名稱和文件擴(kuò)展名不限;② 選擇要補(bǔ)償?shù)妮S;③在該軸的軸符號框中輸入軸符號,例如輸入“X”,表示要補(bǔ)償?shù)妮S為X軸;④ 在該軸的反向間隙補(bǔ)償值中輸入補(bǔ)償值;⑤ 后處理執(zhí)行,完成后反向間隙補(bǔ)償處理運算,并且自動將補(bǔ)償過的數(shù)控程序文件另存為*_bc(*代表原數(shù)控程序文件的名稱及擴(kuò)展名)。
雖然本軟件的功能實現(xiàn)僅有上面的5個步驟,但在軟件的流程設(shè)計中也要考慮很多相互之間的關(guān)聯(lián)關(guān)系,字符串的移動、排列、替換等算法。反向間隙補(bǔ)償處理軟件的流程如圖3所示。
VC++提供了強(qiáng)大、快捷的編程工具,其最基本的是3個導(dǎo)航:AppWizard用于程序框架的生成,AppStudio用于資源的編輯,ClassWizard用于類的編輯和管理。反向間隙補(bǔ)償處理軟件的界面設(shè)計以界面簡潔、功能實用、使用方便為原則,采用AppWizard導(dǎo)航,生成基于對話框(Dialog based)的應(yīng)用程序?;趯υ捒虻膽?yīng)用程序比起其他大多數(shù)MFC程序還有一個優(yōu)點,即可以使用VC++資源編輯器設(shè)計整個用戶界面而不用編寫代碼。在創(chuàng)建該應(yīng)用程序時,能夠可視化地放置位圖、按鈕、文本域和其他Windows控件,并能可視化地重新定義其大小及位置[5]。
使用基于對話框的應(yīng)用程序創(chuàng)建軟件界面,反向間隙補(bǔ)償處理軟件的界面包含:軸選擇、軸符號、反向間隙補(bǔ)償值、選擇文件、后處理執(zhí)行、關(guān)閉。程序界面如圖4所示。
圖3 反向間隙補(bǔ)償處理軟件流程圖
軸選擇(多選框):對應(yīng)的控件為Check Box,資源ID為IDC_AXIS1~I(xiàn)DC_AXIS5。選中軸選擇多選框就對該軸對應(yīng)的軸符號進(jìn)行補(bǔ)償處理,未選中,則不做處理,程序?qū)崿F(xiàn)用((CButton*)GetDlgItem(IDC_AXIS1))->GetCheck()==BST_CHECKED來檢測該多選框是否被選中。
圖4 反向間隙補(bǔ)償處理軟件界面
軸符號(文本框):對應(yīng)的控件為Edit Box,資源ID為IDC_AXIS_SIGN1~I(xiàn)DC_AXIS_SIGN5。軸符號中輸入的字母就是需要補(bǔ)償軸的軸號,程序?qū)崿F(xiàn)用GetDlgItemText(IDC_AXIS_SIGN1,axis_sign1)來獲得軸符號文本框中的內(nèi)容,并保存在axis_sign1變量中,axis_sign1為 CString型字符串。
反向間隙補(bǔ)償值(文本框):對應(yīng)的控件為Edit Box,資源ID為IDC_OFFSET_VALUE1~I(xiàn)DC_OFFSET_VALUE5。用于輸入補(bǔ)償?shù)闹?,程序?qū)崿F(xiàn)與軸符號類似,用 GetDlgItemText(IDC_OFFSET_VALUE1,offset_value1)來獲得軸符號文本框中的內(nèi)容,并保存在offset_value1變量中,offset_value1為CString型字符串。
選擇文件(按鈕):對應(yīng)的控件為Button,資源ID為ID_CHOOSE。選擇文件按鈕按下后,選擇對話框自動彈出,正確地選擇文件,并將文件內(nèi)容逐行讀入內(nèi)存。while(fp.ReadString(strFilePath-Name)){}代碼用于實現(xiàn)文件內(nèi)容的逐行讀取。選擇文件函數(shù)OnChoose包含在CMyDlg類中。
后處理執(zhí)行(按鈕):對應(yīng)的控件為Button,資源ID為IDOK。對數(shù)控程序代碼進(jìn)行反向間隙補(bǔ)償處理,并自動另存文件,后處理執(zhí)行函數(shù)OnOK包含在CMyDlg類中。
關(guān)閉(按鈕):對應(yīng)的控件為Button,資源ID為IDCANCEL。用于軟件的關(guān)閉,程序?qū)崿F(xiàn)采用控件默認(rèn)程序代碼。
3.3.1 為程序添加OnChoose事件
OnChoose事件利用CFileDialog dlg打開選擇對話框,并用dlg.GetPathName()來調(diào)用數(shù)控程序的文件名和文件路徑,將之存儲在變量strFilePath-Name中。OnChoose事件比較簡單,其他運算處理工作都放在OnOK事件中。
3.3.2 字符串的讀取與處理
變量str_sign1_1中存儲的是每一行的字符串,該字符串中有軸符號和軸坐標(biāo)信息也有數(shù)控程序段號、F指令、空格及其他信息。在補(bǔ)償處理時,只有軸符號和軸坐標(biāo)信息需要取出來用于補(bǔ)償后的替換,所以需要對str_sign1_1中的字符串進(jìn)行取字符串操作。方法如下:先找到字符串中的軸符號,取軸符號右面的字符串,存入str_sign1_2中,再取str_sign1_2中有英文字母左邊的字符串,最后去除該字符串中的空格,存入str_sign1_3中。
3.3.3 反向間隙補(bǔ)償處理程序
程序代碼如下所示:
反向間隙補(bǔ)償處理的實現(xiàn)就是后一行的軸坐標(biāo)與前一行的軸坐標(biāo)之間進(jìn)行比較。如果出現(xiàn)坐標(biāo)反向,并且反向距離大于反向間隙補(bǔ)償值,那么該軸坐標(biāo)值就應(yīng)加上反向間隙補(bǔ)償值,然后用替換函數(shù)Replace將原先的值替換。其中需要注意的是軸坐標(biāo)的比較是算數(shù)運算,而從每一行取出的是字符串,故必須進(jìn)行轉(zhuǎn)換。先將字符串轉(zhuǎn)換成float型,運算完成后,再將其轉(zhuǎn)換成CString型,最后進(jìn)行字符串替換。
3.3.4 文件存儲
文件存儲是將原文件名加“_bc”,另存在文件原目錄。若文件有重名就使用消息函數(shù)MessageBox(),彈出消息對話框提示是否要覆蓋,確定 就 用fp_bc.Open(strFilePathName,CFile::modeCreate|CFile::modeWrite)創(chuàng)建新文件,取消則返回。
本文針對機(jī)床絲杠和絲母之間往返運動中產(chǎn)生的反向間隙誤差,基于VC++開發(fā)了反向間隙補(bǔ)償處理軟件,成功實現(xiàn)了對數(shù)控程序的讀取、補(bǔ)償處理和存儲。該軟件對于沒有反向間隙補(bǔ)償功能的數(shù)控設(shè)備有很好的效果,也可為基于計算機(jī)的專用數(shù)控系統(tǒng)開發(fā)提供借鑒。其成功應(yīng)用于2009年國家863項目《渦軸發(fā)動機(jī)整體葉輪高效加工技術(shù)與仿真優(yōu)化》的葉片加工中。
本軟件現(xiàn)只適用于直線(G0/G1)形式的數(shù)控程序,對于圓弧指令(G2/G3)生產(chǎn)的數(shù)控程序還有一定缺陷,即圓弧指令在執(zhí)行過程中的換向用本軟件進(jìn)行反向間隙補(bǔ)償還無法實現(xiàn)。
[1]胡海生,李升亮.Visual C++6.0編程學(xué)習(xí)捷徑[M].北京:清華大學(xué)出版社,2003:1-5.
[2]曾凡鋒,苗 雨.MFC編程技巧與范例詳解[M].北京:清華大學(xué)出版社,2008:5-26.
[3]陳建雯,劉立新.反向間隙對數(shù)控加工的影響與補(bǔ)償[J].裝備制造技術(shù),2008(09):76-77.
[4]黃榮億.數(shù)控機(jī)床反向間隙誤差加工程序補(bǔ)償法[J].裝備制造技術(shù),2007(5):96-97.
[5]閆常友.跟我學(xué)Visual C++6.0[M].北京:清華大學(xué)出版社,2010:38-41.