2.算術運算和邏輯運算:①算術運算就是加減乘除(+-*/)。計算四則混合運算式時,先算乘除後算加減,如果有括號則先算括號裡的。例如1+2*(7-4)=7。通常計算機程式設計裡的括號用圓括號表示,但數控程式設計裡用方括號表示。數控程式設計裡的圓括號表示註釋(相當於組合語言的分號、basic裡的rem、pascal裡的{}或(*…*)、C語言裡的/*…*/。)②邏輯運算常見的有以下4種:與(and)、或(or)、非(not)、異或(xor)。與、或、非是基本邏輯運算,異或不是基本邏輯運算。A和B相異或的結果是AB+AB。“與”的運算規則是全1出1,有0出0,如1 and 1=1; 0 and 1=0;“或”的運算規則是全0出0,有1出1,如1 or 1=1; 0 or 1=1;“非”是單目運算子,即0變1,1變0。程式設計中的邏輯值(也叫布林值,即“真”和“假”)在計算機中用1和0表示,通常1表示“真”,0表示“假”。如果是兩個整數進行邏輯運算,則是這兩個數的二進位制的各位進行運算,例如5 and 6=4; 5 or 6=7。具體用法你可以回憶一下計算機程式設計中的用法,數控程式設計中也同樣使用。and、or、not、xor四種運算子分別相當於彙編、basic或pascal裡的and、or、not、xor;C語言裡的&、|、!、^。③數控程式設計中也可以使用取餘運算(mod),例如10 mod 3=1。mod相當於彙編、basic或pascal裡的mod、C語言的%。④數控程式設計中的比較運算子和組合語言(指Intel80x86組合語言)裡的相同,即EQ(等於)、NE(不等於)、LT(小於)、LE(小於等於)、GT(大於)、GE(大於等於)。相當於basic或pascal裡的=、<>、<、<=、>、>=,C語言裡的==、!=、<、<=、>、>=。
無條件轉移的格式是GOTO_。GOTO後面的數是要轉移到的程式行的標號(即N_)。如果無條件往回跳轉,則有可能造成死迴圈(即程式無法自然執行結束)。條件轉移的格式是IF[……]GOTO_或IF[……]THEN……。方括號內是一個邏輯值,通常使用一個判斷表示式表示。迴圈的格式是WHILE[條件表示式]DO m …… END m。DO m和END m之間的部分是迴圈體,m是一個整數,用於說明哪個END和哪個DO配對。m可重複使用,只有在迴圈巢狀時才需要改變m。在進行程式跳轉時,可由迴圈體內跳轉至迴圈體外,但不能迴圈體外跳轉至迴圈體內(各種程式語言均如此)。
學好宏程式其實不難,人家花巨資開發就是為了方便使用。下面我給你詳細說說它的各系統的不同之處和使用方法:
不同的系統有不同程式設計語法。西門子明顯與三菱、法那科、華中、哈斯等系統不同。但程式設計思想是相通的。你的這個問題太寬泛了,我先說說相同的地方吧(西門子除外):
1.變數:正如計算機程式設計中的變數一樣,數控程式中也需要使用變數。要進行程式流程控制,變數是必不可少的。數控程式設計中的變數用符號#跟一個整數表示。例如 #1就是一個變數。給變數賦值的方法和計算機程式設計一樣,如#1=5。(相當於basic或C語言的a=5,pascal的a:=5。)
數控程式設計中的變數按作用域可分為三類:區域性變數、全域性變數、系統變數。#1~#33是區域性變數,區域性變數只在本程式內起作用;#100~#199、#500~#599(現在很多系統都不止599了)是全域性變數,在所有程式中起作用;#1000以上的是系統變數,控制著機床執行的各種狀態,不要輕易修改。區域性變數不能在程式執行時再加以修改,只能由程式控制。在使用區域性變數時,必須在程式中賦初值。全域性變數可以程式執行時人為地加以修改。在使用全域性變數時,可以不在程式中賦初值,而在加工時打入所需值。補償量的本質是變數。
#0是空變數(相當於pascal的nil,C的NULL),不能給#0賦值。注意:空變數和0是不同的。正像在pascal裡定義一個指標型變數p,則如下兩句程式是不同的:p:=nil、p^:=0。(或者C語言裡的p=NULL、*p=0)當#1為0時,G1X100Y#1相當於G1X100Y0,而當#1為空時,G1X100Y#1相當於G1X100。當#1為0時,G#1X100相當於G0X100,而當#1為空時,G#1X100相當於X100。
表示變數的#號後面的數也可以是表示式或變數。例如,已知#1=5,#2=30,#3=25,#4=0,#5=80則#6=#[#1]相當於#6=80;#[3+4]=128相當於#7=128;#8=#[#4]相當於#8為空;#9=#[#2-#3]相當於#9=80;G#4X#2*#1Y#[#4]相當於G0X150。
變數可以自增或自減,變數經過運算後的值可以賦給自身。例如,當前#1=3;則執行#1=#1+1後#1的值是4。(相當於組合語言裡的INC AL;basic裡的i=i+1;pascal裡的inc(i);C語言裡的i++。)再如,當前#1=3,則執行#1=#1EQ3後,#1的值是1。
2.算術運算和邏輯運算:①算術運算就是加減乘除(+-*/)。計算四則混合運算式時,先算乘除後算加減,如果有括號則先算括號裡的。例如1+2*(7-4)=7。通常計算機程式設計裡的括號用圓括號表示,但數控程式設計裡用方括號表示。數控程式設計裡的圓括號表示註釋(相當於組合語言的分號、basic裡的rem、pascal裡的{}或(*…*)、C語言裡的/*…*/。)②邏輯運算常見的有以下4種:與(and)、或(or)、非(not)、異或(xor)。與、或、非是基本邏輯運算,異或不是基本邏輯運算。A和B相異或的結果是AB+AB。“與”的運算規則是全1出1,有0出0,如1 and 1=1; 0 and 1=0;“或”的運算規則是全0出0,有1出1,如1 or 1=1; 0 or 1=1;“非”是單目運算子,即0變1,1變0。程式設計中的邏輯值(也叫布林值,即“真”和“假”)在計算機中用1和0表示,通常1表示“真”,0表示“假”。如果是兩個整數進行邏輯運算,則是這兩個數的二進位制的各位進行運算,例如5 and 6=4; 5 or 6=7。具體用法你可以回憶一下計算機程式設計中的用法,數控程式設計中也同樣使用。and、or、not、xor四種運算子分別相當於彙編、basic或pascal裡的and、or、not、xor;C語言裡的&、|、!、^。③數控程式設計中也可以使用取餘運算(mod),例如10 mod 3=1。mod相當於彙編、basic或pascal裡的mod、C語言的%。④數控程式設計中的比較運算子和組合語言(指Intel80x86組合語言)裡的相同,即EQ(等於)、NE(不等於)、LT(小於)、LE(小於等於)、GT(大於)、GE(大於等於)。相當於basic或pascal裡的=、<>、<、<=、>、>=,C語言裡的==、!=、<、<=、>、>=。
3.常用數學函式:數控程式設計中用到的函式主要是數學函式。一般數控系統均提供下列函式:絕對值函式abs(x);平方根函式sqrt(x);三角函式sin(x);cos(x);tan(x) (單位是度,但華中是弧度);反三角函式asin(x);acos(x);atan(x);對數函式ln(x);指數函式exp(x);四捨五入取整函式round(x);截斷取整函式fix(x);進位取整函式fup(x);以及把8421BCD碼轉二進位制的函式bin(x) 和把二進位制轉8421BCD碼的函式bcd(x)。大多數數控系統要求函式名必須用大寫,括號則必須用方括號。例如G[#1GT30]X[50+2*ABS[#1]],當#1=20時相當於G0X90。
4.程式流程控制:程式流程可以進行無條件轉移、條件轉移、迴圈,還可以呼叫子程式或宏程式。
無條件轉移的格式是GOTO_。GOTO後面的數是要轉移到的程式行的標號(即N_)。如果無條件往回跳轉,則有可能造成死迴圈(即程式無法自然執行結束)。條件轉移的格式是IF[……]GOTO_或IF[……]THEN……。方括號內是一個邏輯值,通常使用一個判斷表示式表示。迴圈的格式是WHILE[條件表示式]DO m …… END m。DO m和END m之間的部分是迴圈體,m是一個整數,用於說明哪個END和哪個DO配對。m可重複使用,只有在迴圈巢狀時才需要改變m。在進行程式跳轉時,可由迴圈體內跳轉至迴圈體外,但不能迴圈體外跳轉至迴圈體內(各種程式語言均如此)。
宏程式(用G65呼叫或直接寫成G××)和子程式(用M98呼叫或直接寫成M××)主要有以下區別:
①宏程式可以傳遞引數,子程式不能傳遞引數。
②M98指令可以指定標號,故可以把子程式和主程式寫在一個程式中(因系統而異);G65指令不能指定標號,宏程式必須單獨寫成一個程式。
各系統還有自己的特點,如三菱可以寫G#1+#2,法那科必須寫成G[#1+#2];三菱可以寫IF[#1]GOTO1(想想C語言裡的if(a)...)法那科不行;西門子的變數是R1、R2,無條件轉移是gotof、gotob等,細節的差別太多了,你參考一下系統說明書。
宏程式可以定義成G程式碼(如G200,只要系統沒用到),用法和系統原帶的幾乎沒有區別。實際上系統原帶的G程式碼除了一些基本的(如G0~G4等)大都是用宏程式實現的,如G73~G89(孔加工)、M6(換刀)等。(我交待一句:你可以開啟它們的宏程式看看,但不要修改!)
我花很大工夫給你回帖,不知你覺得有用沒有。請問你是學生還是已經參加工作了?在什麼地方?你要是參加工作了,我可以再詳細說說怎麼編宏程式,其中涉及到程式設計思想、數學計算、系統變數、引數傳遞方法等等。我也願意多交流交流經驗。如果你是學生,我再多說恐怕你嫌太枯燥了。