巨集模式
from https://www.ai-sols.co.jp/special/200/
1. マクロの概要と種類
1-1. はじめに
最近はCAD/CAMシステムの普及率が高く、CAD/CAMを持っているからマクロなんて不要! 対話があるからマクロなんて不要!「#」が付いているNCプログラムなんて、わからない!と、意外とマクロ機能は避けられがちです。しかし、加工されているワークにもよりますが、意外と同じ形状で寸法違いってありませんか? これこそ、マクロの出番です!「#」も良く見れば#に数字がくっついているだけです。
マクロ機能が難しいのでは無くて、マクロ機能を利用して何かを
処理する内容によって難易度が変わります。まずは簡単な処理を
するマクロを作成してみて下さい。マクロ機能が意外と簡単で便利
であることが分かって頂けると思います。この「マクロのいろは」が
お役に立てれば幸いです。
1-2. マクロの概要
マクロ機能は、
・変数
・演算指令
・条件分岐
などがあります。
基本的にマクロは数値を扱うための機能で、通常、プログラムを作成するために使っているGコードやMコードと組み合わせて使います。
制御機によってマクロの呼び出し命令、変数名の付け方、システム変数、演算結果、などが異なりますので、お使いの制御機のマニュアルをご参照下さい。
1-3. マクロの種類
1. カスタムマクロ
NCプログラムと混在し、NCプログラムから呼び出して実行します。NCプログラムと独立して動作することは出来ません。
殆どの制御機で利用可能です。
2. リアルタイムマクロ
NCプログラム内にリアルタイムマクロ指令を記述しますが、
NCプログラムと独立して動作しますので、マクロプログラムの条件によって実行を開始します。
従いまして、NCプログラムを実行中に、リアルタイムマクロも同時実行できます。
2. 変数について ①
2-1. 変数
前述でマクロは数値を扱うと表現しましたのはこの変数にあります。
通常、NCプログラムはGコードと移動座標を数値で表します。
例えば、早送りでX50.相対的に移動する命令はG91G00X50.;と指令します。
これを、変数を用いて指令しますと以下のようになります。
※ 変数へ数値を代入する場合、小数点以下が無ければ小数点を省略できます。
このように変数は数値を格納し、数値の変わりに使うことが出来ます。
更に #1=#1+50 とすることで、変数 #1 に 50 を加算することも出来ます。
2-2. 変数の記述方法
直接番号を記述する
演算命令を使って変数の数字を指令する
2-3. 変数の精度と範囲
マクロ変数の有効桁数は、一般的に10進8桁の小数点以下3桁と10進9桁の小数点以下4桁があります。これ以上の数値を扱える制御機もありますが、あまりにも大き過ぎるデータを代入しますと演算誤差が生じ、判定ミス、若しくはアラームになりますのでご注意下さい。
3. 変数について ②
3-1. 変数の種類
変数には変数の番号により、ローカル変数、コモン変数、システム変数に分かれます。
システム変数には読み取り専用のモノ、書き込み専用のモノが存在するなど、それぞれ用途、特性がことなります。また、一部の変数は電源をオフにしても、数値を保持する変数もあります。
1, ローカル変数(#1~#33)
プログラム内で有効な数値を保持する変数をローカル変数と言います。
同じ変数であってもプログラムが異なる(例えばプログラムO1の#1と、プログラムO2の#1)場合、変数はそれぞれ別の意味を持つことが出来ます。
また、ローカル変数はマクロを呼出す際に数値を渡すことにも使われます。
例えば、G65P1000A100.B50.C70.;と命令しますと、O1000のマクロを呼出すと
同時にO1000プログラムの#1にアドレスAの値、#2にアドレスBの値、#3にアドレスC
の値が渡されます。このG65に続く数値を引数と言い、アドレスとローカル変数の番号が決まっています。
ローカル変数としては#1~#33まで使えますが、引数指定できるアドレスには制限がありますので、ご注意下さい。
2, コモン変数(#100~#199、#500~#999)
一つのプログラム内で有効なローカル変数に対し、コモン変数はすべてのプログラムにおいて共通です。 よって、O1プログラムで#100に代入した値をO2で参照することが出来ます。
制御機によりすべて利用する場合はオプションが必要ですので、使用する変数番号が利用可能であるかを事前に調べておいて下さい。
(#550~#999までがオプションとなっている場合があります。)
コモン変数はプロテクトを掛けるために読取り専用にすることも出来ます。
(制御機により出来ない場合もあります。)
#100~#199は電源をオフにしますと消去されますが、#500~#999は電源をオフにしても数値を保持しておりますので、使用目的に合わせて変数番号を決めるようにして下
アドレス(引数)とローカル変数番号の対応表を以下に示します
利用の可否 | 引数 | ローカル変数番号 | 利用の可否 | 引数 | ローカル変数番号 |
○ | A | #1 | × | N | #14 |
○ | B | #2 | × | O | #15 |
○ | C | #3 | × | P | #16 |
○ | D | #7 | ○ | Q | #17 |
○ | E | #8 | ○ | R | #18 |
○ | F | #9 | ○ | S | #19 |
× | G | #10 | ○ | T | #20 |
○ | H | #11 | ○ | U | #21 |
○ | I | #4 | ○ | V | #22 |
○ | J | #5 | ○ | W | #23 |
○ | K | #6 | ○ | X | #24 |
× | L | #12 | ○ | Y | #25 |
○ | M | #13 | ○ | Z | #26 |
3-2. 未定義変数と変数の引用
システムの状況の取得、そして取得するためにシステムへ情報を渡すための数値をセット(代入)するなど、使用用途が決まっている変数です。
例えば、現在使用している工具径補正番号を取得し、補正値を書き換える場合など、システムの情報を必要とする処理を実行する際に利用します。
この変数は制御機によって番号が異なりますので、お持ちのマニュアルをご参照下さい。
3-3. 代入する際の小数点の扱い
変数に数値を代入する際、小数点を付けなかった場合は、最後に小数点を付けた数値とみなされます。 但し、オフセット番号などに変数を用いた場合には、小数点が省かれた状態になります。
4. 分岐と繰り返し ①
Xプログラムの流れ(処理順序)を制御(変更)することができる指令です。 指令には以下の3種類があります。・無条件分岐 ・条件分岐 ・繰り返し
※これらの機能はメモリ運転の場合に限り有効です。 もし、DNC運転など外部からデータを取り込みながらの運転では、利用することが出来ません。
1, .無条件分岐 「 GOTO n 」(n:シーケンス番号)
GOTOの後に続く番号にシーケンス番号を指令しますと、プログラム内の指令されたシーケンス番号へ無条件にジャンプします。
2, 条件分岐 「 IF [ 条件式 ] GOTO n 」 (n:シーケンス番号)
件式が成立した(真)場合、GOTOの後に続く指定されたシーケンス番号へジャンプします。
条件式は下記のとおりです
演算子 | 意味 | |
---|---|---|
#1 EQ #2 | = | #1と#2が等しい |
#1 NE #2 | ≠ | #1と#2が等しくない |
#1 GT #2 | > | #1が#2より大きい |
#1 GE #2 | ≧ | #1が#2以上 |
#1 LT #2 | < | #1が#2より小さい |
#1 LE #2 | ≦ | #1が#2以下。 |
※空の変数であるかを判定する場合は、#0変数を利用します
※ 制御機により IF [条件式] THEN {マクロ文} という指令が使えます。
この場合は条件式が成立した(真)場合、THENに続く後のマクロ文を実行します。
5. 分岐と繰り返し ②
3, .繰り返し「WHILE [条件式] DO n ・・・ END n 」 (n:WHILE文の識別番号)
条件式が成立している間、DOに続く番号と同じ番号を持つEND 番号の間のプログラムを実行します。 WHILE [条件式] DO n ・・・ END nは、必ずペアで使います。
多重指定も可能ですが、指令文間にまたがるような記述は出来ません。
識別番号は、実行した後であればもう一度、同じ番号が使えます。
※ 識別番号、多重数は制御機により指定できる番号に制限がありますので、
お使いの制御機のマニュアルを参照下さい。
6. 演算指令
変数間で種々の演算を行なうことが出来ます。演算指令は通常の算術式のように記述します。
#i = < 式 >
< 式 >は、定数、変数、関数または、演算子による結合です。
下記にある#j,#k変数の代わりに定数を使用することも出来ます。 また、前述にもありましたが、小数点の無い値は末尾に小数点があるものとみなされます。
演算で注意すべき点は、角度の単位、計算結果の数値の丸め、演算の優先順位などです。また、2引数のATAN演算指令を持つ制御機の場合も制御機により解が異なりますので、注意が必要です。
ATAN演算指令から返される解のチェックを事前にされることをお勧めします。 チェックするにはコモン変数へ解を代入するようにします。
返される解が、-180~180であるか、0~360であるかを調べます。
もし、希望される数値で無かった場合、パラメータで変更できないかを調べ、変更可能であれば変更します。 出来ない場合はNCプログラムに判定する処理を追加し、対応します。
演算の種類 | 演算指令 | 意味 |
---|---|---|
定義、置換 | #i = #j | 変数の定義、または置換 |
加法形演算 | #i = #j+#k #i = #i – #k #i = #j OR #k #i = #j XOR #k | 加算 減算 論理和(32ビットの各ビット毎) 排他的論理和(32ビットの各ビット毎 |
乗法形演算 | #i = #j * #k #i = #j / #k #i = #j AND #k #i = #j MOD #k | 乗算 除算 論理積(32ビットの各ビット毎 余り(#j,#kは整数に丸めてから余りを求めます。 #jが負の場合、#iも負になります。) |
関数 | #i = SIN[#j] #i = COS[#j] #i = TAN[#j] #i = ASIN[#j] #i = ACOS[#j] #i = ATAN[#j] #i = ATAN[#j]/[#k] #i = ATAN[#j,#k] #i = SQRT[#j] #i = ABS[#j] #i = BIN[#j] #i = BCD[#j] #i = ROUND[#j] #i = FIX[#j] #i = FUP[#j] #i = LN[#j] #i = EXP[#j] #i = POW[#j] #i = ADP[#j] | 正弦(単位:DEG) 余弦(単位:DEG) 正接(単位:DEG 逆正弦 逆余弦 逆正接(1引数)、ATNでも可。※1 逆正接(2引数)、ATNでも可。※2 同上※2 平方根、SQRでも可。 絶対値 BCDからBINARY変換 BINARYからBCD変換 四捨五入、RNDでも可 少数点以下切捨て 小数点以下切上げ 自然対数 e (2.718…)を底とする指数。 べき乗(#jの#k乗)※2 少数点付加※2 |
※1 制御機によって計算結果、記述方法が異なります。
※2 制御機によってこの指令は使えません。
7. マクロ呼び出し
7-1. マクロ呼び出し
制御機の種類によってGコードが異なる場合がありますが、一部の制御機の除き、命令の種類、フォーマットは殆ど同じです。 以下の呼出し指令があり、指令方法により実行方法が異なります。 またMDIモードからも呼出すことが出来ます。
1, 単純呼び出し命令(G65)
指令されたブロックのみ有効です。 NC文から呼び出され一度実行し、終了します。
2, モーダル呼出し[移動指令呼び出し](G66)
G66からG67の間に移動指令があるブロックに遭遇しますと、実行します。
移動指令では無いブロックでは実行しません。
3, モーダル呼出し[毎ブロック呼び出し](G66.1)
G66.1からG67の間の、1ブロックごとに実行します。
G66と違い1ブロックごとに実行します。
4, モーダル呼出しキャンセル(G67)
モーダル呼出しマクロモードをキャンセルする際に指令します。
モード中以外にG67を指令しますと、アラームになりますので注意が必要です。
5, Gコードマクロ呼び出し
制御機により利用可能Gコード番号は異なりますが、G65P□□□□、G66P□□□□、G66.1P□□□□の変わりにGコードによりマクロ呼出しを指令することができます。
7-2. マクロの多重呼び出し ①
呼出されたマクロプログラムから更にマクロプログラムを呼び出すことを多重呼出しと言います。
制御機にもよりますが、マクロの多重呼出しは単純呼び出しとモーダル呼出しを合わせて4重まで、若しくは5重までが一般的です。
多重呼出しは多重度とローカル変数に注意が必要です。
7-3. マクロの多重呼び出し ②
G65以外のGコード(小数点付きを含む)、Tコード、Sコード、Mコード、若しくは特定アドレスと番号により、サブプログラムの呼び出しが可能です。
(この指令を使うにはパラメータの設定が必要です。 パラメータの設定については御使いの制御機のマニュアルを参照下さい。)
この指令ではコードと呼出されるサブプログラム番号が1対1に対応付けられ、
Pのプログラム番号の指令は不要です。 但し、殆どの制御きで、
マクロ呼出し指令(G65~G67)と異なり、繰り返し指令を使うことが出来ません。
8. マクロのサンプル
サンプルマクロ
マクロ機能を知っていても、目的が無いとなかなかマクロを作成することがありません。
そこで、もっとマクロ機能を身近に感じて頂こうと思い、簡単なマクロサンプルを作成してみました。
※実機での動作確認はしておりますが、機種により仕様がことなりますので、お客様の責任においてご使用下さい。
マクロ機能の説明
4軸の横型マシニングで、ロータリー軸を持っている機械のロータリー軸角度が360度以上であった場合、原点復帰する際にゼロになるまで復帰動作を行います。
この動作を360度以内にまるめる処理をします。(但し、ロータリー軸が近回りの設定にされていない場合に限り有効なマクロです。)
また、引数を指定した場合はロータリー軸の原点復帰も行います。
現在の機械の状態を取得するためにシステム変数を利用します。
内容 | FANUC 18i以上では | MATRIX (MC系) では |
---|---|---|
現在の状態がG90 or G91 | #4003 | #4203 |
現在のロータリー軸角度 | #5044 | #5044 |
例題ではFANUC 18i以上の場合で説明します。
O9010 | (RESET ROTARY AX) |
---|---|
#29=#[4000+3] | (現在、G90かG91かをシステム変数から取得) |
#110=#[5040+4] | (現在、ロータリー軸のワーク座標系での位置を取得) |
#30=#110/360. | (ロータリー軸の角度が何回回転したかを求める) |
#30=FIX[#30] | (小数点以下を切り捨てした回転回数にまるめる) |
IF[ABS[#30] LT 1]GOTO 999 | (1回転以下なら処理をしないで終了) |
#111=#110-[#30*360] | (現在の位置を360度以内の角度に換算する) |
G90G92B#111 | (360度以内の角度になるようにロータリー角度を書替える) |
IF[#2 EQ #0]GOTO 901 | (マクロを呼出しで引数を指定していない場合は書替えで終了) |
G91G28B0 | (B0と引数指定していた場合は復帰) |
N901 | |
G#29 | (書替え処理でG90にしていたので、もとの状態に戻す) |
N999 | |
M99 | (プログラム復帰) |
※ このマクロではロータリー軸をBとしておりますが、機械によってもしくは回転軸によってアドレスがかわりますので、その場合はA、若しくはCなどに変更して下さい。
基本的に4軸目ですので、アドレスはそのままで使用可能だと思います。
アドレスを変更した際は引数も変更した方が分かり易いので、IF [#2 EQ #0]のところの、#2を、アドレスがAであれば#1に、アドレスがCであれば#3に変更して下さい。
今回のマクロではロータリー軸のアドレスを指定しているかのみを判定しておりますので、詳しく判定される場合はさらに判定(IF)命令を使って詳しく判定してみて下さい。
マクロの呼び出し方法
復帰動作をしない場合はG65P9010;
復帰する場合は呼出しの後に、ロータリー軸のアドレスを指定します。
G65P9010B0;
また、マクロをG65Pでは無く、GコードやMコードで呼出すことが出来ます。
例えばGコードで呼出したい場合(G192 、G192B0)
同じくFANUC 18i、30i, 31iの場合で説明します
パラメータ番号の書替えを可能になるようにセッティングパラメータを変更します。
次にGコードでマクロを呼べるようにパラメータ番号を設定します。
パラメータ№6050~6059とプログラム O9010~O9019が適応するようになっており、パラメータには、マクロを呼出すためのGコード番号をセットします。
例えば、G192を指令し、O9010マクロを呼出す場合、パラメータ№6050に192をセットします。
以上の設定により、今回のマクロをG192、若しくはG192B0で指令できるようになりました。
このようにすることで、他メーカーであっても、同じプログラムを使うことが出来るようにすることも可能になります。
今回はFANUC社製の制御機を具体的に説明致しましたが、他の制御機でも同機能が存在します。システム変数の番号、若しくはマクロの呼び出し指令を変更することで動作すると思います。
是非、マクロを使ってアイデアを一つの機能にしてみて下さい。 きっと、機械が更に便利だと、感じられると思います。
from https://kknews.cc/news/gg9q53y.html
數控系統用戶宏程序主要由以下四部分構成。
1.變量;
2.包含算術或邏輯運算(=)的程序段;
3.包含控制語句(例如:GOTO,DO,END)的程序段;
4.包含宏程序調用指令(G65,G66,G67或其他G代碼,M代碼調用宏程序)的程序段。
變量的種類
變量值可以分為空變量,局部變量,公共變量和系統變量,取決於變量號的不同。各種變量的用法和性質不同,一般我們在教學中用到的局部變量比較多。
原文網址:https://kknews.cc/news/gg9q53y.html
from https://beeway.pixnet.net/blog/post/24494655
在程式中可用GOTO語句和IF語句改變控制執行順序。分支和迴圈操作共有三種類型:
GOTO 語句——無條件分支(轉移)
IF語句——條件分支;if…,then…
WHILE語句—— 迴圈;while…
5.1無條件分支GOTO語句
控制轉移(分支)到順序號n所在位置。當順序號超出1~9999的範圍時,產生128號報警。順序號可用運算式指定。
格式:GOTO n;
n——(轉移到的程式段)順序號
例:GOTO1;
GOTO#10;
5.2 條件分支IF語句
在IF後指定一條件,當條件滿足時,轉移到順序號為n的程式段,不滿足則執行下一程式段。
格式:
IF [運算式] GOTOn;
處理;
Nn …;
1、條件運算式
條件運算式由兩變數或一變數一常數中間夾比較運算符組成,條件運算式必需包含在一對方括弧內。條件運算式可直接用變數代替。
2、比較運算符
比較運算符由兩個字母組成,用於比較兩個值,來判斷它們是相等,或一個值比另一個小或大。注意不能用不等號。
表5.2 比較運算符
運算符 含義
EQ 相等equal to (=)
NE 不等於not equal to (≠)
GT 大於Greater than (>)
GE 大於等於greater than or equal to(≥)
LT 小於less than (<)
LE 小於等於less than or equal to (≤)
3、常式
求1~10的和。
O9500;
#1=0; 和
#2=1; 加數
N1 IF[#2 GT 10] GOTO2; 相加條件
#1=#1+#2; 相加
#2=#2+1; 下一加數
GOTO1; 返回1
N2 M30; 結束
5.3 迴圈WHILE 語句
在WHILE 後指定一條件運算式,當條件滿足時,執行DO到END之間的程式,(然後返回到WHILE 重新判斷條件,)不滿足則執行END後的下一程式段。
格式:
WHILE [條件運算式] DO m; (m=1, 2, 3)
處理;
END m;
說明:
WHILE語句對條件的處理與IF 語句類似。
在DO和END後的數位是用於指定處理的範圍(稱循環體)的識別號,數字可用1、2、3表示。當使用1、2、3之外的數時,產生126號報警。
While的嵌套
對單重DO-END循環體來說,識別號(1~3)可隨意使用且可多次使用。但當程式中出現迴圈交叉(DO範圍重疊)時,產生124號報警。
1、識別號(1~3)可隨意使用且可多次使用
WHILE […] DO1;
Processing
END1;
…
WHILE […] DO1;
Processing
END1;
2、DO範圍不能重疊
WHILE […] DO1;
Processing
WHILE […] DO2;
…
END1;
Processing
END2;
3、DO循環體最大嵌套為三重
WHILE […] DO1;
…
WHILE […] DO2;
…
WHILE […]DO3;
Processing
END3;
…
END2;
…
END1;
4、控制不能跳轉到循環體外
WHILE […] DO1;
…
IF […] GOTO n;
…
END1;
Nn … ;
5、分支不能直接跳轉到循環體內
IF […] GOTO n;
…
WHLE […] DO1;
…
Nn … ;
…
END1;
限制Limitations
1、無限迴圈Infinite loops
當指定Do m而未指定WHILE語句時,將產生一個從DO到END為循環體的無限迴圈。
2、處理時間
當轉移到GOTO語句中指定順序號對應的程式段時,程式段根據順序號搜索。因此向回跳轉比向前跳轉要花費更多的處理時間。此時使用WHILE 語句迴圈可減少處理時間。
3、未定義變數
在條件運算式中使用EQ和NE判斷時,空值(null)和0會產生不同的結果,在其他類型的條件運算式中,空值(null)被認為是0。
常式
求1~10的和
O9501;
#1=0;
#2=1;
WHILE [#2 LE 10] DO1;
#1=#1+#2;
#2=#2+1;
END1;
M30;
from http://www.intek.com.tw/Relevant%20Document/manual/M84%20&%20M86%20&%20M86R/M84%20&%20M86%20&%20M86R_manual/User_ArithmeticAndLogicOperation.html
6.2.3 數學及邏輯運算
可利用變數來執行下表中的運算。算式中等號的右邊可為常數和(或)變數與運算子的組合。變數 #j 和 #k 亦可換成常數。等號左邊的變數則可被替換為算式。
功能 | 格式 | 說明 |
定義 | #i=#j | |
加減乘除/四則運算 (+、-、×、÷) | #i=#j+#k; #i=#j–#k; #i=#j*#k; #i=#j/#k; | |
三角函數運算 | #i=SIN[#j]; #i=ASIN[#j]; #i=COS[#j]; #i=ACOS[#j]; #i=TAN[#j]; #i=ATAN[#j]/[#k]; | 角度的單位為度,90 度又 30 分將表示為 90.5 度。 |
開平方 絕對值 四捨五入 無條件捨去 | #i=SQRT[#j]; #i=ABS[#j]; #i=ROUND[#j]; #i=FIX[#j]; | |
邏輯運算 (OR、XOR、AND) | #i=#j OR #k; #i=#j XOR #k; #i=#j AND #k; | 邏輯運算將以二進位數字的位元為單位去運算。 |
說明:
- 角度單位
三角函數(SIN、COS、ASIN、ACOS、TAN、ATAN)使用的角度單位為度,例如:90 度又 30 分以 90.5 度表示。
- 反正弦三角函數:ARCSIN #i = ASIN[#j];
| |
| |
|
- 反餘弦三角函數:ARCCOS #i = ACOS[#j];
| |
| |
|
- 反正切三角函數:ARCTAN #i = ATAN[#j]/[#k];
| |
[–1]; 時,#1 為 -135.0.0。 | |
|
- 四捨五入/取整數
|
例如:程式行 #1=ROUND[#2]; 中,若 #2 的計算結果值為 1.2345,則 #1 的計算結果將被四捨五入為 1.0。
|
例如:
假設要編寫一個鑽孔的加工程式,並讓該程式利用變數 #1 和 #2 的值去加工,然後再回到原始位置。若系統進給單位為 1/1000 mm,變數 #1 的值為 1.2346,變數 #2 的值為 2.3456,則:
G00 G91 X–#1 ;移動 1.235 mm
G01 X–#2 F300 ;移動 2.346 mm
G00 X[#1+#2] ;因 1.2345+2.3456=3.5801,故移動距離將為 3.580,且刀具將不會回到原始位置
此差異來自於相加的動作是在四捨五入前或後執行,如欲使刀具回到原始位置,則需要將指令寫為 G00X–[ROUND[#1]+ROUND[#2]]。
|
在控制器系統中,如果某數字的運算結果所產生整數的絕對值小於原始數字的絕對值,該運算即被視為無條件捨去至整數。例如:
設 #1=1.2 且 #2=–1.2,
當執行 #3=FIX[#1] 時,1.0 將被設入變數 #3,
當執行 #3=FIX[#2] 時,-1.0 將被設入變數 #3。
留言
張貼留言