官术网_书友最值得收藏!

第3章?子程序與宏程序

3.1 子程序與宏程序基礎(chǔ)

3.1.1 子程序

(1)子程序的概念

在一個(gè)加工程序中,若有幾個(gè)完全相同的部分程序(即一個(gè)零件中有幾處形狀相同,或刀具運(yùn)動(dòng)軌跡相同),可以把這部分程序單獨(dú)抽出,編成子程序存在存儲(chǔ)器中,需要使用時(shí)加工程序用一條簡單指令即可調(diào)出應(yīng)用,從而簡化編程。

(2)子程序的結(jié)構(gòu)

O××××;      子程序號

…  子程序內(nèi)容

M99;  子程序結(jié)束,從子程序返回到主程序,是子程序最后一個(gè)程序段

(3)調(diào)用子程序指令

調(diào)用子程序的指令是:M98 P×××× ××××;

地址“P”后的前1~4位數(shù)字為子程序重復(fù)調(diào)用次數(shù),省略時(shí)默認(rèn)為調(diào)用一次。后四位數(shù)字(必須4位)為子程序號。即:


例如:調(diào)用子程序指令:

M98 P61020;  調(diào)用1020號子程序,重復(fù)調(diào)用6次(執(zhí)行6次)

M98 P1020;  調(diào)用1020號子程序,調(diào)用1次(執(zhí)行1次)

M98 P5001020;  調(diào)用1020號子程序,重復(fù)調(diào)用500次(執(zhí)行500次)

允許重復(fù)調(diào)用子程序最多999次。為與自動(dòng)編程系統(tǒng)兼容,在子程序中的第1個(gè)程序段順序號——“N××××”,可以用來替代地址“O”后的子程序號,即用子程序中的第1個(gè)程序段的順序號作為子程序號。

主程序調(diào)用子程序的執(zhí)行順序如圖3?1所示。

圖3?1 主程序調(diào)用子程序的執(zhí)行順序

子程序可以由主程序調(diào)用,被調(diào)用的子程序也可以調(diào)用另一個(gè)子程序,稱為子程序嵌套。被主程序調(diào)用的子程序稱為一級子程序,被一級子程序調(diào)用的子程序稱為二級子程序,以此類推。子程序調(diào)用,可以嵌套4級,如圖3?2所示。

圖3?2 子程序嵌套

(4)從子程序返回

M99是子程序結(jié)束指令,該指令使執(zhí)行順序從子程序返回到主程序中調(diào)用子程序段之后的程序段,該指令可以不作為獨(dú)立的程序段編寫,例如:“G00 X100.0 Y100.0 M99;”。

(5)只使用子程序

調(diào)試子程序時(shí),希望能夠單獨(dú)運(yùn)行子程序,用MDI檢索到子程序的開頭,就可以單獨(dú)執(zhí)行子程序。此時(shí)如果執(zhí)行包含M99的程序段,則返回到子程序的開頭重復(fù)執(zhí)行;如果執(zhí)行包含“M99 Pn”的程序段,則返回到在子程序中順序號為n的程序段重復(fù)執(zhí)行。要結(jié)束這個(gè)程序,必須插入包含“/M02”?或“/M30”的程序段,并且把任選程序段開關(guān)設(shè)為斷開(OFF),如圖3?3所示。

圖3?3 單獨(dú)運(yùn)行子程序

3.1.2 用戶宏程序

宏程序是數(shù)控系統(tǒng)廠家面向客戶提供的二次開發(fā)工具,是數(shù)控機(jī)床編程的最高級手工方式,合理有效地利用這個(gè)工具將極大地提升機(jī)床的加工能力。

普通程序中指令和數(shù)據(jù)均為常量,一個(gè)程序只能描述一個(gè)幾何形狀,普通程序不允許使用變量,程序只能按程序段排列的順序運(yùn)行。用戶宏程序中允許使用常量、變量、算術(shù)、邏輯運(yùn)算和條件轉(zhuǎn)移,所以宏程序能夠控制程序運(yùn)行的流向,實(shí)現(xiàn)程序段運(yùn)行次序的轉(zhuǎn)移和循環(huán)功能。宏程序與子程序類似,可以被任一個(gè)數(shù)控程序調(diào)用。編制相同加工操作的程序時(shí),可將相同加工操作編為通用程序,如型腔加工宏程序、固定加工循環(huán)宏程序等,加工程序中需要該類加工時(shí)只需用一條指令調(diào)出用戶宏程序,和調(diào)用子程序完全一樣,如圖3?4所示。

圖3?4 加工程序中調(diào)用宏程序

用戶宏程序分為A、B兩類。通常情況下,FANUC 0D系統(tǒng)采用A類宏程序,而FANUC 0i系統(tǒng)則采用B類宏程序。A類宏程序功能不直觀,可讀性差,在實(shí)際工作中很少使用。由于絕大部分FANUC系統(tǒng)支持B類宏程序,所以,本書以B類宏程序?yàn)榛A(chǔ),闡述宏程序知識與應(yīng)用。

3.1.3 常量、變量

普通程序中指令和數(shù)據(jù)均為常量,即用數(shù)值指定G代碼和移動(dòng)距離,例如程序段:

G00 X150.0;

使用變量的宏程序編寫該程序段:

N10 #1=150.0;  #1是一個(gè)變量

N20 G00 X[#1];  #1是一個(gè)變量

上述程序中,#1是變量,N20程序段中用變量代替了常量(距離150mm),實(shí)際上變量還可以代替刀補(bǔ)號、G指令編號等數(shù)據(jù)。用戶宏程序中數(shù)據(jù)可以用常量直接指定,也允許用變量指定。變量值可用程序賦值,或通過MDI面板上的操作改變變量的值。變量的使用給程序的設(shè)計(jì)帶來了極大的靈活性。

(1)變量的表示形式

宏程序中,用“#”號后面緊跟1~4位數(shù)字表示一個(gè)變量,如#1,#50,#101是變量。其中“#”號是變量符號,數(shù)字是變量號。

變量號可以用表達(dá)式指定,此時(shí)表達(dá)式必須放在括號中,例如變量:#[#1+#2-12],其中:


使用變量前,變量必須帶有正確的值。如下述宏程序:

#1=25;  使#1為25

G01 X[#1];  表示G01 X25

#1=110;  運(yùn)行過程中可以隨時(shí)改變#1的值

G01 X[#1];  表示G01 X110

(2)變量類型

變量根據(jù)變量號可以分成以下四種類型。

① 空變量。#0為空變量,該變量總為空,不能賦值。

② 局部變量。編號#1~#33的變量為局部變量,局部變量的作用范圍是當(dāng)前程序(在同一個(gè)程序號內(nèi)),如果在主程序或不同子程序里,出現(xiàn)了相同名稱(編號)的局部變量,它們不會(huì)相互干擾,值也可以不同。系統(tǒng)斷電后,局部變量數(shù)據(jù)初始化為空。舉例如下。

O100;

N10 #3=30;  主程序中變量#3為30

M98 P101;  進(jìn)入子程序后變量#3不受影響

#4=#3;  #3仍為30,所以#4=30

M30;

O101;

#4=#3;  這里的#3不是主程序中的#3,所以#3=0(沒定義),則:#4=0

#3=18;  這里使#3的值為18,不會(huì)影響主程序中的#3

M99;

③ 公共變量。#100~#199、#500~#999為公共變量。公共變量在不同的宏程序中意義相同,作用范圍是整個(gè)零件程序,即不管是主程序還是子程序,只要名稱(編號)相同就是同一個(gè)變量,帶有相同的值,在某個(gè)地方修改它的值,所有其他地方都受影響。當(dāng)斷電時(shí),變量#100~#199被初始化為空,變量#500~#999的數(shù)據(jù)不會(huì)丟失。例:

O1100;  主程序號

N10 #120=30;  使#120為30

M98 P101;  進(jìn)入子程序(注:在子程序O101中#120為18)

#4=#120;  由子程序O101返回,#120變?yōu)?8,所以此時(shí)#4=18

M30;  程序結(jié)束

O101;  子程序號

#4=#120;  #120的值在子程序里也有效,所以#4=30

#120=18;  這里使#120=18,然后返回

M99;  子程序結(jié)束

④ 系統(tǒng)變量。#1000以上的變量為系統(tǒng)變量,系統(tǒng)變量用于讀和寫CNC運(yùn)行時(shí)的各種數(shù)據(jù),如刀具的當(dāng)前位置和補(bǔ)償值等。系統(tǒng)變量是數(shù)控系統(tǒng)內(nèi)部定義好了的,用戶不可以改變它們的用途。系統(tǒng)變量是全局變量,使用時(shí)可以直接調(diào)用。

(3)變量的引用

① 為了在程序中使用變量,必須在程序中指定變量號的地址,給變量賦值。沒指定的變量地址為無效變量。

② 當(dāng)用表達(dá)式指定變量時(shí),必須把表達(dá)式放在括號中。例如“G01 X[#1+#2] F#3”。

③ 被引用變量的值根據(jù)地址最小設(shè)定單位自動(dòng)地舍入。例如指令“G00 X#1”,X地址最小設(shè)定單位為1/1000mm,當(dāng)CNC把“12.3456”賦值給變量#1,實(shí)際指令值為“G00 X12.346”。

④ 改變引用變量值的符號,要把負(fù)號“?”放在“#”的前面。例如“G00 X?#1”。

⑤ 當(dāng)引用未指定的變量時(shí)變量及地址字都被忽略,或稱沒指定的變量為空變量。

例如,當(dāng)變量#1的值是0,并且變量#2的值是空時(shí),“G00 X#1 Y#2”的執(zhí)行結(jié)果為“G00 X0”。

注意“變量的值是0”和“變量的值是空”是不同的,“變量的值是0”是指把0賦值給某變量,所以該變量的值等于數(shù)值0,而“變量的值是空”指該變量所對應(yīng)的地址不存在,是無效的變量。

(4)變量值的精度

變量值的精度為8位十進(jìn)制數(shù)。

例如,用賦值語句#1=9876543210123.456時(shí),實(shí)際上#1=9876543200000.000。

用賦值語句#2=9876543277777.456時(shí),實(shí)際上#1=9876543300000.000。

(5)賦值

把常數(shù)或表達(dá)式的值送給一個(gè)宏變量稱為賦值,賦值號為:“=”。

格式:宏變量 = 常數(shù)或表達(dá)式。例如:

#2 =SQRT[2]?*COS[55 *PI/180 ]

#3 = 124.0

#50 =?#3+12

賦值號后面的表達(dá)式里可以包含變量自身,如:#1=#1+4,該表達(dá)式是把#1的值與4相加,結(jié)果賦給#1。這不是數(shù)學(xué)中的方程或等式,如果#1的值是2,執(zhí)行#1 = #1+4后,#1的值變?yōu)?。

(6)變量限制

程序號、順序號和任選程序段跳轉(zhuǎn)號不能使用變量,例如在以下方式中不可使用變量:

O#1

/#2 G00 X100.0

N#3 Z200.0

3.1.4 變量的算術(shù)和函數(shù)運(yùn)算

(1)算術(shù)運(yùn)算符

變量算術(shù)運(yùn)算符:“+”“-”“*”“/”。

(2)函數(shù)

宏程序中的變量可以進(jìn)行函數(shù)運(yùn)算,函數(shù)運(yùn)算符:SIN(正弦)、COS(余弦)、TAN(正切)、ATAN(反正切-π/2~π/2)、ABS(絕對值)、INT(取整)、SIGN(取符號)、SQRT(開方)、EXP(指數(shù))。

(3)表達(dá)式

用運(yùn)算符連接起來的常數(shù)、宏變量構(gòu)成表達(dá)式。例如:

175/SQRT[2]?*COS[55 *PI/180];

#3 *6 GT 14;

表達(dá)式中用方括號表示運(yùn)算順序。宏程序中不用圓括號,規(guī)定圓括號中的內(nèi)容是注釋。

(4)運(yùn)算符的優(yōu)先級

運(yùn)算符優(yōu)先級順序依次為:方括號→函數(shù)→乘除→加減→條件→邏輯。

宏程序中的變量可以進(jìn)行算術(shù)運(yùn)算和函數(shù)運(yùn)算,如表3?1所示。

表3?1 算術(shù)與函數(shù)運(yùn)算功能

3.1.5 宏程序語句和NC語句

下面的程序段為宏程序語句。

?包含算術(shù)或邏輯運(yùn)算(=)的程序段。

?包含控制語句(例如:GOTO,DO,END)的程序段。

?包含宏程序調(diào)用指令(例如:用G65,G66,G67或其他G代碼、M代碼調(diào)用宏程序)的程序段。

除了宏程序語句以外的任何程序段都為NC語句。

3.1.6 轉(zhuǎn)移和循環(huán)

(1)條件運(yùn)算符

條件運(yùn)算符用在程序流程控制IF和WHILE的條件表達(dá)式中,作為判斷兩個(gè)表達(dá)式大小關(guān)系的連接符。條件運(yùn)算符:


  注: EQ—equal;NE—not equal;GT—greater than;GE—greater than or equal;LT—less than;LE—less than or equal。

(2)邏輯運(yùn)算符

在IF或WHILE語句中,如果有多個(gè)條件,用邏輯運(yùn)算符來連接多個(gè)條件。邏輯運(yùn)算符:

AND (且):多個(gè)條件同時(shí)成立才成立;

OR(或):多個(gè)條件只要有一個(gè)成立即可;

NOT(非):取反(如果不是)。

例如:

#1 LT 50 AND?#1 GT 20   表示:[#1<50]且[#1>20]

#3 EQ 8 OR?#4 LE 10  表示:[#3=8]或者[#4≤10]

有多個(gè)邏輯運(yùn)算符時(shí),可以用方括號來表示結(jié)合順序,如:

NOT[#1 LT 50 AND?#1GT 20]  表示:如果不是“#1<50 且?#1>20”

(3)轉(zhuǎn)移和循環(huán)

數(shù)控程序一般按程序段排列的先后順序運(yùn)行,稱為順序程序結(jié)構(gòu),在宏程序中使用GOTO語句和IF語句,可以控制程序運(yùn)行的流向,實(shí)現(xiàn)程序段運(yùn)行次序的轉(zhuǎn)移和循環(huán)功能,稱為分支程序結(jié)構(gòu)和循環(huán)程序結(jié)構(gòu)。有三種轉(zhuǎn)移和循環(huán)指令,即:

① GOTO語句。無條件轉(zhuǎn)移。

② IF語句。條件轉(zhuǎn)移,“IF…THEN…”。

③ WHILE語句。循環(huán)語句,當(dāng)…時(shí)循環(huán)。

(4)無條件轉(zhuǎn)移(GOTO)

格式:GOTOn;

n為順序號(1~9999)。

轉(zhuǎn)移到標(biāo)有順序號n的程序段,當(dāng)指定1~9999以外的順序號時(shí),出現(xiàn)P/S報(bào)警NO.128。

例如:GOTO6;

語句組:N6 G00 X100;

執(zhí)行GOTO6語句時(shí),轉(zhuǎn)去執(zhí)行標(biāo)號為N6的程序段。

可用表達(dá)式指定順序號,例如:GOTO?#10。

(5)條件轉(zhuǎn)移(IF)

格式:IF[關(guān)系表達(dá)式]?GOTOn;

例如,“IF[#1 GT 210]?GOTO2;”。

語句組:N2 G00 G91 X10.0;

解釋:如果變量#1的值大于20,轉(zhuǎn)移執(zhí)行標(biāo)號為N2的程序段,否則按順序執(zhí)行GOTO2下面的語句組,如圖3?5所示。

圖3?5 “IF[關(guān)系表達(dá)式] GOTOn”語句

(6)條件轉(zhuǎn)移(IF…THEN…)

格式:IF[條件表達(dá)式]?THEN  (注:THEN后只能跟一個(gè)語句)

如果條件表達(dá)式滿足,執(zhí)行預(yù)先定義的宏程序語句,只執(zhí)行一個(gè)宏程序語句。

例如,“IF[#1 EQ?#2]?THEN?#3=0;”。

當(dāng)#1的值等于#2的值時(shí),將0賦給變量#3。

例3?1:編宏程序,計(jì)算自然數(shù)1到10的累加總和,宏程序如下。

O6000;  宏程序名

#1=0;  存儲(chǔ)和數(shù)變量的初值

#2=1;  被加數(shù)變量的初值

N1 IF[#2 GT 10]?GOTO2;  當(dāng)被加數(shù)大于10時(shí)轉(zhuǎn)移到N2

#1=#1+#2;  計(jì)算累加和數(shù)(該語句為累加器)

#2=#2+1;  下一個(gè)被加數(shù)(該語句為計(jì)數(shù)器)

GOTO1;  轉(zhuǎn)到標(biāo)號N1段

N2 M30;  程序結(jié)束

(7)循環(huán)(WHILE)

格式:WHILE[關(guān)系表達(dá)式]?DOm;(m=1,2,3)

循環(huán)區(qū)語句組;

END?m;

在WHILE 后指定一個(gè)條件表達(dá)式,當(dāng)指定條件滿足時(shí),執(zhí)行從DO 到END之間的程序,否則轉(zhuǎn)去執(zhí)行END后面的程序段,如圖3?6所示。DO后的m和END后的m,是指定程序執(zhí)行范圍的標(biāo)號,m標(biāo)號值為1、2、3,m若用1、2、3 以外的值會(huì)產(chǎn)生P/S報(bào)警NO.126。

圖3?6 WHILE語句執(zhí)行順序

例如宏程序:

#1=5;

WHILE[#1 LE 30]?DO1;

 #1=#1+5;

 G00 X#1 Y#1;

END1;

M99;

上述宏程序含義:當(dāng)變量#1的值小于等于30時(shí),執(zhí)行循環(huán)程序,當(dāng)#1大于30時(shí)結(jié)束循環(huán)返回主程序。

例3?2:用WHILE語句編宏程序,計(jì)算自然數(shù)1~10的累加總和。

宏程序如下。

O3000;  宏程序名

#1=0;  存儲(chǔ)和數(shù)變量的初值

#2=1;  被加數(shù)變量的初值

WHILE[#2 LE 10]?DO1;  當(dāng)被加數(shù)小于10時(shí)執(zhí)行循環(huán)區(qū)程序

#1=#1+#2;  計(jì)算累加和數(shù)(該語句稱為累加器)

#2=#2+1;  下一個(gè)被加數(shù)(該語句稱為計(jì)數(shù)器)

END1;  循環(huán)區(qū)終止

M30;  程序結(jié)束

3.1.7 宏程序調(diào)用

調(diào)用宏程序的方法有:非模態(tài)調(diào)用(G65);模態(tài)調(diào)用(G66、G67);用G代碼調(diào)用宏程序;用M代碼調(diào)用宏程序;用M代碼調(diào)用子程序;用T代碼調(diào)用子程序。為減輕讀者負(fù)擔(dān),本書只推薦非模態(tài)調(diào)用(G65)。

(1)宏程序非模態(tài)調(diào)用G65

① 調(diào)用指令格式:

G65 P(p)?L(l)?(自變量賦值);

其中,p為調(diào)用的程序號;l為重復(fù)次數(shù);自變量賦值為傳遞到宏程序的數(shù)據(jù)。

宏程序與子程序相同,一個(gè)宏程序可被另一個(gè)宏程序調(diào)用,最多嵌套4層。

G65指令調(diào)用以地址P 指定的用戶宏程序,數(shù)據(jù)自變量能傳遞到用戶宏程序體中,調(diào)用過程如圖3?7所示。

圖3?7 宏程序非模態(tài)調(diào)用G65執(zhí)行過程

② 宏程序的開始與返回。宏程序的編寫格式與子程序相同。其格式為:

O0010;(0001~8999為宏程序號)     程序名

N10…;     程序指令

N30 M99;     宏程序結(jié)束

宏程序以程序號開始,以M99結(jié)束。


(2)G65指令說明

① 在G65之后用地址P指定用戶宏程序的程序號。

② 當(dāng)要求重復(fù)時(shí),在地址L后指定從1~9999 的重復(fù)次數(shù),省略L值時(shí)認(rèn)為L等于1。

③ 使用自變量指定,其值被賦值到相應(yīng)的局部變量。

(3)自變量指定

可用兩種形式的自變量指定。自變量指定Ⅰ使用除了G、L、O、N和P 以外的字母,每個(gè)字母指定一次,自變量指定Ⅱ使用A、B、C和Ii、Ji和Ki,其下標(biāo)i=1~10,系統(tǒng)根據(jù)使用的字母自動(dòng)決定自變量指定的類型。

① 自變量指定Ⅰ。表3?2為自變量指定Ⅰ的自變量與變量的對應(yīng)關(guān)系。

a.自變量指定Ⅰ中,G、L、O、N、P不能用,地址I、J、K必須按順序使用,其他地址順序無要求。

舉例:G65 P3000 L2 B4 A5 D6 J7 K8;         正確(J、K符合順序要求)

在宏程序中將會(huì)把4賦給#2,把5賦給#1,把6賦給#7,把7賦給#5,把8賦給#6。

舉例:G65 P3000 L2 B3 A4 D5 K6 J5;         不正確(J、K不符合順序要求)

b.需要指定的地址可以省略,對應(yīng)于省略地址的局部變量設(shè)為空。

c.不需要按字母順序指定,但應(yīng)符合字地址的格式。但是I、J和K需要按字母順序指定。

表3?2 自變量指定Ⅰ的變量對應(yīng)關(guān)系

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

表3?3 自變量指定Ⅱ的變量對應(yīng)關(guān)系

  注:表中I、J 、K的下標(biāo)用于確定自變量指定的順序,在實(shí)際編程中不寫。

③ 自變量指定Ⅰ、Ⅱ的混合。系統(tǒng)能夠自動(dòng)識別自變量指定Ⅰ和自變量指定Ⅱ,并賦給宏程序中相應(yīng)的變量號。如果自變量指定Ⅰ和自變量指定Ⅱ混合使用,則后指定的自變量類型有效。


說明:I4.0為自變量指定Ⅱ,D為自變量指定Ⅰ,數(shù)值4.0和5.0都賦值給變量#7,但后者有效,所以變量#7中為5.0,而不是4.0。

④ 小數(shù)點(diǎn)的位置。一個(gè)不帶小數(shù)點(diǎn)的數(shù)據(jù)在數(shù)據(jù)傳遞時(shí),其單位按其地址對應(yīng)的最小精度解釋,因此,不帶小數(shù)點(diǎn)的數(shù)據(jù),其值在傳遞時(shí)有可能根據(jù)機(jī)床的系統(tǒng)參數(shù)設(shè)置而被更改。應(yīng)養(yǎng)成在宏調(diào)用參數(shù)中使用小數(shù)點(diǎn)的好習(xí)慣,以保持程序的兼容性。

主站蜘蛛池模板: 河北省| 海安县| 新沂市| 西丰县| 博白县| 连城县| 霍林郭勒市| 通许县| 饶河县| 盐边县| 广安市| 四会市| 宁强县| 聂荣县| 泰州市| 双江| 平顺县| 读书| 涞水县| 金坛市| 武陟县| 增城市| 商南县| 衢州市| 禹州市| 十堰市| 南投市| 清丰县| 平乡县| 宜黄县| 淮南市| 延吉市| 淮滨县| 石棉县| 鲁山县| 舒城县| 赤壁市| 南澳县| 饶阳县| 元阳县| 四会市|