跳到主要內容

AutoLisp(二)

文章日期:2008-02-19 14:03


有了Autolisp的基本概念之後,現在來做個小練習,假設我們要1+2+3+…,一直加到200,可以寫成 : (+  1  2  3  4 …) ,一直寫到200,不過這樣實在太費事,我們可以寫個小迴圈並將整個程式化成AutoCAD的一個指令來執行,程式如下:
(defun c:sum()
    (setq total 0 i1 1)
    (while (< i1 201)
        (setq total (+ total i1))
        (setq i1 (+ i1 1)) )
    (princ "\ntotal=" )
    (princ total )
    (princ )
)
 以上之程式解釋如下:

(defun c:sum()
定義一個名叫sum的指令
(setq total 0 i1 1)
設定total = 0 i1 = 1
(while (< i1 201)
(迴圈,當i1< 201,則進入迴圈之內,否則離開迴圈
(setq total (+ total i1))
迴圈內:設定 total 之值為 total+i1
(setq i1 (+ i1 1)) )
迴圈內:設定 i1 之值為 i1+1 ,並跳到迴圈第一行)
(princ "\ntotal=" )
\n:跳一行,並在螢幕上列出total=
(princ total )
在螢幕上列出算出來的total的值
(princ )
 蓋掉回傳值,以免螢幕重列了兩次total的值
)
完結定義 )

 
將這程式寫在電腦的筆記本裡,並存檔且命名為test01.lsp,注意存檔類型要選"所有檔案",以免存成txt檔,存好之後進入AutoCAD裡,用滑鼠點選"工具"=>"載入應用程式"並點選檔案的所在路徑及檔名後,按"載入"並"離開",最後回到AutoCAD底下文字列裡,用鍵盤輸入"sum"這個我們已經做好的這個指令名稱,就可啟動這個程式。


知道如何寫迴圈之後,再來學用Autolisp畫圖,先做個半徑為80的半球面的圖形試試,範例如下:

(defun c:draw()
    (setq x1 0 z1 0 x2 0 z2 0 i1 1) 
    (while (< i1 91)
        (setq x2 (+ (* 80 (sin (/ (* i1 3.1415926) 180)) ) 0))
        (setq z2 (+ -80 (* 80  (cos (/ (* i1 3.1415926) 180)))))
        (if (= i1 1 )
            (command "line" (list 0 0 20) (list x2 0 3) (list x2 0 z2) "") 
            (command "line" (list x1 0 z1) (list x2 0 z2) "")
        )
        (command "circle" (list 0 0 z2) x2 "")
        (setq i1 (+ i1 1) x1 x2 z1 z2)
    )

    (command "vpoint" "1,1,1" "")
    (command "zoom" "a" "")

)

將這程式寫在電腦的筆記本裡,並存檔且命名為test02.lsp,注意存檔類型要選所有檔案,程式也可以至http://web.mcvs.tp.edu.tw/cu01/下載Autolisp程式;,有了程式之後,進入AutoCAD裡,就可以將寫好的Autolisp載入AutoCAD裡,化成一個指令來使用,操作過程如下 : 用滑鼠點選AutoCAD上方的"工具"=>"載入應用程式"並點選檔案的所在路徑及檔名後按"載入"後離開對話框然後在AutoCAD底下文字列裡,打入"draw",並按Enter鍵就可啟動這個Autolisp程式,執行結果如下圖所示,Autolisp的載入與驅動也可以下載Autolisp的使用(0.2k);來參考


 

此圓球的最高點為Z0,這個程式的迴圈內有個判斷式if,它會判斷i1是否等於1,如果是,則執行第一敘述 (command "line" (list 0 0 20) (list x2 0 3) (list x2 0 z2) ""),若否,則則執行第二敘述(command "line" (list x1 0 z1) (list x2 0 z2) ""),第一敘述在畫兩條線(可做為下刀路徑),從座標(0 0 20) 經(x2 0 3) 到(x2 0 z2),第二敘述在畫一條線,從座標(x1 0 z1) (x2 0 z2),每跑一次迴圈,i1值都會增加1,第二敘述都會被執行(除了第一次跑迴圈是執行第一敘述),同時也都會畫一個圓,i1從1跑到90,所以迴圈總共跑了90次,當i1跑到91時,就跳出迴圈

球銑刀銑削
如果要用球銑刀來銑這樣的一個球面,要如何利用Autolisp來畫刀具路徑並寫CNC程式呢?如下圖所示,此球面與球銑刀的接處點繞Z軸旋轉一圈,可以得到銑削路徑圓,這個球面可以用這種圓來顯示,但是CNC程式是控制球銑刀的球心來銑削,也就是將球心繞Z軸旋轉一圈,就可以得到刀具路徑圓,這個球面就可以用這種圓來銑削,我們做一個跑90次的迴圈,角a是從Z軸到銑刀接觸點的角度,角a從1度開始,每跑一次迴圈,就增加1度(在迴圈裡可用i1來代替角a),並重新計算刀具路徑圓與銑削路徑圓。


畫刀具路徑之程式也可以至http://web.mcvs.tp.edu.tw/cu01/下載Autolisp程式;,至於程式內容如下 :
(defun c:sph01()
  (setq r0 (getreal "Enter the radius of the sphere : "))
  (setq r1 (getreal "Enter the radius of the ball-endmill : "))
  (setq x1 0 z1 0 x2 0 z2 0  x11 0 z11 0 x22 0 z22 0 i1 1)
  (while (< i1 91)
      (setq x2 (+ (* r0 (sin (/ (* i1 3.1415926) 180)) ) 0))
      (setq z2 (+ (* -1 r0) (* 80  (cos (/ (* i1 3.1415926) 180)))))
      (command "color" "bylayer" )
      (if (> i1 1)
                 (command "line" (list x11 0 z11) (list x22 0 z22)  "")  )
      (command "circle" (list 0 0 z2) x2 "")

      (setq x22 (* (+ r0 r1) (sin (/ (* i1 3.1415926) 180))) )
      (setq z22 (+ -80 (* (+ r0 r1) (cos (/ (* i1 3.1415926) 180))) ))
      (command "color" "green" )
      (if (> i1 1)
                 (command "line" (list x11 0 z11) (list x22 0 z22)  "")  )
      (command "circle" (list 0 0 z22) x22 "")
      (setq i1 (+ i1 1) x1 x2 z1 z2 x11 x22 z11 z22 ) )

  (command "vpoint" "1,1,1" "")
  (command "zoom" "a" "")

)


                                                                    等角圖


                                                                   側視圖

刀具路徑圓與銑削路徑圓檢查無誤之後,便可以用Autolisp來寫CNC程式,程式如下。

(defun c:kk()(定義指令kk
  (setq r0 (getreal "Enter the radius of the sphere : "))
  (setq r1 (getreal "Enter the radius of the ball-endmill : "))
顯示字幕並取得由鍵盤輸入之實數
  (setq file01 (open "test.nc" "w"))開啟可寫入的檔案檔名為test.nc
  (princ "%\n" file01)
  (princ "O0002\n" file01)
  (princ "G 0G 17G 40G 49G 80G 90\n" file01)
  (princ "G92X0Y0Z20.\n" file01)
  (princ "S 2500M 03\n" file01)
CNC程式的標頭到test.nc檔案裡。
  (setq x1 0 z1 0 x2 0 z2 0 i1 1)設定參數
  (while (< i1 91)(迴圈開始,當i1 小於91則進入迴圈
    (setq x2 (* (+ r0 r1) (sin (/ (* i1 3.1415926) 180))) )
    (setq z2 (+ -80 (* (+ r0 r1) (cos (/ (* i1 3.1415926) 180))) ))
求取並設定x2z2參數
x2=(r0+r1)*sin( i1*3.14/180)
z2=(r0+r1)*cos( i1*3.14/180)
    (command "circle" (list 0 0 z2) x2 "")畫一個圓
    (if (= i1 1 )  (判斷式,i1是否等於1
      (progn
        (princ "G00 X" file01)
        (princ  x2 file01)
        (princ  " Z" file01)
        (princ  "3.\n" file01)
        (princ  "G01 Z" file01)
        (princ  z2 file01)
        (princ  "\n" file01)
      )
    判斷式之第一敘述,走兩條路徑

      (progn
        (princ "G01 X" file01)
        (princ  x2 file01)
        (princ  " Z" file01)
        (princ z2 file01)
        (princ  "\n" file01)
      )
    判斷式之第二敘述,走1條路徑
    )判斷式終了)
    (princ "G03 X-" file01)
    (princ  x2 file01)
    (princ  " R" file01)
    (princ  x2 file01)
    (princ  "\n" file01)
逆時針銑半圓
    (princ "G03 X" file01)
    (princ  x2 file01)
    (princ  " R" file01)
    (princ  x2 file01)
    (princ  "\n" file01)
逆時針再銑半圓
    (setq i1 (+ i1 1) x1 x2 z1 z2)設定參數
  )迴圈終了)
  (close file01)關閉檔案
)程式終了)

留言

這個網誌中的熱門文章

管牙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 ...

錐度值

文章日期:2008-02-01 08:40 做傳統車床的人通常會遇到車錐度時要調複式刀座,而複式刀座所調的角度為工件錐度部位之半錐角,為甚麼要調的是半錐角,而不是全錐角呢?為甚麼工件的錐度值乘以 28.65 就是所要調的是半錐角呢? 如下圖所示,將工件錐度部位的稜線延伸至交接,就可看出工件完整的錐度,將這工件全錐度的一半定為 a ,則可得半錐角,由於複式刀座的前進方向是水平的,所以只要將複式刀座依逆時針方向調動半錐角,就可車削工件的錐度。 工件錐度部位之錐度值的計算公式: T=(D-d)/L D 為錐度部位之大徑, d 為錐度部位之小徑, L 為錐度部位之軸向長度。 工件錐度部位之半錐角計算公式: tan(a) = 0.5*(D-d)/L tan 是指正切函數,意思就是 : "對邊除以鄰邊",三角函數裡所指的三角形一定要用直角三角形,直角三角形最長的邊稱為斜邊,鄰邊與斜邊所包的角度就是三角函數角,如下圖的角 a ,三角函數角 a 對面的那個邊就是對邊,三角形會因擺放的位置不同而顯得有點昏頭轉向,不過只要依照上述的原則,就不會認錯邊名了。 從上述說明來看下圖就可以瞭解半錐角計算公式 tan(a) = 0.5*(D-d)/L ,從下圖放大的三角形中可以看出鄰邊長度是 L ,對邊長度是 0.5*(D-d) ,所以 tan(a) =  對邊 / 鄰邊 =0.5*(D-d)/L ,如果已算出 0.5*(D-d)/L 的值要反推角 a 的角度,就必需要這樣做 a=tan -1 (0.5*(D-d)/L) ,也就是用反三角來得角 a 大的小,反三角的值在三十年前常用查表方式求得,近年來只要按一按計算機就可顯示出,不過這對於在工作現場的人來說太麻煩了,所以就有一個半錐角速算公式  : a=28.65*( 錐度值 )=28.65*(D-d)/L) ,那麼這 28.65 到底是怎麼來的呢 ? 其實只要用計算機按按看就可以得到答案,將計算機輸入 1/tan(1 0 ) ,就可得到 57.2899616307594246... ,但由於我們要求的是半錐角,所以再將此值除以 2 就可得到 28.6449808153797... ,簡以 28.65 代之即可,不過這個半錐角速算公式是近似值,只能用來大概調動複式刀座,真正的校正還得...