董瑞剛, 周 吉, 程 松, 尹冠群
(上海電氣集團股份有限公司中央研究院,上海200070)
Visual C++6.0(VC++)是 Microsoft公司推出的基于C/C++語言的集成開發工具。它不僅擁有C/C++語言的集成開發環境,而且與Win32緊密相連,功能相當強大,代碼效率很高,可以實現從底層軟件直到上層直接面向用戶的軟件。VC++也是目前最為流行、使用最為廣泛的軟件開發工具之一,其向用戶提供了一個面向對象、可視化的編程環境。它的微軟基礎類庫(Microsoft Foundation Class,MFC)封裝了大部分應用程序編程接口(Application Programming Interface,API)函數,大大簡化了用戶的編程工作,提高了代碼的可重用性,使得用戶可以快速地進行軟件開發[1]。
在數控機床上,由于各坐標軸進給傳動鏈上驅動部件(如伺服電動機、伺服液壓馬達和步進電動機等)的反向死區、各機械運動傳動副(如齒輪傳動和滾珠絲杠螺母副)的反向間隙等誤差的存在,造成各坐標軸在由正向運動轉為反向運動時形成反向偏差,通常也稱反向間隙或失動量。反向間隙直接影響伺服系統的高定位精度和快速響應特性的發揮,進而影響設備加工精度。目前,大多數數控系統都內嵌了反向間隙補償功能,以提高數控設備的精度和快速響應性。但與此同時,一些老舊數控機床的數控系統缺乏該功能,由于系統的封閉性,也不可能直接在系統中加入反向間隙補償功能。另外,在一些基于計算機的專用數控系統的開發中也遇到反向間隙的補償問題。
本文探討了基于VC++的反向間隙補償處理設計方法,它可在不改變數控系統及機械結構的前提下實現反向間隙補償。
軟件開發平臺:VC++(MFC)。
運行平臺:Windows xp/Windows 2000。
MFC的本質就是一個包含許多微軟公司已經定義好的對象類庫,雖然用戶要編寫的程序在功能上是千差萬別的,但從本質上講,都可以劃分為對用戶界面的設計、文件的操作、多媒體的使用和數據庫的訪問等方面[2]。
正是由于MFC編程方法充分利用了面向對象技術的優點,使得編程時不必關心對象方法的實現細節。同時,類庫中的各種對象足以完成程序中的絕大部分功能,從而大幅度減少應用程序中編寫的代碼,有力地保證了程序的良好性和可調試性。
本文正是利用VC++的MFC編程方法對反向間隙補償處理軟件進行設計。
因為絲杠和絲母之間肯定存在一定的間隙,所以在正轉后變換成反轉的時候,在一定的角度內,盡管絲杠轉動,但是絲母還要等間隙消除(受力一側的)以后才能帶動工作臺運動,這個間隙就是反向間隙。
反向間隙補償又稱為齒隙補償。機械傳動鏈在改變轉向時,由于反向間隙的存在,會引起伺服電動機的空轉,而不發生工作臺的實際運動,又稱失動。在半閉環系統中,反向間隙對機床的加工精度具有很大的影響,必須加以補償[3-4]。反向間隙補償原理是在無補償的條件下,在軸線測量行程內將測量行程等分為若干段,測量出各目標位置Pi的平均反向差值作為機床的補償參數輸入系統。數控系統在控制坐標軸反向運動時,自動先讓該坐標反向運動值,然后按指令進行運動。如圖1所示,工作臺正向移動到0點,然后反向移動到Pi點;反向時,電機(絲桿)先反向移動,后移動到Pi點;該過程數控系統實際指令運動值為


圖1 反向間隙補償示意圖
本文所提的反向間隙補償處理是反向間隙的預補償,是指在數控代碼傳入數控系統之前將反向間隙補償到數控代碼中。經過反向間隙預補償的數控代碼可直接傳入數控系統進行加工,數控設備不用因反向間隙的影響而進行機械結構或控制系統改動。對于沒有反向間隙補償功能的數控設備,其預補償處理的情況如圖2所示。

圖2 反向間隙預補償處理示意圖
3.1.1 功能需求
軟件功解需求如下:① 反向間隙補償軸數5;②軸符號可由用戶自定義;③界面友好提示,如補償完成提示、覆蓋確認提示等;④ 系統運行穩定,安全可靠;⑤ 界面設計美觀實用,人機交互界面友好;⑥ 補償功能靈活、方便、快捷、準確,數據存儲安全可靠。
3.1.2 軟件功能介紹
反向間隙補償處理軟件是為消除數控機床的反向間隙對加工精度的影響而制作的一款專用軟件。它主要實現功能有自由選擇待補償文件、自由選擇軸數和軸符號、自動存儲補償后文件和正確補償反向間隙值。
反向間隙補償處理軟件功能的實現可分為以下幾個步驟:① 選擇文件,即選擇原始的數控程序代碼文件,文件名稱和文件擴展名不限;② 選擇要補償的軸;③在該軸的軸符號框中輸入軸符號,例如輸入“X”,表示要補償的軸為X軸;④ 在該軸的反向間隙補償值中輸入補償值;⑤ 后處理執行,完成后反向間隙補償處理運算,并且自動將補償過的數控程序文件另存為*_bc(*代表原數控程序文件的名稱及擴展名)。
雖然本軟件的功能實現僅有上面的5個步驟,但在軟件的流程設計中也要考慮很多相互之間的關聯關系,字符串的移動、排列、替換等算法。反向間隙補償處理軟件的流程如圖3所示。
VC++提供了強大、快捷的編程工具,其最基本的是3個導航:AppWizard用于程序框架的生成,AppStudio用于資源的編輯,ClassWizard用于類的編輯和管理。反向間隙補償處理軟件的界面設計以界面簡潔、功能實用、使用方便為原則,采用AppWizard導航,生成基于對話框(Dialog based)的應用程序。基于對話框的應用程序比起其他大多數MFC程序還有一個優點,即可以使用VC++資源編輯器設計整個用戶界面而不用編寫代碼。在創建該應用程序時,能夠可視化地放置位圖、按鈕、文本域和其他Windows控件,并能可視化地重新定義其大小及位置[5]。
使用基于對話框的應用程序創建軟件界面,反向間隙補償處理軟件的界面包含:軸選擇、軸符號、反向間隙補償值、選擇文件、后處理執行、關閉。程序界面如圖4所示。

圖3 反向間隙補償處理軟件流程圖
軸選擇(多選框):對應的控件為Check Box,資源ID為IDC_AXIS1~IDC_AXIS5。選中軸選擇多選框就對該軸對應的軸符號進行補償處理,未選中,則不做處理,程序實現用((CButton*)GetDlgItem(IDC_AXIS1))->GetCheck()==BST_CHECKED來檢測該多選框是否被選中。

圖4 反向間隙補償處理軟件界面
軸符號(文本框):對應的控件為Edit Box,資源ID為IDC_AXIS_SIGN1~IDC_AXIS_SIGN5。軸符號中輸入的字母就是需要補償軸的軸號,程序實現用GetDlgItemText(IDC_AXIS_SIGN1,axis_sign1)來獲得軸符號文本框中的內容,并保存在axis_sign1變量中,axis_sign1為 CString型字符串。
反向間隙補償值(文本框):對應的控件為Edit Box,資源ID為IDC_OFFSET_VALUE1~IDC_OFFSET_VALUE5。用于輸入補償的值,程序實現與軸符號類似,用 GetDlgItemText(IDC_OFFSET_VALUE1,offset_value1)來獲得軸符號文本框中的內容,并保存在offset_value1變量中,offset_value1為CString型字符串。
選擇文件(按鈕):對應的控件為Button,資源ID為ID_CHOOSE。選擇文件按鈕按下后,選擇對話框自動彈出,正確地選擇文件,并將文件內容逐行讀入內存。while(fp.ReadString(strFilePath-Name)){}代碼用于實現文件內容的逐行讀取。選擇文件函數OnChoose包含在CMyDlg類中。
后處理執行(按鈕):對應的控件為Button,資源ID為IDOK。對數控程序代碼進行反向間隙補償處理,并自動另存文件,后處理執行函數OnOK包含在CMyDlg類中。
關閉(按鈕):對應的控件為Button,資源ID為IDCANCEL。用于軟件的關閉,程序實現采用控件默認程序代碼。
3.3.1 為程序添加OnChoose事件
OnChoose事件利用CFileDialog dlg打開選擇對話框,并用dlg.GetPathName()來調用數控程序的文件名和文件路徑,將之存儲在變量strFilePath-Name中。OnChoose事件比較簡單,其他運算處理工作都放在OnOK事件中。
3.3.2 字符串的讀取與處理
變量str_sign1_1中存儲的是每一行的字符串,該字符串中有軸符號和軸坐標信息也有數控程序段號、F指令、空格及其他信息。在補償處理時,只有軸符號和軸坐標信息需要取出來用于補償后的替換,所以需要對str_sign1_1中的字符串進行取字符串操作。方法如下:先找到字符串中的軸符號,取軸符號右面的字符串,存入str_sign1_2中,再取str_sign1_2中有英文字母左邊的字符串,最后去除該字符串中的空格,存入str_sign1_3中。
3.3.3 反向間隙補償處理程序
程序代碼如下所示:


反向間隙補償處理的實現就是后一行的軸坐標與前一行的軸坐標之間進行比較。如果出現坐標反向,并且反向距離大于反向間隙補償值,那么該軸坐標值就應加上反向間隙補償值,然后用替換函數Replace將原先的值替換。其中需要注意的是軸坐標的比較是算數運算,而從每一行取出的是字符串,故必須進行轉換。先將字符串轉換成float型,運算完成后,再將其轉換成CString型,最后進行字符串替換。
3.3.4 文件存儲
文件存儲是將原文件名加“_bc”,另存在文件原目錄。若文件有重名就使用消息函數MessageBox(),彈出消息對話框提示是否要覆蓋,確定 就 用fp_bc.Open(strFilePathName,CFile::modeCreate|CFile::modeWrite)創建新文件,取消則返回。
本文針對機床絲杠和絲母之間往返運動中產生的反向間隙誤差,基于VC++開發了反向間隙補償處理軟件,成功實現了對數控程序的讀取、補償處理和存儲。該軟件對于沒有反向間隙補償功能的數控設備有很好的效果,也可為基于計算機的專用數控系統開發提供借鑒。其成功應用于2009年國家863項目《渦軸發動機整體葉輪高效加工技術與仿真優化》的葉片加工中。
本軟件現只適用于直線(G0/G1)形式的數控程序,對于圓弧指令(G2/G3)生產的數控程序還有一定缺陷,即圓弧指令在執行過程中的換向用本軟件進行反向間隙補償還無法實現。
[1]胡海生,李升亮.Visual C++6.0編程學習捷徑[M].北京:清華大學出版社,2003:1-5.
[2]曾凡鋒,苗 雨.MFC編程技巧與范例詳解[M].北京:清華大學出版社,2008:5-26.
[3]陳建雯,劉立新.反向間隙對數控加工的影響與補償[J].裝備制造技術,2008(09):76-77.
[4]黃榮億.數控機床反向間隙誤差加工程序補償法[J].裝備制造技術,2007(5):96-97.
[5]閆常友.跟我學Visual C++6.0[M].北京:清華大學出版社,2010:38-41.