摘 要:簡述通過Think3的GPL語言,利用曲線偏移的功能產(chǎn)生鋁型材擠壓模??拙€割刀路及對應(yīng)G代碼的過程,并對??走M(jìn)行自動相切檢查。
作者來自亞洲鋁廠
關(guān)鍵詞:擠壓模線切割; G代碼; 偏移; 暫停點(diǎn)
作者來自亞洲鋁廠
在擠壓模制作過程中,線切割加工是非常重要的一個環(huán)節(jié)。??妆砻尜|(zhì)量將直接影響擠出鋁型材的表面質(zhì)量。 我司對該環(huán)節(jié)一向非常重視,率先引進(jìn)高精度慢走絲對??走M(jìn)行加工,極大的提高了模具表面質(zhì)量。隨著公司業(yè)務(wù)的擴(kuò)大及對制造精度的不懈追求,對線割編程的要求也越來越高。
由于現(xiàn)有線割編程軟件參數(shù)設(shè)置繁瑣, 產(chǎn)生的NC代碼與機(jī)床性能不完全匹配,需再次檢查及更改,不同機(jī)床須分別處理。而在擠壓模線割編程編程中,加工參數(shù)相對固定,為減輕線割編程員勞動強(qiáng)度,降低新人培訓(xùn)周期,遂提出通過CAD軟件Think3的GPL語言,利用曲線偏移的功能產(chǎn)生擠壓模??拙€割刀路及對應(yīng)G代碼的過程,并對??走M(jìn)行自動相切檢查的設(shè)想。
具體流程如下:
1.輸入待割型材選擇集,要保證集合首尾順序相接。若所選起始點(diǎn)或方向不合適可通過起始點(diǎn)前移/后移及反相進(jìn)行變更。
2.對待割鋁型材選擇集進(jìn)行自動檢查,以保證過渡圓滑。
2.對待割鋁型材選擇集進(jìn)行自動檢查,以保證過渡圓滑。
具體方法為:由程序?qū)ο噜弮蓤D素進(jìn)行檢查:
(1)若為直線和圓弧,通過求直線兩端點(diǎn)與圓弧起點(diǎn)和終點(diǎn)距離取得交點(diǎn),再判斷交點(diǎn)與圓心所成直線與直線夾角,若非90度則判定直線和圓弧非相切關(guān)系,在交點(diǎn)處按指定圖層及顏色繪點(diǎn)提醒此處需更正;
(2)若為圓弧和圓弧,判斷圓心距離是否等于半徑和或差,若不等判定圓弧和圓弧非相切關(guān)系,在交點(diǎn)處按指定圖層及顏色繪點(diǎn)提醒此處需更正;
(3)若為直線和直線,直接在交點(diǎn)處按指定圖層及顏色繪點(diǎn)提醒編程員檢查。
3.定義加工參數(shù),入絲點(diǎn):
3.定義加工參數(shù),入絲點(diǎn):
主要輸入切割厚度,入絲點(diǎn),精加工次數(shù)。
4.用偏移功能產(chǎn)生加工軌跡線:
4.用偏移功能產(chǎn)生加工軌跡線:
依加工參數(shù)確定偏移距離,利用CAD軟件的偏移功能產(chǎn)生偏移線(將偏移線第一刀放到999層,即粗割軌跡線;其余依次放到998、997...層),對輸入待割型材的總長與新產(chǎn)生軌跡線總長比對,軌跡線總長大于待割型材的總長則將其刪除,變更偏移方向,重新產(chǎn)生軌跡線。具體GPL程序代碼如下:
#procedure SelsOfst(IDS,offsetDist,InOut) !No005將給定圖素偏移指定距離 若相等則失敗不產(chǎn)生偏移圖素[自ek_confw.prbs]W::->WrTp::
*保留原始環(huán)境WrTp::SelsOfst(ek_prese(1),0.2,1) //SelsOfst(ek_prese(1),0.2,1)
currCol:=$PG(EP_COL) ekpar EP_COL 60 !EP_COL
currLTYPE:=$PG(EP_LTYPE) ekpar EP_LEV 999 !EP_LTYPE
currWIDTH:=$PG(EP_WIDTH) ekpar EP_WIDTH 2 !EP_WIDTH
currLEV:=$PG(EP_LEV) ekpar EP_LEV 999 !EP_LEV
TmpTPth_IDS
TmpTPth_IDS
TmpTPth_IDS::=0#0
ekpar EP_CVOF_DIST 1 !DIST/point
Sids::=IDS !保留待處理集合
exitflag::=0
m(IDS,"IDS")
Sperim::=WrTp::GetLensBySels(IDS)
lastEnt::=$lastent
m($lastent,"$lastent Prv")
Sids::=IDS !保留待處理集合
exitflag::=0
m(IDS,"IDS")
Sperim::=WrTp::GetLensBySels(IDS)
lastEnt::=$lastent
m($lastent,"$lastent Prv")
WrTp::SelsHIGHZYYSXS(Sids,20,1)
AAG_2011::SelByIds(Sids)
AAG_2011::SelByIds(Sids)
ekpar EP_CVOF_DIST 1 !DIST/point
ekpar EP_OFFSET_N offsetDist !0.2/-0.2 offsetDist
ekpar EP_OFF_OPTMC 0 !copy 0/Move 1 -》ekpar EP_OFF_OPTMC 1
ekpar EP_OFFSET_N offsetDist !0.2/-0.2 offsetDist
ekpar EP_OFF_OPTMC 0 !copy 0/Move 1 -》ekpar EP_OFF_OPTMC 1
* ekpar EP_CVOF_NUMOF ek_num_edit
ekpar EP_CVOF_NUMOF 1 !層數(shù) UNDO
ekpar EP_CVOF_TRFL 1 !Extended0/1Fillet是否倒圓
ekpar EP_CVOF_NUMOF 1 !層數(shù) UNDO
ekpar EP_CVOF_TRFL 1 !Extended0/1Fillet是否倒圓
user::ek_offset_onpln !執(zhí)行 產(chǎn)生偏移線
eos
Halt
if($lastent.eq.lastEnt) ek_w_m('最后建立的[$lastent為空 請查證!'//m(IDS)) goto('e0') ! exit
eos
Halt
if($lastent.eq.lastEnt) ek_w_m('最后建立的[$lastent為空 請查證!'//m(IDS)) goto('e0') ! exit
m($lastent,"$lastent Nxt")
OfstIds::=(lastEnt+1):$lastent !首次 產(chǎn)生的偏移線
Dperim::=WrTp::GetLensBySels(WrTp::OfstIds)
*
if((WrTp::Dperim.lt.WrTp::Sperim).and.(InOut.eq.1)) then !目標(biāo)周長小于源+InOut=1 ->exitflag::=1
m('SelsOfst ok in',IDS,offsetDist,InOut,OfstIds)
TmpTPth_IDS::=OfstIds
exitflag::=1
elseif(WrTp::Dperim.eq.WrTp::Sperim) then
OfstIds::=0
m('SelsOfst ==',IDS,offsetDist,InOut,OfstIds)
exitflag::=2
elseif((WrTp::Dperim.gt.WrTp::Sperim).and.(InOut.ne.1)) then !目標(biāo)周長小于源+InOut<>1 ->exitflag::=1
m('SelsOfst ok Out',IDS,offsetDist,InOut,OfstIds)
exitflag::=1
else
ekpar EP_OFFSET_N -offsetDist
endif
OfstIds::=(lastEnt+1):$lastent !首次 產(chǎn)生的偏移線
Dperim::=WrTp::GetLensBySels(WrTp::OfstIds)
*
if((WrTp::Dperim.lt.WrTp::Sperim).and.(InOut.eq.1)) then !目標(biāo)周長小于源+InOut=1 ->exitflag::=1
m('SelsOfst ok in',IDS,offsetDist,InOut,OfstIds)
TmpTPth_IDS::=OfstIds
exitflag::=1
elseif(WrTp::Dperim.eq.WrTp::Sperim) then
OfstIds::=0
m('SelsOfst ==',IDS,offsetDist,InOut,OfstIds)
exitflag::=2
elseif((WrTp::Dperim.gt.WrTp::Sperim).and.(InOut.ne.1)) then !目標(biāo)周長小于源+InOut<>1 ->exitflag::=1
m('SelsOfst ok Out',IDS,offsetDist,InOut,OfstIds)
exitflag::=1
else
ekpar EP_OFFSET_N -offsetDist
endif
*
if(WrTp::exitflag.eq.1) m("WrTp::exitflag.eq.1") eos goto('e0') ! exit
if(WrTp::exitflag.eq.2) m("WrTp::exitflag.eq.2") eos undo eos goto('e0') ! !目標(biāo)周長等于源 exit
if(WrTp::exitflag.eq.1) m("WrTp::exitflag.eq.1") eos goto('e0') ! exit
if(WrTp::exitflag.eq.2) m("WrTp::exitflag.eq.2") eos undo eos goto('e0') ! !目標(biāo)周長等于源 exit
m("SelsOfst -offsetDist",-offsetDist,now)
undo
undo
*重新設(shè)置選擇集
WrTp::SelsHIGHZYYSXS(Sids,2,1)
AAG_2011::SelByIds(Sids)
lastEnt::=$lastent
user::ek_offset_onpln eos m("SelsOfst -offsetDist Do") !執(zhí)行 產(chǎn)生偏移線
Halt
if($lastent.eq.lastEnt) ek_w_m('最后建立的[$lastent為空 請查證!02'//m(IDS)) goto('e0') ! exit
OfstIds::=(lastEnt+1):$lastent !undo后 產(chǎn)生的偏移線
WrTp::SelsHIGHZYYSXS(Sids,2,1)
AAG_2011::SelByIds(Sids)
lastEnt::=$lastent
user::ek_offset_onpln eos m("SelsOfst -offsetDist Do") !執(zhí)行 產(chǎn)生偏移線
Halt
if($lastent.eq.lastEnt) ek_w_m('最后建立的[$lastent為空 請查證!02'//m(IDS)) goto('e0') ! exit
OfstIds::=(lastEnt+1):$lastent !undo后 產(chǎn)生的偏移線
Dperim::=WrTp::GetLensBySels(WrTp::OfstIds)
if((WrTp::Dperim.lt.WrTp::Sperim).and.(InOut.eq.1)) then
* exit
m('SelsOfst ok2 in',IDS,offsetDist,InOut,OfstIds)
TmpTPth_IDS::=OfstIds
exitflag::=1
elseif((WrTp::Dperim.gt.WrTp::Sperim).and.(InOut.ne.1)) then ! ??應(yīng)無機(jī)會執(zhí)行到
m('SelsOfst ?ok? Out2 >>ERR!',IDS,offsetDist,InOut,OfstIds)
exitflag::=1
endif
m('SelsOfst ok2 in',IDS,offsetDist,InOut,OfstIds)
TmpTPth_IDS::=OfstIds
exitflag::=1
elseif((WrTp::Dperim.gt.WrTp::Sperim).and.(InOut.ne.1)) then ! ??應(yīng)無機(jī)會執(zhí)行到
m('SelsOfst ?ok? Out2 >>ERR!',IDS,offsetDist,InOut,OfstIds)
exitflag::=1
endif
if(exitflag.eq.1) goto('e0') ! exit
m('SelsOfst err ',now)
*
end:
* exit(values) !
exit
exit
e0: m("SelsOfst->e0 ") !TTError("PLSort",WERROR,TTMsg('_TTGEN'\\15,''))
*恢復(fù)原始環(huán)境
ekpar EP_COL currCol !EP_COL
ekpar EP_LTYPE currLTYPE !EP_LTYPE
ekpar EP_WIDTH currWIDTH !EP_WIDTH
ekpar EP_LEV currLEV !EP_LEV
goto('end')
ekpar EP_COL currCol !EP_COL
ekpar EP_LTYPE currLTYPE !EP_LTYPE
ekpar EP_WIDTH currWIDTH !EP_WIDTH
ekpar EP_LEV currLEV !EP_LEV
goto('end')
#end
5.按給定支撐距離計(jì)算,取得支撐位打斷點(diǎn),并將粗割刀路打斷,對打斷點(diǎn)進(jìn)行判斷:
a.所需剩余長度計(jì)算:
依支撐所需長度,判斷最后的圖素長度是否足夠,若不足則將“所需長度-最后圖素長度”得出“所需剩余長度;同理依次對前一圖素長度作判斷,直至前一圖素長度大于所需剩余長度。
依支撐所需長度,判斷最后的圖素長度是否足夠,若不足則將“所需長度-最后圖素長度”得出“所需剩余長度;同理依次對前一圖素長度作判斷,直至前一圖素長度大于所需剩余長度。
b.建立支撐位打斷點(diǎn):
當(dāng)前一圖素長度大于所需剩余長度時,計(jì)算所需剩余長度占前一圖素長度的比例數(shù)(以下簡稱為比例數(shù)),利用在曲線指定比例處畫點(diǎn)功能建立支撐位打斷點(diǎn)(此時需注意曲線起始點(diǎn)是否與切割方向吻合,當(dāng)方向相反時所用比例值 =(1-比例數(shù))。以便使點(diǎn)位與切割方向相符。
c.在點(diǎn)位處打斷,重排刀路:
接著利用曲線分割函數(shù)在剛剛建立的點(diǎn)位處打斷曲線,將打斷建立的新圖素依其位置對刀路圖素選擇集重排,使打斷產(chǎn)生的新圖素在刀路正確的序列中。
6.在易斷絲處設(shè)置暫停點(diǎn)
接著利用曲線分割函數(shù)在剛剛建立的點(diǎn)位處打斷曲線,將打斷建立的新圖素依其位置對刀路圖素選擇集重排,使打斷產(chǎn)生的新圖素在刀路正確的序列中。
6.在易斷絲處設(shè)置暫停點(diǎn)
即在給定位置點(diǎn)將刀路打斷,并在該位置建立點(diǎn)。(具體方法同5)
7.對刀路進(jìn)行模擬,以確認(rèn)刀路序列正確。
8.產(chǎn)生Nc程序
按刀路進(jìn)行模擬時圖素顯示順序產(chǎn)生加工點(diǎn)位坐標(biāo)序列,再在適當(dāng)位置插入必要的輔助控制碼及G代碼。因刀路依次排列的圖素不是嚴(yán)格按首尾相接(可能有頭接尾的情況), 產(chǎn)生加工點(diǎn)位坐標(biāo)序列時必須對此進(jìn)行判別,以保證坐標(biāo)序列正確。
通過以上過程,實(shí)現(xiàn)程序所見即所得。加工參數(shù)可直接由輸入的模厚自動生成,最終程序格式可根據(jù)實(shí)際機(jī)床靈活調(diào)整,避免對不同類型機(jī)床需多次編程的弊端;程序設(shè)置更加便捷.