跳到主要內容

方中球(二)

文章日期:2010-01-30 00:42



由於車削方中球時,需要做一個圓中帶方的夾具,
才能將正方塊的工件夾在車床上切削,
雖然車削的方法速度很快(一個孔加工約1.5分鐘),
但夾具的製作難度有點高,
所以今天就來寫個用銑床銑削方中球的方法,
不過,用銑床銑削可能要多花6倍以上的時間..


銑削方中球用的球刀
以前曾用過直徑2mm的的平底端銑刀,但銑起來表面光度不好,
所以這次改成直徑2mm的球刀,但刀刃要長,
可銑削深度至10mm的才行,如下圖所示


方中球的算法:
假設球體直徑為D,挖孔直徑為d,挖孔深度為S,
正方塊的邊長為L,正方塊的對角線長為(√3)L,則
(√3)L = D + 2*(√3)S,

若將L及D設為已知條件,代入上式則可解出:
挖孔深度S = [(√3)L - D ]/ (2*(√3);
挖孔直徑d = 2*(√2)K = 2*(√2)(L/2 - S)。


此外,假設球刀半徑為r1,程式的原點在正方體上方的中心位置,所以必需算出球刀的球面與挖孔深度的接觸時,球刀底端中心的位置xEnd及zEnd :
xEnd = 0.5*d + r1*( d / D );
zEnd = -S  -  r1*( (0.5*L-S )/ (0.5*D) ) + r1 ;


方中球的CNC車床程式大約三十多個單節即可,
不過,若改為CNC銑床,因為球面要銑的細緻,
則程式大約三百個單節,這用人工來寫太麻煩了,
所以我打算用lisp來寫CNC銑床程式,
這樣一來不但省事,將來如果要改方中球的尺寸,
也不必再重寫lisp,
只需將球刀的直徑、方中球的球徑、正方塊的邊長輸入即可。


用AutoLisp來畫銑削方中球的刀具路徑
(defun c:kk()
  (setq rTool 1.0   dSph 23.0  dHole 0.0  deep 0.0)
  (setq rTool  (/ (getreal "Enter the tool diameter.  ") 2) )
  (setq rSph   (/ (getreal "Enter the sphere diameter. ") 2) )
  (setq lenCubic (/ (getreal "Enter the length of cubic. ") 2) )
  (command "color" "bylayer" )
;;;;;;PRE-CHK for feasibility;;;;;;;;;;;;;;;;
  (setq deep  (/ (- (* (sqrt 3.0) lenCubic ) rSph ) (sqrt 3.0) ))
  (setq rHole (* (sqrt 2) (- lenCubic deep) ))
  (if (> rHole rSph )
    (progn
       (alert "The diameter of sphere is larger than the diameter of cubic! ")
       (exit)
    )
  )
  (setvar "osmode" 0)
  (setq xEnd (+ rHole (* rTool (/ rHole rSph) )))
  (setq zEnd (- (* -1 deep)  (* rTool (/ (- lenCubic deep) rSph) )))
  (setq rBall (+ 0.2 rsph rTool))
  (setq x2 0.0   z2 (- rBall lenCubic ) )
;;;;;;milling inside out;;;;;;;;;;;;;;;;;;;;;;
  (setq num (+ 1 (fix (/ xEnd (* 2 rTool)))))
  (setq stepOver (/ xEnd num) )
  (setq xmill stepOver)
  (while (< xmill (+ xEnd 0.1))
      (command "circle" (list 0 0 (- z2 rTool -0.2)) xmill )
      (setq xmill (+ xmill stepOver) z2 (- z2 0.4))
  )
  (command "zoom" "E" "")
  (command "Vpoint" (list 1 1 1))
;;;;;roughing;;;;;;;;;;;;;;;;;;;
  (setq rBall (+ 0.2 rsph rTool))
  (setq totalAng (+ 0.1 (/ (* 180.0 (atan (/ rHole (- lenCubic deep)))) 3.1415926)))
  (setq stepAng 5.0  totalAng (- totalAng 1.1) )
  (command "color" "green" )
  (millBall)
;;;;;finishing;;;;;;;;;;;;;;;;;;;
  (setq rBall (+ rsph rTool))
  (setq stepAng 1.0   totalAng (+ totalAng 1.0) )
  (command "color" "blue" )
  (millBall)
  (setvar "osmode" 1)
)


(defun millBall()
  (setq num (fix (/ totalAng  stepAng) ))
  (setq stepAng (/ totalAng num) )
  (setq wkAng  stepAng   angToRad (/ 3.1415926 180.0))
  (while (< wkAng (+ 0.1 totalAng) )
    (setq z2 (- (* rBall (cos (* angToRad wkAng) )) lenCubic))
    (setq x2 (*  rBall  (sin  (* angToRad wkAng) )) )
    (command "circle" (list 0 0 (- z2 rTool)) x2 "")
    (setq wkAng (+ wkAng stepAng) )
  )
)

下圖是方中球的刀具路徑,黑色和綠色是粗銑路徑,
藍色則是最後的精銑刀具路徑。



用AutoLisp來寫銑削方中球的CNC程式
如果忘了AutoLisp的語法,請參考

(本文的加工參數以塑膠類的軟材為主)

(defun c:bc()
  (setq rTool 1.0   dSph 23.0  dHole 0.0  deep 0.0)
  (setq rTool  (/ (getreal "Enter the tool diameter.  ") 2) )
  (setq rSph   (/ (getreal "Enter the sphere diameter. ") 2) )
  (setq lenCubic (/ (getreal "Enter the length of cubic. ") 2) )
  (command "color" "bylayer" )
;;;;;;PRE-CHK for feasibility;;;;;;;;;;;;;;;;
  (setq deep  (/ (- (* (sqrt 3.0) lenCubic ) rSph ) (sqrt 3.0) ))
  (setq rHole (* (sqrt 2) (- lenCubic deep) ))
  (if (> rHole rSph )
    (progn
       (alert "The diameter of sphere is larger than the diameter of cubic! ")
       (exit) ))
  (setvar "osmode" 0)
  (setq file01 (open "c:\\test.nc" "w"))
  (princ "%\n" file01)
  (princ "O0001\n" file01)
  (princ "G0G17G40G49G80G90F300\n" file01)
  (princ "G54 G0 X0 Y0\n")
  (princ "S2800M03\n" file01)
  (princ "G43 Z20. H01\n" file01)
  (princ "G0  Z3.\n" file01)

  (setq xEnd (+ rHole (* rTool (/ rHole rSph) )))
  (setq zEnd (- (* -1 deep)  (* rTool (/ (- lenCubic deep) rSph) )))
  (setq rBall (+ 0.2 rsph rTool))
  (setq x2 0.0   z2 (- rBall lenCubic ) )
  (princ "G1  Z" file01)
  (princ (- z2 rTool) file01)
  (princ " F120\n" file01)
;;;;;;milling inside out;;;;;;;;;;;;;;;;;;;;;;
  (setq num (+ 1 (fix (/ xEnd (* 2 rTool)))))
  (setq stepOver (/ xEnd num) )
  (setq xmill stepOver)
  (while (< xmill (+ xEnd 0.1))
      (setq xp xmill  zp z2  brk 0)
      (pOutLile)
      (command "circle" (list 0 0 (- z2 rTool -0.2)) xmill )
      (if (and (> xmill 5 ) (< xmill 7 ))
         (princ " F80\n" file01)  )
      (setq xp (* -1.0 xmill) rp xmill)
      (pOutArc)
      (setq xp xmill)
      (pOutArc)
      (setq xmill (+ xmill stepOver) z2 (- z2 0.5))
  )
;;;;;;;raising tool;;;;;;;;;;;;
      (princ "G0 Z0\n" file01)
      (princ "   X1.\n" file01)
  (command "zoom" "E" "")
  (command "Vpoint" (list 1 1 1))
;;;;;roughing;;;;;;;;;;;;;;;;;;;
  (setq rBall (+ 0.2 rsph rTool))
  (setq totalAng (+ 0.1 (/ (* 180.0 (atan (/ rHole (- lenCubic deep)))) 3.1415926)))
  (setq stepAng 5.0  totalAng (- totalAng 1.1) fx 80)
  (command "color" "green" )
  (princ " F100\n" file01)
  (millBall)
;;;;;finishing;;;;;;;;;;;;;;;;;;;
  (setq rBall (+ rsph rTool))
  (setq stepAng 1.2   totalAng (+ totalAng 1.0) )
  (command "color" "blue" )
  (princ " F200\n" file01)
  (millBall)
;;;;;ending CNC file;;;;;;;;;;;;;;;;;;;
  (princ "G0 Z20.\n" file01)
  (princ "   X0Y0\n" file01)
  (princ "M99\n" file01)
  (princ "%" file01) 
  (close file01)
  (setvar "osmode" 1)
)
;;;;;;;;;;;sub-program;;;;;;;;;;;;;;;;;;;;;;;;
(defun millBall()
  (setq num (fix (/ totalAng  stepAng) ))
  (setq stepAng (/ totalAng num)   brk 1)
  (setq wkAng  stepAng   angToRad (/ 3.1415926 180.0))
  (while (< wkAng (+ 0.1 totalAng) )
    (setq z2 (- (* rBall (cos (* angToRad wkAng) )) lenCubic))
    (setq x2 (*  rBall  (sin  (* angToRad wkAng) )) )
    (setq xp x2  zp (- z2 rTool) )
    (pOutLile)
    (command "circle" (list 0 0 (- z2 rTool)) x2 "")
    (setq xp (* -1.0 x2)  rp x2)
    (pOutArc)
    (setq xp x2 )
    (pOutArc)
    (setq wkAng (+ wkAng stepAng) )
  )
;;;;;;;raising tool;;;;;;;;;;;;
  (princ "G0 Z0.\n" file01)
  (princ "   X1. Y0.\n" file01)
)

(defun pOutLile()
  (setq pxs(rtos xp 2 3) pzs(rtos zp 2 3))
  (setq pxl(strlen pxs)  pzl(strlen pzs))
  (setq pxn(- 7 pxl)  pzn(- 7 pzl))
  (princ "G1 X" file01)
  (princ pxs file01)
  (repeat pxn (princ " " file01))
  (if (= brk 1)
     (princ "\n" file01) )
  (princ " " file01)
  (princ "Z" file01)
  (princ pzs file01)
  (princ "\n" file01)
)
(defun pOutArc()
  (setq pxs(rtos xp 2 3) prs(rtos rp 2 3))
  (setq pxl(strlen pxs)  prl(strlen prs))
  (setq pxn(- 7 pxl)  prn(- 7 pzl))
  (princ "G2 X" file01)
  (princ pxs file01)
  (repeat pxn (princ " " file01))
  (princ " " file01)
  (princ "R" file01)
  (princ prs file01)
  (princ "\n" file01)
)


銑削方中球的刀具路徑模擬
AutoLisp產出的CNC程式,用FGcam讀入,便可得到下列的刀具路徑,然後一估加工時間,嚇了一跳,居然要12分鐘,原來精車時,每隔1.2度銑一圈,會是這麼耗時。


AutoLisp產出的CNC程式,也可用Mastercam讀入,轉成刀具路徑後(NCI),也可預估加工時間,如下圖所示,不過在Mastercam下所估的加工時間是 14分鐘,如下圖所示。

留言

這個網誌中的熱門文章

管牙PT

文章日期:2009-07-12 23:08 本文旨在講解 PT錐度管牙 常見的標準的管牙規範計有:  NPT , NPTF ,NPS , PS ,PF , PT.. ,前3者有N開頭的是美國標準的管牙 ,牙角(又稱螺紋角)60度 ,後面這3者則是英國標準的管牙 ,牙角55度 ,這些代號裡面的T意指Taper ,也就是錐度牙 。 不論是PT還是NPT,他們的錐度值都是1/16, 換算成角度值是 2*tan-1(0.5/16)=3.57982度 = 3度34分47.356秒, 3.57982度為什麼等於3度34分47.356分呢? 這是因為角度的單位換算是六十進位,3.5798212度後面的小數點0.5798212"度"要換算成""分"時,0.5798212度 = 0.57982*60分 = 34.789273分 ,而34.789273分後面的小數點0.789273分要換算成秒, 則0.789273*60秒 = 47.356秒。 此外,切記在車削錐牙時得採半錐角,也就是1度47分23.7秒。 NPT (美制管用推拔螺紋) 制定在 ANSI 規格中,稱為美國標準管用推拔螺紋,有外螺紋與內螺紋。 NPT 外螺紋不但對 NPT 內螺紋配合,有時也配合 NPSC ,這點類似 PT 。螺紋峰與根切成同形,又因公差大,餘隙、緊密兩種配合都可用。如用潤滑劑,則變成耐密用,耐密用者另有稱為乾封閉之如 NPTF,NPSF 等付有 F 之一群。 NPTF (美制管用耐密推拔螺紋) NPTF 外螺紋,像 PT.NPT 有時也配合 NPSF.NPSI (都是內螺紋)。因這種螺紋都是峯尖、根淺,峯不是密接於根就是食進,可防止在此部分變成螺旋狀間隙,這是前述耐密性之理由。 PT( 英制管用推拔螺紋 ) 以前是使用面直角的螺紋峯,現在將規格統一為軸直角者。 JIS 定為耐密用而組合外螺紋和內螺紋。 PT 外螺紋除了配合 PT 內螺紋,有時也配合 PS 。 PS ( 英制管用推拔螺紋用平行內螺紋   ─   耐密用 )     屬於 JIS 內 PT 的規格,舊 JIS 裏 PS 牙的外螺紋已被取消,配合的外螺紋現規定要用 PT 。 PF( 英制管用平行螺紋   ─  

G76車牙

文章日期:2008-10-10 00:02 工具機若使用 Fanuc 控制器,車牙轉速有一個先天上的限制: S × P < 4000 請參考 車牙的 NC 碼計有 G32 、 G92 、 G76 三種 ( 使用方法 這三個指令中,手寫 G92 一般是直進式切削,牙刀的兩刃皆受力,直進式切削 ,每刀吃深不多,以免造成牙面粗糙,反觀 G76 則是斜進式單邊車削 ,可以有較大的進刀深度 , 寫法也簡短方便廣受採用,不論多大的牙, G76 只要兩個單節就可解決了。 由於 G76 有單邊切削的效果,廣受學校或職訓單位的喜愛,如下圖所示。         Fanuc0T系列控制器之G76 格式如下 : 指令說明 (m) : 精車次數。 (r) : 車牙末端 拔刀時留下的不完全牙長度(倍率)。 (a) :牙刀之角度,可選擇 80 °、 60 °、 55 °、 30 °、 29 °、 0 °等角度。 Q( △ dmin) :最小進刀深度。 R(d) :精車預留量。 X(u) :螺紋程式終點的 X 軸方向座標。 Z(w) :螺紋程式終點的 Z 軸方向座標。 R(i) :螺紋部份的半徑差,如果 I=0 可作一般直線螺紋車削。 P(k) :螺紋高度即牙深度, K 為正值在 X 軸方向用半徑值指定。 Q( △ d) :第一次螺紋的切削深度,用半徑值指定。 F(l) :螺紋的導程,與 G32 相同。 以M20X2.5外螺紋為例 , 常見的寫法如下 : G76 P01 00 60 Q40 R0.02 G76 X16.933 Z-10.0  P1533    Q500   F2.5 1. G76第一行的 P01 00 60 ,這01表示最後精車時只車一刀精車, 00 表示車牙最後拔刀時不留倒角 ,此所謂之倒角是 不完全牙之意 ,亦即因拔刀而在工件上留下牙深較淺的牙 ,Fanuc的拔刀精度是0.1倍的導程 , 若是此值改成10,則表示拔刀時在軸向會留下一倍導程長度的不完全牙,這一倍就是指導程2.5的一倍,也就是不完全牙會有2.5mm那麼長, 60 表示要車的牙角是 60 度 , G76 所 適應的刀角範圍不但很大, Fanu

CNC的S及F

文章日期:2008-01-25 23:25 刀片的損耗與 S 碼及冷卻潤滑較有關,機台的負載則跟 F 碼與機台剛性及馬力較相關,講到 CNC 的 S 及 F 碼,就一定要先講切削刀具, CNC 切削用的刀具常分為整體型及捨棄式刀片型,整體型刀具材質大都是高速鋼類 (HSS) 或鎢鋼類,捨棄式刀片型刀具材質大都是碳化鎢類 (WC) ,這些刀具表面常鍍上耐磨材料在刀刃及刀面上,以增加刀具壽命;常用的整體型刀具以端銑刀為代表,常用的捨棄式刀片型刀具以面銑刀車刀搪刀或快速鑽為代表。  CNC車床的 S 碼有兩種使用方法  : 1. 切削米速 (m/min) ,與 G96 合用,在公式裡的代號是 V ,一般刀具商都會提供這個建議數據,但是在實際使用上通常要先打半折來當起始米速。 2. 主軸轉速 (RPM 或 rev/min) ,與 G97 合用,公式裡的代號是 N ,切削米速與主軸轉速兩者之間可以換算 (CNC 銑床的 S 碼則常內定為後者,不需要再用 G 碼切換 ) 。 CNC的 F 碼是指進給,也有兩種使用方法  : 1. 每分鐘車刀移動距離 mm/min( 或是銑床床台每分鐘移動距離 ) ,此法單純只指車刀或床台的移動,與主軸並沒有連動的關係,在公式裡的代號是 F 。 2. 車工工件每轉之下車刀移動距離 mm/rev ,此法之主軸刀塔有連動的關係,使用在 CNC 銑床的意義為  :  銑刀每轉之下銑床床台移動之距離 (mm/rev) ,銑刀與車刀不盡相同,銑刀通常是多刀刃,所以銑刀每轉之床台移動距離若再除以銑刀刃數,就可以得到每刃每轉之下的切削量,在本文中所使用的公式代號是 f 。 CNC的 S 碼跟刀具壽命有最直接的關係,而 CNC 的 F 碼則與銑刀及機台承受能力有最直接的關係,主軸轉速過高會耗損刀具壽命,進給過快則銑刀崩裂或斷掉,甚至機台耗損,尤其是近年來台灣製造的 CNC 車床搭配 Fanuc 的伺服馬達,若內無附減速齒輪機構,對於大直徑工件 (500mm 直徑 ) 在低轉速大進給之下車削,主軸的負載會飆升,長時間加工會加速機台耗損。 ★ CNC 銑床主軸轉速的計算  :  主軸轉速 N=1000*V / (3.14*D) D: 指銑刀的直徑 (mm)  , V: 刀片的