- 從零開始學數控編程與操作
- 徐衡編著
- 5387字
- 2021-12-23 10:02:04
第3章?子程序與宏程序
3.1 子程序與宏程序基礎
3.1.1 子程序
(1)子程序的概念
在一個加工程序中,若有幾個完全相同的部分程序(即一個零件中有幾處形狀相同,或刀具運動軌跡相同),可以把這部分程序單獨抽出,編成子程序存在存儲器中,需要使用時加工程序用一條簡單指令即可調出應用,從而簡化編程。
(2)子程序的結構
O××××; 子程序號
… 子程序內容
M99; 子程序結束,從子程序返回到主程序,是子程序最后一個程序段
(3)調用子程序指令
調用子程序的指令是:M98 P×××× ××××;
地址“P”后的前1~4位數字為子程序重復調用次數,省略時默認為調用一次。后四位數字(必須4位)為子程序號。即:

例如:調用子程序指令:
M98 P61020; 調用1020號子程序,重復調用6次(執行6次)
M98 P1020; 調用1020號子程序,調用1次(執行1次)
M98 P5001020; 調用1020號子程序,重復調用500次(執行500次)
允許重復調用子程序最多999次。為與自動編程系統兼容,在子程序中的第1個程序段順序號——“N××××”,可以用來替代地址“O”后的子程序號,即用子程序中的第1個程序段的順序號作為子程序號。
主程序調用子程序的執行順序如圖3?1所示。

圖3?1 主程序調用子程序的執行順序
子程序可以由主程序調用,被調用的子程序也可以調用另一個子程序,稱為子程序嵌套。被主程序調用的子程序稱為一級子程序,被一級子程序調用的子程序稱為二級子程序,以此類推。子程序調用,可以嵌套4級,如圖3?2所示。

圖3?2 子程序嵌套
(4)從子程序返回
M99是子程序結束指令,該指令使執行順序從子程序返回到主程序中調用子程序段之后的程序段,該指令可以不作為獨立的程序段編寫,例如:“G00 X100.0 Y100.0 M99;”。
(5)只使用子程序
調試子程序時,希望能夠單獨運行子程序,用MDI檢索到子程序的開頭,就可以單獨執行子程序。此時如果執行包含M99的程序段,則返回到子程序的開頭重復執行;如果執行包含“M99 Pn”的程序段,則返回到在子程序中順序號為n的程序段重復執行。要結束這個程序,必須插入包含“/M02”?或“/M30”的程序段,并且把任選程序段開關設為斷開(OFF),如圖3?3所示。

圖3?3 單獨運行子程序
3.1.2 用戶宏程序
宏程序是數控系統廠家面向客戶提供的二次開發工具,是數控機床編程的最高級手工方式,合理有效地利用這個工具將極大地提升機床的加工能力。
普通程序中指令和數據均為常量,一個程序只能描述一個幾何形狀,普通程序不允許使用變量,程序只能按程序段排列的順序運行。用戶宏程序中允許使用常量、變量、算術、邏輯運算和條件轉移,所以宏程序能夠控制程序運行的流向,實現程序段運行次序的轉移和循環功能。宏程序與子程序類似,可以被任一個數控程序調用。編制相同加工操作的程序時,可將相同加工操作編為通用程序,如型腔加工宏程序、固定加工循環宏程序等,加工程序中需要該類加工時只需用一條指令調出用戶宏程序,和調用子程序完全一樣,如圖3?4所示。

圖3?4 加工程序中調用宏程序
用戶宏程序分為A、B兩類。通常情況下,FANUC 0D系統采用A類宏程序,而FANUC 0i系統則采用B類宏程序。A類宏程序功能不直觀,可讀性差,在實際工作中很少使用。由于絕大部分FANUC系統支持B類宏程序,所以,本書以B類宏程序為基礎,闡述宏程序知識與應用。
3.1.3 常量、變量
普通程序中指令和數據均為常量,即用數值指定G代碼和移動距離,例如程序段:
G00 X150.0;
使用變量的宏程序編寫該程序段:
N10 #1=150.0; #1是一個變量
N20 G00 X[#1]; #1是一個變量
上述程序中,#1是變量,N20程序段中用變量代替了常量(距離150mm),實際上變量還可以代替刀補號、G指令編號等數據。用戶宏程序中數據可以用常量直接指定,也允許用變量指定。變量值可用程序賦值,或通過MDI面板上的操作改變變量的值。變量的使用給程序的設計帶來了極大的靈活性。
(1)變量的表示形式
宏程序中,用“#”號后面緊跟1~4位數字表示一個變量,如#1,#50,#101是變量。其中“#”號是變量符號,數字是變量號。
變量號可以用表達式指定,此時表達式必須放在括號中,例如變量:#[#1+#2-12],其中:

使用變量前,變量必須帶有正確的值。如下述宏程序:
#1=25; 使#1為25
G01 X[#1]; 表示G01 X25
#1=110; 運行過程中可以隨時改變#1的值
G01 X[#1]; 表示G01 X110
(2)變量類型
變量根據變量號可以分成以下四種類型。
① 空變量。#0為空變量,該變量總為空,不能賦值。
② 局部變量。編號#1~#33的變量為局部變量,局部變量的作用范圍是當前程序(在同一個程序號內),如果在主程序或不同子程序里,出現了相同名稱(編號)的局部變量,它們不會相互干擾,值也可以不同。系統斷電后,局部變量數據初始化為空。舉例如下。
O100;
N10 #3=30; 主程序中變量#3為30
M98 P101; 進入子程序后變量#3不受影響
#4=#3; #3仍為30,所以#4=30
M30;
O101;
#4=#3; 這里的#3不是主程序中的#3,所以#3=0(沒定義),則:#4=0
#3=18; 這里使#3的值為18,不會影響主程序中的#3
M99;
③ 公共變量。#100~#199、#500~#999為公共變量。公共變量在不同的宏程序中意義相同,作用范圍是整個零件程序,即不管是主程序還是子程序,只要名稱(編號)相同就是同一個變量,帶有相同的值,在某個地方修改它的值,所有其他地方都受影響。當斷電時,變量#100~#199被初始化為空,變量#500~#999的數據不會丟失。例:
O1100; 主程序號
N10 #120=30; 使#120為30
M98 P101; 進入子程序(注:在子程序O101中#120為18)
#4=#120; 由子程序O101返回,#120變為18,所以此時#4=18
M30; 程序結束
O101; 子程序號
#4=#120; #120的值在子程序里也有效,所以#4=30
#120=18; 這里使#120=18,然后返回
M99; 子程序結束
④ 系統變量。#1000以上的變量為系統變量,系統變量用于讀和寫CNC運行時的各種數據,如刀具的當前位置和補償值等。系統變量是數控系統內部定義好了的,用戶不可以改變它們的用途。系統變量是全局變量,使用時可以直接調用。
(3)變量的引用
① 為了在程序中使用變量,必須在程序中指定變量號的地址,給變量賦值。沒指定的變量地址為無效變量。
② 當用表達式指定變量時,必須把表達式放在括號中。例如“G01 X[#1+#2] F#3”。
③ 被引用變量的值根據地址最小設定單位自動地舍入。例如指令“G00 X#1”,X地址最小設定單位為1/1000mm,當CNC把“12.3456”賦值給變量#1,實際指令值為“G00 X12.346”。
④ 改變引用變量值的符號,要把負號“?”放在“#”的前面。例如“G00 X?#1”。
⑤ 當引用未指定的變量時變量及地址字都被忽略,或稱沒指定的變量為空變量。
例如,當變量#1的值是0,并且變量#2的值是空時,“G00 X#1 Y#2”的執行結果為“G00 X0”。
注意“變量的值是0”和“變量的值是空”是不同的,“變量的值是0”是指把0賦值給某變量,所以該變量的值等于數值0,而“變量的值是空”指該變量所對應的地址不存在,是無效的變量。
(4)變量值的精度
變量值的精度為8位十進制數。
例如,用賦值語句#1=9876543210123.456時,實際上#1=9876543200000.000。
用賦值語句#2=9876543277777.456時,實際上#1=9876543300000.000。
(5)賦值
把常數或表達式的值送給一個宏變量稱為賦值,賦值號為:“=”。
格式:宏變量 = 常數或表達式。例如:
#2 =SQRT[2]?*COS[55 *PI/180 ]
#3 = 124.0
#50 =?#3+12
賦值號后面的表達式里可以包含變量自身,如:#1=#1+4,該表達式是把#1的值與4相加,結果賦給#1。這不是數學中的方程或等式,如果#1的值是2,執行#1 = #1+4后,#1的值變為6。
(6)變量限制
程序號、順序號和任選程序段跳轉號不能使用變量,例如在以下方式中不可使用變量:
O#1
/#2 G00 X100.0
N#3 Z200.0
3.1.4 變量的算術和函數運算
(1)算術運算符
變量算術運算符:“+”“-”“*”“/”。
(2)函數
宏程序中的變量可以進行函數運算,函數運算符:SIN(正弦)、COS(余弦)、TAN(正切)、ATAN(反正切-π/2~π/2)、ABS(絕對值)、INT(取整)、SIGN(取符號)、SQRT(開方)、EXP(指數)。
(3)表達式
用運算符連接起來的常數、宏變量構成表達式。例如:
175/SQRT[2]?*COS[55 *PI/180];
#3 *6 GT 14;
表達式中用方括號表示運算順序。宏程序中不用圓括號,規定圓括號中的內容是注釋。
(4)運算符的優先級
運算符優先級順序依次為:方括號→函數→乘除→加減→條件→邏輯。
宏程序中的變量可以進行算術運算和函數運算,如表3?1所示。
表3?1 算術與函數運算功能


3.1.5 宏程序語句和NC語句
下面的程序段為宏程序語句。
?包含算術或邏輯運算(=)的程序段。
?包含控制語句(例如:GOTO,DO,END)的程序段。
?包含宏程序調用指令(例如:用G65,G66,G67或其他G代碼、M代碼調用宏程序)的程序段。
除了宏程序語句以外的任何程序段都為NC語句。
3.1.6 轉移和循環
(1)條件運算符
條件運算符用在程序流程控制IF和WHILE的條件表達式中,作為判斷兩個表達式大小關系的連接符。條件運算符:

注: EQ—equal;NE—not equal;GT—greater than;GE—greater than or equal;LT—less than;LE—less than or equal。
(2)邏輯運算符
在IF或WHILE語句中,如果有多個條件,用邏輯運算符來連接多個條件。邏輯運算符:
AND (且):多個條件同時成立才成立;
OR(或):多個條件只要有一個成立即可;
NOT(非):取反(如果不是)。
例如:
#1 LT 50 AND?#1 GT 20 表示:[#1<50]且[#1>20]
#3 EQ 8 OR?#4 LE 10 表示:[#3=8]或者[#4≤10]
有多個邏輯運算符時,可以用方括號來表示結合順序,如:
NOT[#1 LT 50 AND?#1GT 20] 表示:如果不是“#1<50 且?#1>20”
(3)轉移和循環
數控程序一般按程序段排列的先后順序運行,稱為順序程序結構,在宏程序中使用GOTO語句和IF語句,可以控制程序運行的流向,實現程序段運行次序的轉移和循環功能,稱為分支程序結構和循環程序結構。有三種轉移和循環指令,即:
① GOTO語句。無條件轉移。
② IF語句。條件轉移,“IF…THEN…”。
③ WHILE語句。循環語句,當…時循環。
(4)無條件轉移(GOTO)
格式:GOTOn;
n為順序號(1~9999)。
轉移到標有順序號n的程序段,當指定1~9999以外的順序號時,出現P/S報警NO.128。
例如:GOTO6;
…
語句組:N6 G00 X100;
執行GOTO6語句時,轉去執行標號為N6的程序段。
可用表達式指定順序號,例如:GOTO?#10。
(5)條件轉移(IF)
格式:IF[關系表達式]?GOTOn;
例如,“IF[#1 GT 210]?GOTO2;”。
…
語句組:N2 G00 G91 X10.0;
…
解釋:如果變量#1的值大于20,轉移執行標號為N2的程序段,否則按順序執行GOTO2下面的語句組,如圖3?5所示。

圖3?5 “IF[關系表達式] GOTOn”語句
(6)條件轉移(IF…THEN…)
格式:IF[條件表達式]?THEN (注:THEN后只能跟一個語句)
如果條件表達式滿足,執行預先定義的宏程序語句,只執行一個宏程序語句。
例如,“IF[#1 EQ?#2]?THEN?#3=0;”。
當#1的值等于#2的值時,將0賦給變量#3。
例3?1:編宏程序,計算自然數1到10的累加總和,宏程序如下。
O6000; 宏程序名
#1=0; 存儲和數變量的初值
#2=1; 被加數變量的初值
N1 IF[#2 GT 10]?GOTO2; 當被加數大于10時轉移到N2
#1=#1+#2; 計算累加和數(該語句為累加器)
#2=#2+1; 下一個被加數(該語句為計數器)
GOTO1; 轉到標號N1段
N2 M30; 程序結束
(7)循環(WHILE)
格式:WHILE[關系表達式]?DOm;(m=1,2,3)
循環區語句組;
END?m;
在WHILE 后指定一個條件表達式,當指定條件滿足時,執行從DO 到END之間的程序,否則轉去執行END后面的程序段,如圖3?6所示。DO后的m和END后的m,是指定程序執行范圍的標號,m標號值為1、2、3,m若用1、2、3 以外的值會產生P/S報警NO.126。

圖3?6 WHILE語句執行順序
例如宏程序:
#1=5;
WHILE[#1 LE 30]?DO1;
#1=#1+5;
G00 X#1 Y#1;
END1;
M99;
上述宏程序含義:當變量#1的值小于等于30時,執行循環程序,當#1大于30時結束循環返回主程序。
例3?2:用WHILE語句編宏程序,計算自然數1~10的累加總和。
宏程序如下。
O3000; 宏程序名
#1=0; 存儲和數變量的初值
#2=1; 被加數變量的初值
WHILE[#2 LE 10]?DO1; 當被加數小于10時執行循環區程序
#1=#1+#2; 計算累加和數(該語句稱為累加器)
#2=#2+1; 下一個被加數(該語句稱為計數器)
END1; 循環區終止
M30; 程序結束
3.1.7 宏程序調用
調用宏程序的方法有:非模態調用(G65);模態調用(G66、G67);用G代碼調用宏程序;用M代碼調用宏程序;用M代碼調用子程序;用T代碼調用子程序。為減輕讀者負擔,本書只推薦非模態調用(G65)。
(1)宏程序非模態調用G65
① 調用指令格式:
G65 P(p)?L(l)?(自變量賦值);
其中,p為調用的程序號;l為重復次數;自變量賦值為傳遞到宏程序的數據。
宏程序與子程序相同,一個宏程序可被另一個宏程序調用,最多嵌套4層。
G65指令調用以地址P 指定的用戶宏程序,數據自變量能傳遞到用戶宏程序體中,調用過程如圖3?7所示。

圖3?7 宏程序非模態調用G65執行過程
② 宏程序的開始與返回。宏程序的編寫格式與子程序相同。其格式為:
O0010;(0001~8999為宏程序號) 程序名
N10…; 程序指令
…
N30 M99; 宏程序結束
宏程序以程序號開始,以M99結束。
(2)G65指令說明
① 在G65之后用地址P指定用戶宏程序的程序號。
② 當要求重復時,在地址L后指定從1~9999 的重復次數,省略L值時認為L等于1。
③ 使用自變量指定,其值被賦值到相應的局部變量。
(3)自變量指定
可用兩種形式的自變量指定。自變量指定Ⅰ使用除了G、L、O、N和P 以外的字母,每個字母指定一次,自變量指定Ⅱ使用A、B、C和Ii、Ji和Ki,其下標i=1~10,系統根據使用的字母自動決定自變量指定的類型。
① 自變量指定Ⅰ。表3?2為自變量指定Ⅰ的自變量與變量的對應關系。
a.自變量指定Ⅰ中,G、L、O、N、P不能用,地址I、J、K必須按順序使用,其他地址順序無要求。
舉例:G65 P3000 L2 B4 A5 D6 J7 K8; 正確(J、K符合順序要求)
在宏程序中將會把4賦給#2,把5賦給#1,把6賦給#7,把7賦給#5,把8賦給#6。
舉例:G65 P3000 L2 B3 A4 D5 K6 J5; 不正確(J、K不符合順序要求)
b.需要指定的地址可以省略,對應于省略地址的局部變量設為空。
c.不需要按字母順序指定,但應符合字地址的格式。但是I、J和K需要按字母順序指定。
表3?2 自變量指定Ⅰ的變量對應關系

② 自變量指定Ⅱ。表3?3為自變量指定Ⅱ的自變量與變量的對應關系。自變量指定Ⅱ中使用A、B、C各1次,使用I、J、K各10次。自變量指定Ⅱ用于傳遞諸如三維坐標值的變量。
表3?3 自變量指定Ⅱ的變量對應關系

注:表中I、J 、K的下標用于確定自變量指定的順序,在實際編程中不寫。
③ 自變量指定Ⅰ、Ⅱ的混合。系統能夠自動識別自變量指定Ⅰ和自變量指定Ⅱ,并賦給宏程序中相應的變量號。如果自變量指定Ⅰ和自變量指定Ⅱ混合使用,則后指定的自變量類型有效。

說明:I4.0為自變量指定Ⅱ,D為自變量指定Ⅰ,數值4.0和5.0都賦值給變量#7,但后者有效,所以變量#7中為5.0,而不是4.0。
④ 小數點的位置。一個不帶小數點的數據在數據傳遞時,其單位按其地址對應的最小精度解釋,因此,不帶小數點的數據,其值在傳遞時有可能根據機床的系統參數設置而被更改。應養成在宏調用參數中使用小數點的好習慣,以保持程序的兼容性。