宏程序是指在程序中主要起到運算所用的程序,似乎系統為用戶配備了強有力的類似于高級語言的宏程序功能,用戶可以使用變量進行算術運算,邏輯運算和函數的混合運算。那麼宏程序這麼好,該怎麼學習呢?那麼由老傅帶你們走進這神秘的宏程序大門吧!
我們普通程序(如G01X100.Y100.F200)X,Y地址後面都是些常量,如果我們把這些常量用變量來編寫如G01X#1 Y#2 F200,這就是我們所謂的宏程序。
那麼# 和後面的1、2、3、4.....數字标識到底什麼關系。這些#号,它是宏代碼,1、2、3....是區分這些宏代碼的标記。
舉個最簡單的例子:如果有三個人,他們的名字叫 小李、小李、小李。那麼當你呼叫小李的時候,會發生一個問題,這三個人都會回答,但你其實隻想喊其中的一個。這就分不清了。
同理,#1 #1 #1 ,如果後面的數字都是一樣,當系統使用#1的時候,它也會發生糊塗,到底讓我用哪個呢?
所以為了區分它們,就把後面的數字寫成不同的,比如#1,#2,#3。
此時如果系統使用#1,就不會發生混亂了。
當然了,标示數字的不同,宏變量的意義也不同,分局部變量、公共變量、系統變量等等,就目前來說,我們使用的是局部變量,能把它用好就不錯了,基礎打好了再說!
- 變量的賦值
這所謂賦值,我們可以這麼理解:我本來很窮,突然有一天有人給我100塊!那麼此時此刻,這100塊就是我的了,因為它給我了!這個“給我”的過程,就稱為賦值。
那麼在宏裡面怎麼賦值呢?我們看一個賦值的語句就理解了:#1 = 100 這就稱為賦值!
它的意思是把100這個值給了#1。那麼#1在不發生運算的情況下,它的結果就是100。
也就是說#1此後代表100。如果有一個程序語句:GOX100. 那麼宏語句GOX#1 與其等同。
下面在舉個例子:
#1=10
#2=20
#3=30
G01X#1 Y#2 F#3
以上這個宏程序相當于G01X10.0 Y20.0 F30這個普通程序。
補充說明:
上面的例子是給變量#1,#2,#3賦了一個具體值,宏程序中我們還可以賦予表達式。
表達式的運算優先級就是加減乘除先算哪個,後算哪個。如果有括号,就先算括号裡面的等等
看下面的例子,設:
#1 = 100
#2 = 10
#3 = 50
#4 = 20
那麼 #1 - #2 * #3 = ?#1/#2 = ?
#3/#2*#4 = ?(#1-#3)/#2 = ?
以上四個運算表達式的結果分别是:-400、10、100、5 相信你也沒什麼問題吧!
以上包工給大家诠釋了變量,賦值等最基本的宏程序概念。大家明白即可!
我們此時更重要的是先學習好宏語句,它将伴随着所有學習宏程序的人,所以一定要理解透徹!
- 宏程序兩大主要語句
1,IF…..GOTO語句:
直觀意思是:如果...就跳轉到哪(或者是做什麼事)。
我們不妨用這個格式來造句,如果福布斯有我的名字,那麼我就不上班了;
如果我看過清風的宏教程,那麼我還會看他的其他教程!
這類語句都有一個共同點:“如果”的後面會跟着一個條件!
根據這個條件,決定我做什麼事!
所以很多書中都這麼介紹此語句:IF[條件成立]GOTO
%
O0001#1 = 10N10 #2 = 20IF[#2 EQ 20] GOTO10G0 X100.Z100........
M30
%上面這個IF語句是什麼意思呢? 它表示:如果#2這個變量的值等于20的話,就跳轉到第10号程序段。可能有人會問“GOTO10”後面的10表示什麼意思。
其實這個10表示行号。數控的程序一般都有行号的,如果沒有,那是系統參數設定的事,不過你隻要知道有行号就行。
還有人會問 EQ 是什麼意思,這個是英文EQUAL的簡寫,含義是等于的意思。
對于新手,建議掌握以下幾個常用的符号(如下表):
所以這裡我們不難理解上面判斷語句的意思了:如果#2等于20,就跳轉到第10号段。由于#2是等于20的(因為在賦值的時候,#2=20),所以條件成立,就跳到了第10号段執行。
我們都知道數控程序一般是從上往下執行的,那麼我們這跳到了第10行,接着往下執行時又遇到了IF判斷語句,于是有開始判斷#2是不是等于20,結果等于!于是又成立了,繼續跳到第10行。所以,這個程序是死循環,永遠不會結束。
說到這,細心人會發現一個問題:條件成立了,會執行GOTO語句,那要是不成立,程序會怎麼辦? 其實很簡單,不成立就往下面走。也就是說如果不成立,就執行G0X100. 的程序段,直到程序運行至M30結束!
總結:如果條件成立,就執行GOTO語句,你寫的行号是多少,它就跳到那個行;要是條件不成立,那麼就執行IF下面的語句,不執行GOTO語句!
2,WHILE…..DO語句:
看到這個語句,還是老樣子,先直觀翻譯下:當.....就執行某某代碼段。
和IF語句差不多,這個語句也是用來做條件判斷的,但WHILE.....DO自身沒有跳轉的功能。
那麼這個語句該怎麼用?我們是造句說明吧,“當年薪達到100W的時候,我就可以買跑車”。這裡“年薪達到100W”是條件,如果條件達到了100W,我就執行買跑車這個想法。就這麼簡單的邏輯!
下面我們用一個程序來解釋它
%
O0002#1 = 20#2 = 20WHILE[#1 EQ #2] DO1GO X50. Y50.G0 X0.Y0.END1G0X100.Z100........
M30
%
上面這個程序段的意思是:當#1和#2的值相等,那麼就執行DO1與END1之間的程序。有人會問一個問題:END1是什麼東西。DO後面的 1 又是什麼東西?這裡呢要說明一下,WHILE語句一定要和 END 結合使用。因為END是它的目标地址。就像IF語句裡的行号一樣,是個目的地!那麼END和DO 後面各有一個1,我們就白話的理解為第一層循環的意思。
如果這裡DO後面跟的是2,而END後面跟的是1,那麼程序将報警,因為DO2找不到與之匹配的END2!所以DO和END後面的數字,一定要匹配!前面說到第一層循環,因為宏是支持循環嵌套的,這個知識點系統教程會着重的講解,這裡不贅述。
現在我們分析下上面的程序段。
由于#1和#2在初始賦值的時候都是20,所以#1和#2是相等的。程序在執行WHILE語句時,它會判斷中括号裡的#1和#2是不是相等,如果相等,就執行DO1與END1之間的程序;
反之如果#1和#2不相等,那麼就不執行 DO1 與 END1 之間的程序,而是往END1下面的程序走,執行G0X100. 直到程序運行至M30結束!講到這,很多朋友會發現WHILE和IF其實一樣的,隻不過格式不同、目的地的表示方法不同而已。
接下來分享幾組宏程序供大家參考:
多邊形 宏程序#1=0 起始角度 0°
#2=16 邊數 16
#4=360 #1
#3=10/COS[360/2*#2]
WHILE[#1LE#4]DO1
G01X[#3*COS[#1]]Y[#3*SIN[#1]]
#1=#1 360/#2
END1
阿基米德螺旋線
#1=0 起始角度
#2=15 起始半徑
#3=30 終止半徑
WHILE[#2LE#3]DO1;
G01X[#2*COS[#1]]Y[#2*SIN[#1]]
#1=#1 1
#2=#2 15/200 跨度200增加半徑15 (每旋轉1°半徑r增加15/200)
END1
凹球面
G00 G90 G54 X0. Y0.
G43 H01 Z30.
Z0.
#1=0
#10=0.2
N10 #2=-7
#3=16.216-#1
#4=SQRT[30*30-#3*#3]
#5=#4-7
G01X[#5]Y0Z[#1]F1200
G02I[-#5]J0
#1=#1-#10
IF[#1GE#2]GOTO10
倒斜角
M3S200
Z-35.
#1=0
WHILE[#1LE35]DO1
#2=50-#1*TAN[45]
G1X#2Z[-35 #1]
G3I-#2
#1=#1 3
END1
M30
倒圓角
G43G00Z50H3
X0Y0
Z0
G41G01X17D01F1000
#1=0
#2=-7
N10 #3=7 #1
#4=SQRT[7*7-#3*#3]
#5=17-#4
G01X[#5]Y0Z[#1]F1000
G02I[-#5]J0
#1=#1-0.1
IF[#1GE#2]GOTO10
G40X0
凸球面
G00X0Y0Z0
#1=-15
N10 #2=0
#3=27.059 15 #1
#4=SQRT[45*45-#3*#3]
#5=#4 8
G01X[#5]Y0Z[#1]F1200
G02I[-#5]J0
#1=#1 0.02
IF[#1LE#2]GOTO10
卧加自動找正宏程序
1.取兩個任一點,用百分表壓在同一個數(先壓在旋轉中心的負方向)
2.壓好第一點運行程序
O0428;
#1=ABS[#5021];
#2=ABS[#5023];
M99;
3.壓好第二點運行程序
O0429;
#3=ABS[#5021];
#4=ABS[#5023];
#5=#3-#1;
#6=#4-#2;
#7=ABS[ATAN[#6]/[#5]];
G91 G0 Z100.;
IF[#7GT90] GOTO10;
G91 G0 B#7;(先壓在旋轉中心的負方向才能不轉反)
M30;
N10;
G91 G0 B-[180-[#7]];
M30;
4.#5021、#5023分别為X、Z軸當前的位置坐标;
5.機床自動運用反正切計算出當前夾角,B軸自動找正。
6.#6004為反正切的角度計算範圍:#6004為“0”時,角度為0-360度;#6004為“1”時,角度為(-180)-180度;
7.Tan1-89度(為正數)分别對應Tan91-179度(為負數)Tan0、180為0,Tan90不存在;
此程序有局限性:不适用于梳齒盤類型B軸結構的機床(一度一分、和半度一分的)。
正弦曲線
#1=0
WHILE[#1LE360]DO1
G01X[50*#1/180-50]Y[10*SIN[#1]]
#1=#1 1
END1
螺旋銑孔
#1=50 圓孔直徑
#2=40 圓孔深度
#3=30 刀具直徑
#4=0 Z坐标設為自變量,賦值為0
#17=1 Z坐标每次遞增量
#5=[#1-#3]/2 刀具回轉直徑
G00 G90 G54 X0 Y0 S1000 M3
G43 H01 Z30. M08
G00 X#5
Z[-#4 1]
G01 Z-#4 F200
WHILE[#4 LT #2]DO01
#4= #4 #17
G03 I-#5 Z-#4 F1000
END 01
G03 I-#5
G01 X[#5-1]
G00 Z100.
G91 G28 Z0. M09
M30
螺旋線
#1=8 ( 圈數 )
#2=2 ( 螺距 )
#3=0
#4=-360*#1
#5=10 ( 螺旋直徑 )
#6=0
WHILE[#3GE#4]DO1
G01X[#5*COS[#3]]Y[#5*SIN[#3]]Z-#6
#3=#3-1
#6=#6 #2/360
END1
,