マシニングセンターを使っている人ならNCのプログラムで加工すると思います。
でも、マクロは使ってない人は結構多い気がします。
今回はオークマ(OSP)のマクロプログラムを説明します。
- オークマのマクロを使ったことがない。
- 少しやったけど途中であきらめた。
- カスタムマクロを作りたい。
そんな人のお役に立てるよう書きました。
最後まで読むとマクロプログラムの基礎からカスタムマクロの作り方までが理解できるようになります。
オークマ(OSP)のNCプログラム入門編はこちら⇓
NCプログラム入門「オークマ(OSP)編」
NCプログラムの作り方-1【オークマ(OSP)編】
他のNCプログラムのマクロ
ファナックはこちら⇓
NCプログラムのマクロを説明(ファナック編)
トスナック(東芝)はこちら⇓
NCプログラムのマクロを説明【 トスナック(TOSNUC) 編 】
さて、普段仕事をしていると加工したことがあるプログラムを、編集して使うこともあると思いますが面倒な作業ですよね?
単純に1ヵ所ずつ編集したり、置換機能を使ったり・・・全部直して「OK」と思っても後で「あっ、直し忘れてた」なんてこと、よくありませんか?
マクロ機能を使うとプログラムを短くか、見やすく、計算も自動化できたりします。
もちろん何でも楽になるわけでありません。
しかし、例えば自分好みの穴加工用サイクルや、ポケット穴用のサイクルも作ることができます。手打ちでプログラミングしている人にはメリットが大きい機能です。
マクロは難しそうなイメージがありますが、簡単なマクロでも十分プログラミングの楽になります。
分厚い取説より簡単にまとめてます。この機会にぜひ目を通してみてください。
※掲載してあるプログラムを利用して不利益を負ったとしても、一切の責任を負いかねますのでご了承ください。
NCプログラムのマクロって?
NCプログラムのマクロを簡単に説明すると、仮の数字「変数」を使ったり、「演算」したり、条件により「分岐や繰返し」するのがマクロプログラムです。これらを表現するためマクロ文を使います。詳しく説明していきます。
簡単なマクロプログラム
まずは簡単なマクロプログラムを紹介します。
G0 G90 X0 Y0
PX=100
X=PX Y10
M30
プログラムの説明
- 最初に X0Y0 に移動します。
- 次に X100 Y10 に移動して終わりです。
このプログラムは変数を使っています。
詳しく説明します。
変数
変数にはローカル変数、コモン変数、システム変数、未定義変数の4つがあります。
ローカル変数
OSPのローカル変数は文字の組み合わせで無数に作ることができます。しかし、CALL や IF などニーモニックなどの予約語は使えません。
ローカル変数は4文字以内の英数字で作り、2つのタイプがあります。
- タイプ1 :「英字(O,N,V,Pを除く)」「英字」「英数字」「英数字」
- タイプ2 :「Pで始まる」「英字」「英数字」「英数字」
順番を守る必要があります。
- タイプ1の場合、定義されていないとアラームになります。
- 例 XX, YZ, ABC, XYZ1 など
- 例 XX, YZ, ABC, XYZ1 など
- タイプ2の最初の文字が「P」で始まる場合、定義されていないと未定義変数「EMPTY」となります。※未定義変数は後から説明します。
- 例 PX, PZ, PAC, PBD1 など
基本的にタイプ2のPで始まるローカル変数を使うことをお勧めします。
ローカル変数はメインプログラム、サブプログラムにそれぞれ個別に用意された変数でリセットやプログラムエンドで初期化されます。
サブプログラムの呼び出しで サブプログラム内の変数を定義することができます。
X軸の移動するマクロプログラムの例
O100 (MAIN)
PA=500.
G0 G90 X=PA
CALL O101 PA=600
X=PA
M30
O101 (SUB)
G0G90X=PA
RTS
上のプログラム例は次の順番で動きます。
- X500 (メインプログラムで PA には500が入っているため)
- X600 (サブプログラムO101の PA には600が入ってるため)
- X500 (メインプログラムの PA は500から変わってないため)
CALL O101 PA=600 でサブプログラム O101 のローカル変数 PA に数値を入れることできます。
コモン変数
コモン変数はあらかじめ用意されている変数名でVC1~VC200です。オプションによりVC1~VC100まで使えます。
コモン変数はメインプログラムとサブプログラム共通で1つか存在しない変数です。リセットや電源投入にデータを保存しておくか初期状態にするかはパラメータで決まります。
システム変数
システム変数は補正関係のデータやNCの状態などを扱うことができます。
登録してある工具径補正を読取りや書換え、有効なGコードやMコードを調べたりもできます。
システム変数は用途により決まっています。取説で確認してください。
未定義変数
未定義変数は中身がない「空」という意味で「EMPTY」であらわされます。
EMPTY に数値を代入することはできません。
変数の初期値は「空」です。変数を初期化したいときは VC1=EMPTY と入力します。
未定義変数の演算について
位置決め指令の座標値が未定義(空)の場合無視されます。
PA=EMPTY
G0 G90 X=PA Y100.
→G0 G90 Y100.と同じ
X=PA は無視されます。
未定義変数が演算された場合は 0 として扱われます。
PA=EMPTY
PB=PA+5
→ PB=5
PB=PA*5
→ PB=0
比較演算子の EQ と NE は EMPTY と 0 は異なる値として処理されます。
その他の比較演算子(GT, GE, LT, LE)は EMPTY と 0 は同じ値として処理されます。
演算
プログラム上で演算処理ができます。算術演算子、比較演算子、関数を説明します。
算術演算子
演算指令 | 意味 |
VC1 + VC2 | 加算(+ 足し算) |
VC1 – VC2 | 減算(- 引き算) |
VC1 * VC2 | 積算(× 掛け算) |
VC1 / VC2 | 除算(÷ 割り算) |
演算方法
- VC1=2 + 5 * 5
- → VC1 には 27 が入ります
変数の演算もできます。
- VC2 =3
- VC1 = VC2 * 5
- → VC1 には 15 が入ります。
計算の順番は数学と同じです。優先させたい場合は [ ] (角カッコ)を使います。
- VC1 = [ 2 + 5 ] * 5
- → VC1 には 35 が入ります
[ ]カッコを重ねることもできます。
- VC1 = [ [ 2 + 5 ] * 5 ] / 7
- → 35/7 = 5 で VC1 には 5 が入ります
電卓で 50 ÷ 0 を計算するとエラーになります。
✖ VC1=50 / 0
NCのプログラムでも同じように 0(ゼロ) で割る計算はアラームがでます。
0で割れない理由はこちら(外部リンクです)
比較演算子
比較演算子は IF(条件分岐) とセットで使われます。
2つの値を比較するときに使います。
演算指令 | 意味 |
VC1 EQ VC2 | = 等しい |
VC1 NE VC2 | ≠ 等しくない |
VC1 GT VC2 | > より大きい |
VC1 GE VC2 | ≧ 等しいかより大きい |
VC1 LT VC2 | < より小さい |
VC1 LE VC2 | ≦ 等しいかより小さい |
IF文については、下で詳しく説明します。ここでは比較演算子の使い方を確認してください。
VC1=-11
IF [ VC1 LT -10 ] GOTO N10
→ もし VC1 が -10 より小さいときは N10 へ分岐するという意味です。
関数
マクロプログラムでは関数を扱うこともできます。
関数 | 意味 |
SIN [ VC1 ] | 正弦 |
COS [ VC1 ] | 余弦 |
TAN [ VC1 ] | 正接 |
ASIN [ VC1 ] | 逆正弦 |
ACOS [ VC1 ] | 逆余弦 |
ATAN [ VC1 ] | 逆正接(1) 角度‐90°~90° |
ATAN2 [ VC1 , VC2 ] | 逆正接(2) 角度‐180°~180° |
SQRT [ VC1 ] | 平方根 |
ABS [ VC1 ] | 絶対値 |
BIN | BCD から BINARY 変換 |
BCD | BINARY から BCD 変換 |
ROUND [ VC1 ] | 整数化 四捨五入 (小数点第一位) |
FIX [ VC1 ] | 整数化 小数点以下切捨て |
FUP [ VC1 ] | 整数化 小数点以下切上げ |
DROUND [ VC1 ] | 単位整数化 小数点第4位以下を四捨五入(ミリ系) |
DFIX [ VC1 ] | 単位整数化 小数点第4位以下を切捨て(ミリ系) |
DFUP [ VC1 ] | 単位整数化 小数点第4位以下を切上げ(ミリ系) |
MOD [ VC1 , VC2 ] | 余り |
関数の使い方
VC2=30
VC1= SIN [ VC2 ]
VC1 に0.5が入ります。
分岐
NCのプログラムは上から順番に実行していきますが、任意の場所へ分岐させたり、条件により同じ処理を繰返すこともできます。無条件分岐、条件分岐を説明します。
GOTO(無条件分岐)
無条件分岐は「指定するシーケンス名へ行きなさい」という意味です。
GOTO N[シーケンス名]
プログラム例
GOTO N3 ←ここから
N1
N2
N3 ←ここへ
M30
GOTO 3 でシーケンス名 N3 のブロックに行きます。N1 N2 は飛ばされます。
GOTO より上のシーケンス番号でも構いません。
N1 … ←ここへ
N2 …
GOTO N1 ←ここから上のN1へ
シーケンス番号は重複しないよう注意してください。
IF文(条件分岐)
条件分岐は「もし、条件を満たしていれば、○○の処理をして、満たさなければ素通りしてください」という意味になります。
条件を満たすか判断するを条件式といい [ データ 比較演算子 データ] で表します。
2通りの入力方法があります。
- IF [ 条件式 ] GOTO N[シーケンス名]
- IF [ 条件式 ] N[シーケンス名]
2のようにGOTOは省略できます。
IF文の例
IF [ VC1 EQ 10 ] GOTO N101 または IF [ VC1 EQ 10 ] N101
→「もし VC1=10 の場合、N101へ行きなさい」という意味になります。
マクロプログラムの練習
マシニングセンターのプログラムは同じ工具経路を繰返すことが多くあります。今回は穴を円弧切削で加工するプログラムでマクロプログラムを作ります。
- 加工径 φ35の穴、深さ50
- 穴位置 X0 Y0
- 工具 φ20エンドミル
変数は3つ使います。固定サイクルの R, Q, Z と同じと思ってください。
- PR レファレンス点
- PQ 切込量
- PZ 最終加工高さ
プログラム | 説明 |
O1 (PROGRAM) | プログラム名 |
T1M6 (20ENDMILL) | 工具交換 φ20エンドミル |
G15 H1 | |
G0 G90 X0 Y0 | 穴位置 |
G56 Z100. H1 | |
S1000 M3 | |
PR=2.2 | レファレンス点 (初期値) |
PQ=2 | 切込み量 (増分値) |
PZ=-50 | 最終加工高さ (最終値) |
G0 Z=PR | |
N10 | 分岐用 シーケンス名 |
PR=PR-PQ | 加工高さの計算 |
IF [ PR GT PZ ] GOTO N11 | PRがPZより大きいとき |
PR=PZ | (PRがPZ以下のときの処理) |
N11 | |
G1 Z=PR F200 | 加工高さへ移動 |
Y7.5 | 円弧加工スタート位置へ移動 |
G3 J-7.5 | 円弧加工 |
G1 Y0 | 穴中心に戻る |
IF [ PR GT PZ ] GOTO N10 | PRがPZより大きい場合N10へ戻る |
G0 Z100M5 | |
M30 | |
プログラムの説明
PR にR点を設定しています。PR に切込み量を増やしていき、PZ を超えると IF文 で強制的にPR を PZに定義します。PR と PZ が等しい場合、 IF文をスルーしてプログラムエンドです。
加工高さは初回が 0.2 (2.2-2) で円弧加工を行い -1.8 , -3.8 ,と2㎜ずつ切込み、-47.8 , -49.8と続きPRが -51.8になると IF [ PR GT PZ ] GOTO N11 をスルーして次のプロックの PR=PZ を実行して -50 になります。PRとPZ が等しくなり IF文 を抜けます。
このように初期値(PR)に増分値(PQ)を加えて、最終値(PZ)になるまで繰返すようにします。
マクロプログラムをサブ化して複数使う
上のマクロプログラムでは毎回コピーして穴径などを変更して使わなければなりません。
そこで変更が必要な数値を変数にして、サブプログラムにします。
サブプログラムの呼び出し(CALL MODIN) で変数の定義をして使えば便利になります。
練習のマクロプログラムをベースに作ります。メインプログラムから変数を定義して、いろいろな穴径、深さに対応できるようにします。
サブプログラム呼び出し
CALL O500 PR=2.2 PQ=2 PZ=-50 PI=50 PJ=7.5 PF=200
CALLで呼び出すプログラム名の後にサブプログラムの変数を定義します。
※変数の間はスペースで区切ってください。またMODIN も同様の変数の使い方ができます。
(MAIN PROGRAM)
G15H1
G0 G90 X0 Y0
G56 Z100. H1
S1000 M3
CALL O500 PR=2.2 PQ=2 PZ=-50 PI=50 PJ=7.5 PF=200
M30
O500 (SUB ENKO)
(PR R TEN)
(PQ KIRIKOMI)
(PZ KAKOU TAKASA)
(PI NIGE TAKASA)
(PJ ENKO)
(PF OKURI)
IF [ PR EQ EMPTY ] GOTO N9999 ( R/ NOT SET)
IF [ PZ EQ EMPTY ] GOTO N9999 ( Z/ NOT SET)
IF [ PI EQ EMPTY ] GOTO N9999 ( I/ NOT SET)
IF [ PJ EQ EMPTY ] GOTO N9999 ( J/ NOT SET)
IF [ PJ LE 0 ] GOTO N9999 ( J/ LE 0)
IF [ PR LE PZ ] GOTO N9999 ( R LE Z ERROR)
IF [ PI LT PR ] GOTO N9999 ( I LT R ERROR)
IF [ PQ NE 0 ] GOTO N5
PQ=EMPTY
N5
IF [ PQ EQ EMPTY ] GOTO N6
PQ=ABS [ PQ ]
N6
PAZ=PR (R/ SAVE)
G0 Z=PI (NIGE TAKASA)
Z=PR
N10
IF [ PQ EQ EMPTY ] GOTO N11
PR=PR-PQ
N11
IF [ PQ NE EMPTY ] GOTO N12
PR=PZ
N12
IF [ PR GT PZ ] GOTO N13
PR=PZ
N13
G1 Z=PR F=PF
G91 Y=PJ (ENKO)
G3 J=-PJ
G1 Y=-PJ
G90
IF [ PR GT PZ ] GOTO N10
G0 Z=PI
PR=PAZ(R/ MODOSU)
GOTO N20
N9999
M0 (ALARM)
GOTO N9999
N20
RTS
マクロで使う変数
ローカル変数 | 説明 | 引数のない場合 |
PR | レファレンス点 | エラー※ |
PQ | 切り込み量 | Zの位置で一回加工、下に詳細あります |
PZ | 最終加工高さ | エラー※ |
PI | 逃げ高さ | エラー※ |
PJ | 円弧半径 | エラー※ |
PF | 送り速度 | モーダルFコードに従う |
PAZ | 変数 PR の保存用 | |
※エラー処理について
誤作動を防ぐため、N9999 に分岐してM0プログラムストップします。
- エラーの条件
- PR、PZ、PI、PJのいずれかが定義されていない。
- 円弧半径 PJ が 0 以下の数値。
- 逃げ高さ PI より R点 PR が大きい。
- R点 PR よりZ最終高さ PZ が大きい。
切込み量の処理について
PQ の値により、切込み量に応じて繰り返して加工する場合、Zの高さで1度で加工を終わる場合の2通りに分かれます。
切り込み量のブロック | 説明 |
IF [ PQ NE 0 ] GOTO N5 PQ=EMPTY N5 | PQ が 0 でないとき、PQ を空(EMPTY)にする PQ が空の場合と同じ処理にするため |
IF [ PQ EQ EMPTY ] GOTO N6 PQ=ABS [ PQ ] N6 | PQ が空のとき、PQ は正の数値にする 負の数値だと誤作動するため |
IF [ PQ EQ EMPTY ] GOTO N11 PR=PR-PQ N11 | PQ が空のとき、加工高さ PR に 切込み量 を増やす |
IF [ PQ NE EMPTY ] GOTO N12 PR=PZ N12 | PQ が空でないき、加工高さ PR を最終値 PZ に設定する |
サブプログラムの軸移動時呼び出し(MODIN)について
今回のマクロプログラムは CALL で呼び出していますが、MODIN でも使う想定で作っています。
MODIN ので最初に変数が定義されてから、2回目以降の変数の定義がされない場合を想定して、
PR を変更する前に PAZ に保存して、最後に PR を初期値に戻します。
MODIN O500 PR=2.2 PQ=2 PZ=-50 PI=50 PJ=7.5 PF=200
G90 X0 Y0 ←最初は MODIN で変数の定義を読込んでO500を実行する
X40. Y30. ←2回目以降は変数の再定義が行われなくても良いようにPAZに保存
G67
受取るローカル変数は最初と最後で同じになるようにすることをお勧めします。
Gコード、Mコードマクロについて
今回紹介した方法だとCALL や MODOIN で呼び出すなめ変数の定義などプログラムが長くなります。
OSPも他のNC装置のようにG、Mコードマクロを作ることができます。
詳しくは、お使いの取り扱い説明書でご確認ください。
まとめ NCプログラムのマクロについて
マクロプログラムには変数、演算機能、分岐がありましたね。
- 変数
- ローカル変数
- コモン変数
- システム変数
- 未定義変数
- 演算
- 算術演算子 +、-、*、/
- 比較演算子 EQ 、NE、 GT、 GE、LT、LE
- 関数 SIN、COS、TAN …
分岐- 無条件分岐 GOTO
- 条件分岐 IF
ここまで、NCプログラムのマクロについて説明してきましたが、いかがでしたか?
基本的な文法を理解したら、簡単なマクロプログラムを作ってみてください。
変数を1つ使うだけでも十分マクロです。
サンプルのマクロプログラムも自分流にアレンジすると理解がより深まります。
また、一度使ったマクロはバックアップを取っておくことをお勧めします。私も経験がありますが、不意に消してしまうと、もう一度プログラムを作って確認をとるのは大変な作業になります。
NCのプログラム用に使うUSBメモリーは大容量のものだと使えないことがあるので、私は4GBのUSBメモリーをいくつか使い分けています。
この記事が、NCのマクロプログラムに触れるきっかけになってくれたら嬉しいです。
最後まで読んでいただきありがとうございます。