❶ 誰來指導下宏程序怎麼用
C語言宏中"#"和"##"的用法
在查看linux內核源碼的過程中,遇到了許多宏,這裡面有許多都涉及到"#"和"##",因此,在網上搜索了一些資料,整理如下:
一、一般用法
我們使用#把宏參數變為一個字元串,用##把兩個宏參數貼合在一起.
用法:
#include<cstdio>
#include<climits>
using namespace std;
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
int main()
{
printf(STR(vck)); // 輸出字元串"vck"
printf("%d\n", CONS(2,3)); // 2e3 輸出:2000
return 0;
}
二、當宏參數是另一個宏的時候
需要注意的是凡宏定義里有用'#'或'##'的地方宏參數是不會再展開.
1, 非'#'和'##'的情況
#define TOW (2)
#define MUL(a,b) (a*b)
printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW));
這行的宏會被展開為:
printf("%d*%d=%d\n", (2), (2), ((2)*(2)));
MUL里的參數TOW會被展開為(2).
2, 當有'#'或'##'的時候
#define A (2)
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
printf("int max: %s\n", STR(INT_MAX)); // INT_MAX #include<climits>
這行會被展開為:
printf("int max: %s\n", "INT_MAX");
printf("%s\n", CONS(A, A)); // compile error
這一行則是:
printf("%s\n", int(AeA));
INT_MAX和A都不會再被展開, 然而解決這個問題的方法很簡單. 加多一層中間轉換宏.
加這層宏的用意是把所有宏的參數在這層里全部展開, 那麼在轉換宏里的那一個宏(_STR)就能得到正確的宏
參數.
#define A (2)
#define _STR(s) #s
#define STR(s) _STR(s) // 轉換宏
#define _CONS(a,b) int(a##e##b)
#define CONS(a,b) _CONS(a,b) // 轉換宏
printf("int max: %s\n", STR(INT_MAX)); // INT_MAX,int型的最大值,為一個變數 #include<climits>
輸出為: int max: 0x7fffffff
STR(INT_MAX) --> _STR(0x7fffffff) 然後再轉換成字元串;
printf("%d\n", CONS(A, A));
輸出為:200
CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2))
三、'#'和'##'的一些應用特例
1、合並匿名變數名
#define ___ANONYMOUS1(type, var, line) type var##line
#define __ANONYMOUS0(type, line) ___ANONYMOUS1(type, _anonymous, line)
#define ANONYMOUS(type) __ANONYMOUS0(type, __LINE__)
例:ANONYMOUS(static int); 即: static int _anonymous70; 70表示該行行號;
第一層:ANONYMOUS(static int); --> __ANONYMOUS0(static int, __LINE__);
第二層: --> ___ANONYMOUS1(static int, _anonymous, 70);
第三層: --> static int _anonymous70;
即每次只能解開當前層的宏,所以__LINE__在第二層才能被解開;
2、填充結構
#define FILL(a) {a, #a}
enum IDD{OPEN, CLOSE};
typedef struct MSG{
IDD id;
const char * msg;
}MSG;
MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};
相當於:
MSG _msg[] = {{OPEN, "OPEN"},
{CLOSE, "CLOSE"}};
3、記錄文件名
#define _GET_FILE_NAME(f) #f
#define GET_FILE_NAME(f) _GET_FILE_NAME(f)
static char FILE_NAME[] = GET_FILE_NAME(__FILE__);
4、得到一個數值類型所對應的字元串緩沖大小
#define _TYPE_BUF_SIZE(type) sizeof #type
#define TYPE_BUF_SIZE(type) _TYPE_BUF_SIZE(type)
char buf[TYPE_BUF_SIZE(INT_MAX)];
--> char buf[_TYPE_BUF_SIZE(0x7fffffff)];
--> char buf[sizeof "0x7fffffff"];
這里相當於:
char buf[11];
【alps_008】:
基本看了一遍,樓主的情況屬於一般用法:
「#把宏參數變為一個字元串,用##把兩個宏參數貼合在一起」
#include<stdio.h>
#include<string.h>
#define STRCPY(a,b) strcpy(a##_p,#b) //把第一個參數後邊加上字元_p,把第二個參數變成字元串
int main()
{
char var1_p[20];
char var2_p[30];
strcpy(var1_p,"aaaa");
strcpy(var2_p,"bbbb");
STRCPY(var1,var2); //等於strcpy(var1_p,"var2");
STRCPY(var2,var1); //等於strcpy(var2_p,"var1");
printf("%s\n",var1_p);
printf("%s\n",var2_p);
return 0;
}
【jeffer007】:
Token-Pasting Operator (##)
// preprocessor_token_pasting.cpp
#include <stdio.h>
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
int main()
{
paster(9);
}
Output
token9 = 9
Stringizing Operator (#)
// stringizer.cpp
#include <stdio.h>
#define stringer( x ) printf( #x "\n" )
int main() {
stringer( In quotes in the printf function call );
stringer( "In quotes when printed to the screen" );
stringer( "This: \" prints an escaped double quote" );
}
Output
In quotes in the printf function call
"In quotes when printed to the screen"
"This: \" prints an escaped double quote"
❷ 數控車床宏程序怎麼寫最好帶步驟解說
數控車床宏程序是非常靈活且因情況而異的,所以數控車床宏程序編程掌握以下參數即可:
普通加工程序直接用數值指定G代碼和移動距離;例如,GO1和X100.0。使用用戶宏程序時,數值可以直接指定或用變數指定。當用變數時,變數值可用程序或用MDI面板上的操作改變。
例如:#1=#2+100;G01X#1F300。
量的表示:計算機允許使用變數名,用戶宏程序不行。變數用變數符號(#)和後面的變數號指定。例如:#1,表達式可以用於指定變數號。
此時,表達式必須封閉在括弧中。例如:#[#1+#2-12]。
變數根據變數號可以分成四種類型:#0空變數,該變數總是空,沒有值能賦給該變數。#1-#33局部變數,局部變數只能用在宏程序中存儲數據,例如,運算結果。當斷電時,局部變數被初始化為空。調用宏程序時,自變數對局部變數賦值。
#100-#199、#500-#999公共變數,公共變數在不同的宏程序中的意義相同。當斷電時,變數#100-#199初始化為空。變數#500-#999的數據保存,即使斷電也不丟失。#1000---系統變數。系統變數用於讀和寫CNC運行時各種數據的變化,例如,刀具的當前位置,補償值。
局部變數和公共變數可以有0值或下面范圍中的值:-1047到-10-29或-10-2到-1047,如果計算結果超出有效范圍,則發出P/S報警NO.111。
當在程序中定義變數值時,小數點可以省略。例:當定義#1=123;變數#1的實際值是123.000。
為在程序中使用變數值,指定後跟變數號的地址。當用表達式指定變數時,要把表達式放在括弧中。例如:G01X[#1+#2]F#3;
被引用變數的值根據地址的最小設定單位自動地舍入。例如:當G00X#/;以1/1000mm的單位執行時,CNC把123456賦值給變數#1,實際指令值為G00X12346.改變引用變數的值的符號,要把負號(-)放在#的前面。
例如:G00X-#1當引用未定義的變數時,變數及地址都被忽略。例如:當變數#1的值是0,並且變數#2的值是空時,G00X#1Y#2的執行結果為G00X0。
(2)宏程序怎麼看點滴積累擴展閱讀:
數控宏程序編程是用變數的方式進行數控編程的方法,數控宏程序分為A類和B類宏程序,其中A類宏程序比較老,編寫起來也比較費時費力,B類宏程序類似於C語言的編程,編寫起來也很方便。
不論是A類還B類宏程序,它們運行的效果都是一樣的。
編寫一些大批相似零件的時候,可以用宏程序編寫,這樣只需要改動幾個數據就可以了,沒有必要進行大量重復編程。
❸ 學習數控車床宏程序、應該從哪開始啊、有什麼方法可以看懂宏程序的
數控加工工藝編程與操作?!!!!!樓上這位仁史還沒出道吧,朋友學的是什麼系統哦,法拉克還是西門子……?編程是互通的,其思維模式很相近,如果你是想學一般的基礎的,那你直接把系統的編程手冊拿到學就是了,那是從最基本的東西開始的,別小看,那是最重要的,我開始是一直做的是西門子的加工中心,所以在西門子系統方面更熟悉一點,也很喜歡那種編程方式,比法拉克舒服多了,法拉克也會,因為現在大部分的職稱考試都以法拉克為准,建議你復印一份系統的編程手冊(我就是這樣,全冊我都學完了,還註上了自己的例子和心得體會,這樣學習效果最好),如果你自己家裡有電腦隨時可坐在電腦前,那你就在官網上下載,這是能找到了,只是要知道你加工床子的系統編號! 如果你是想提升,給你推薦一本書,絕對的經典!好像叫數控宏程序提升與訓練,是以法拉克為範本寫的,是廣州的一個幾屆數控大賽冠軍寫的,裡面全是中高級的宏程序編制方法技巧和思維方式,相當不錯,他說任何一個好的宏程序編出來都不會超過64行!其實中高級最講究的是技巧,優化,和簡單,你在學習中會感受到美感和藝術性的,真的,就像高手玩C++一樣,沒有熟悉的底子和思維模式是不行的,努力加油,祝你好運!~所以如果你做好准備想提升了,就去附近最大的書店淘一兩本好書來提升吧!記住一句話:後處理再發達,始終也無法取代手工編程,各有各的優勢,其實平時大多的程序只要不是四軸或以上的,大部分可以可以通過手工宏程序來解決
❹ 法蘭克加工中心宏程序編程怎麼學,有沒有詳細教程
方法和詳細的操作步驟如下:
1、第一步,在MDI模式下,按SET鍵,在屏幕上輸入1,然後打開參數開關,見下圖,轉到下面的步驟。
❺ 我想學數控編程的宏程序求怎麼入門先學什麼
從確定走刀路線、選擇合適的G命令等細節出發,分析在數控車削中程序的編制方法。
准備一:分析零件圖樣
分析形狀和位置公差要求:對於數控切削加工中,零件的形狀和位置誤差主要受機床機械運動副精度的影響。在車削中,如沿Z坐標軸運動的方向與其主軸軸線不平形時,則無法保證圓柱度這一形狀公差要求;又如沿X坐標軸運動的方向與其主軸軸線不垂直時,則無法保證垂直度這一位置公差要求。因此,進行編程前要考慮進行技術處理的有關方案。
准備二:合理確定走刀路線,並使其最短
確定走刀路線的工作是加工程序編制的重點,由於精加工切削程序走刀路線基本上都是沿其零件輪廓順序進行的,因此主要內容是確定粗加工及空行程的走刀路線。走刀路線泛指刀具從對刀點開始運動起,直到返回該點並結束加工程序所經過的路徑。
准備三:合理調用G命令使程序段最少
按照每個單獨的幾何要素(即直線、斜線和圓弧等)分別編制出相應的加工程序,其構成加工程序的各條程序即程序段。在加工程序的編制工作中,總是希望以最少的程序段數即可實現對零件的加工,以使程序簡潔,減少出錯的幾率及提高編程工作的效率。
准備四:合理安排「回零」路線
在編制較復雜輪廓的加工程序時,為使其計算過程盡量簡化,既不易出錯,又便於校核,編程者有時將每一刀加工完後的刀具終點通過執行「回零」指令(即返回對刀點),使其全返回對刀點位置,然後在執行後續程序。
總結:數控車床的編程總原則是先粗後精、先進後遠、先內後外、程序段最少、走刀路線最短,這就要求我們在編程時,特別注意理論聯系實際,並在大量的實踐中,對所學的知識進行驗證或修正,做到編制的程序最實用。
❻ CNC宏程序 求指教。
1、首先加工一個長半軸30,短半軸20一個橢圓,橢圓不是圓弧,所以不能用圓弧的方式來加橢圓,這里用一小段一小段的直線來拼接這個橢圓。
❼ FANUC宏程序怎麼運用的哪個能教教我,詳細點阿
大家都在問宏程序~其實說起來宏就是用公式來加工零件的,比如說橢圓,如果沒有宏的話,我們要
逐點算出曲線上的點,然後慢慢來用直線逼近,如果是個光潔度要求很高的工件的話,那麼需要計算
很多的點,可是應用了宏後,我們把橢圓公式輸入到系統中然後我們給出Z坐標並且每次加10um
那麼宏就會自動算出X坐標並且進行切削,實際上宏在程序中主要起到的是運算作用..
宏一般分為A類宏和B類宏.A類宏是以G65 Hxx P#xx Q#xx R#xx的格式輸入的,而B類宏程序則是
以直接的公式和語言輸入的和C語言很相似在0i系統中應用比較廣.由於現在B類宏程序的大量使
用很多書都進行了介紹這里我就不再重復了,但在一些老系統中,比如法蘭克OTD系統中由於它的
MDI鍵盤上沒有公式符號,連最簡單的等於號都沒有,為此如果應用B類宏程序的話就只能在計算機
上編好再通過RSN-32介面傳輸的數控系統中,可是如果我們沒有PC機和RSN-32電纜的話怎麼辦
呢,那麼只有通過A類宏程序來進行宏程序編制了,下面我介紹一下A類宏的引用;
A類宏是用G65 Hxx P#xx Q#xx R#xx或G65 Hxx P#xx Qxx Rxx格式輸入的xx的意思就是數值,
是以um級的量輸入的,比如你輸入100那就是0.1MM~~~~~.#xx就是變數號,關於變數號是什麼意
思再不知道的的話我也就沒治了,不過還是教一下吧,變數號就是把數值代入到一個固定的地址中,
固定的地址就是變數,一般OTD系統中有#0~~~#100~#149~~~#500~#531關閉電源時變
量#100~#149被初始化成「空」,而變數#500~#531保持數據.我們如果說#100=30那麼現在#100
地址內的數據就是30了,就是這么簡單.好現在我來說一下H代碼,大家可以看到A類宏的標准格式中
#xx和xx都是數值,而G65表示使用A類宏,那麼這個H就是要表示各個數值和變數號內的數值或者
各個變數號內的數值與其他變數號內的數值之間要進行一個什麼運算,可以說你了解了H代碼A類
宏程序你基本就可以應用了,好,現在說一下H代碼的各個含義:
以下都以#100和#101和#102,及數值10和20做為例子,應用的時候別把他們當格式就行,
基本指令:
H01賦值;格式:G65H01P#101Q#102:把#102內的數值賦予到#101中
G65H01P#101Q#10:把10賦予到#101中
H02加指令;格式G65 H02 P#101 Q#102 R#103,把#102的數值加上#103的數值賦予#101
G65 H02 P#101 Q#102 R10
G65 H02 P#101 Q10 R#103
G65 H02 P#101 Q10 R20
上面4個都是加指令的格式都是把Q後面的數值或變數號內的數值加上R後面的數
值或變數號內的數值然後等於到P後面的變數號中.
H03減指令;格式G65 H03 P#101 Q#102 R#103,把#102的數值減去#103的數值賦予#101
G65 H03 P#101 Q#102 R10
G65 H03 P#101 Q10 R#103
G65 H03 P#101 Q20 R10
上面4個都是減指令的格式都是把Q後面的數值或變數號內的數值減去R後面的數
值或變數號內的數值然後等於到P後面的變數號中.
H04乘指令;格式G65 H04 P#101 Q#102 R#103,把#102的數值乘上#103的數值賦予#101
G65 H04 P#101 Q#102 R10
G65 H04 P#101 Q10 R#103
G65 H04 P#101 Q20 R10
上面4個都是乘指令的格式都是把Q後面的數值或變數號內的數值乘上R後面的數
值或變數號內的數值然後等於到P後面的變數號中.
H05除指令;格式G65 H05P#101 Q#102 R#103,把#102的數值除以#103的數值賦予#101
G65 H05 P#101 Q#102 R10
G65 H05 P#101 Q10 R#103
G65 H05 P#101 Q20 R10
上面4個都是除指令格式都是把Q後面的數值或變數號內的數值除以R後面的數
值或變數號內的數值然後等於到P後面的變數號中.(余數不存,除數如果為0的話會出現112報警)
三角函數指令:
H31 SIN正玄函數指令:格式G65 H31 P#101 Q#102 R#103;含義Q後面的#102是三角形的斜邊R
後面的#103內存的是角度.結果是#101=#102*SIN#103,也就是說可以直接用這個求出三角形的另
一條邊長.和以前的指令一樣Q和R後面也可以直接寫數值.
H32 COS余玄函數指令:格式G65 H32 #101 Q#102 R#103;含義Q後面的#102是三角形的斜邊
R後面的#103內存的是角度.結果是#101=#102*COS#103,也就是說可以直接用這個求出三角形的
另一條邊長.和以前的指令一樣Q和R後面也可以直接寫數值.
H33和H34本來應該是TAN 和ATAN的可是經過我使用得數並不準確,希望有知道的人能夠告訴我
是為什麼?
開平方根指令:
H21;格式G65 H21 P#101 Q#102 ;意思是把#102內的數值開了平方根然後存到#101中(這個指令
是非常重要的如果在車橢圓的時候沒有開平方跟的指令是沒可能用宏做到的.
無條件轉移指令:
H80;格式:G65 H80 P10 ;直接跳到第10程序段
有條件轉移指令:
H81 H82 H83 H84 H85 H86 ,分別是等於就轉的H81;不等於就轉的H82;小於就轉
的H83;大於就轉的H84;小於等於就轉的H85;大於等於就轉的H86;
格式:G65 H8x P10 Q#101 R#102;將#101內的數值和#102內的數值相比較,按上面的H8x的碼帶
入H8x中去,如果條件符合就跳到第10程序段,如果不符合就繼續執行下面的程序段.
❽ 什麼是宏程序,怎麼去編輯
宏程序
是一個快捷鍵的功能
現在使用最多的是
網路游戲的!
一般都是
游戲技能較多
編輯一個快捷鍵可以實現釋放多個技能
游戲里都會有說明的!
對於游戲的宏鍵編輯是根據游戲的不同使用的命令也是不同的
我只玩過FF11
的宏鍵
其他的我不知道
比方說
要用一個魔法
先確定你要使用哪個鍵位
在那個鍵位上編輯
然後是編輯
命令
1.鎖定怪物
2.使用技能欄里頭的
電魔法
一般都是這樣的
只是命令需要到游戲里查找
每個游戲的都不一樣的!
也可以編輯很多
可以連續釋放多少個
就只需要輸入
3等待多時秒
4使用技能欄里頭的
什麼魔法
❾ 有誰能幫助詳細介紹一下數控車的宏程序編程方法、要點、及注意問題
那要看車削什麼類型的工件了,如果車削橢圓。拋物線,雙曲線的話就把公式代入宏程序就行了,我認為你可以看一下C語言編程,C語言編程與宏程序有相同之處。只要你看出來我們編寫普通程序有一個共同的特點時你就會寫宏程序了,自己慢慢體會。祝你成功!