マシニングセンターを使っている人ならNCのプログラムで加工すると思います。
でも、マクロは使ってない人は結構多い気がします。
今回は 東芝機械(現在は芝浦機械)のNC
TOSNUC(トスナック)のマクロプログラムについて説明します。
- TOSNUCのマクロを使ったことがない。
- 少しやったけど途中であきらめた。
- カスタムマクロを作りたい。
そんな人のお役に立てるよう書きました。
最後まで読むとTOSNUCのマクロプログラムの基礎からカスタムマクロの作り方までが理解できるようになります。
TOSNUC「初心者」はこちら⇓
NCプログラム入門「トスナック(TOSNUC)編」
他のNCプログラムのマクロ
ファナックはこちら⇓
NCプログラムのマクロを説明(ファナック編)
トスナック(東芝)のマクロはこちら⇓
NCプログラムのマクロを説明【オークマ(OSP)編】
ファナックのマクロについてはこちら⇓
NCプログラムのマクロを説明(ファナック編)
オークマ(OSP)にマクロについてはこちら⇓
さて、普段仕事をしていると加工したことがあるプログラムを、編集して使うこともあると思いますが面倒な作業ですよね?
単純に1ヵ所ずつ編集したり、置換機能を使ったり・・・全部直して「OK」と思っても後で「あっ、直し忘れてた」なんてこと、よくありませんか?
マクロ機能を使うとプログラムを短くか、見やすく、計算も自動化できたりします。
もちろん何でも楽になるわけでありません。
しかし、例えば自分好みの穴加工用サイクルや、ポケット穴用のサイクルも作ることができます。手打ちでプログラミングしている人にはメリットが大きい機能です。
マクロは難しそうなイメージがありますが、簡単なマクロでも十分プログラミングの楽になります。
分厚い取説より簡単にまとめてます。この機会にぜひ目を通してみてください。
※掲載してあるプログラムを利用して不利益を負ったとしても、一切の責任を負いかねますのでご了承ください。
NCプログラムのマクロって?
NCプログラムのマクロを簡単に説明すると、仮の数字「変数」を使ったり、「演算」したり、条件により「分岐や繰返し」するのがマクロプログラムです。これらを表現するためマクロ文を使います。詳しく説明していきます。
簡単なマクロプログラム
まず簡単なマクロプログラムを紹介します。
G0 G90 X0 Y0
[V1=100]
X[V1] Y10.
M30
プログラムの説明
- 最初に X0Y0 に移動します。
- 次に X100 Y10 に移動して終わりです。
このプログラムは変数を使っています。
詳しく説明します。
変数
TOSNUCの変数は基本的にアルファベットの「V」と数字の組み合わせで表現します。
変数にはローカル変数、ラベル変数、ゼネラル変数、システム変数、未定義変数の5つがあります。
ローカル変数
ローカル変数 V1~V30
ローカル変数はメインプログラム、サブプログラムにそれぞれ個別に用意された変数でオールクリア、電源断で初期化されます。
サブプログラムの呼び出しで サブプログラム内の変数を定義することができます。
X軸の移動するマクロプログラムの例
$100 (MAIN)
[V1=500]
G0 G90 X[V1]
G72 $101 [V1=600]
X[V1]
M30
$101 (SUB)
G0 G90 X[V1]
M2(M30)
このようにTOSNUCのマクロは [ ] で囲みます。
上のプログラム例は次の順番で動きます。
- X500 (メインプログラムで V1 には500が入っているため)
- X600 (サブプログラムO101の V1 には600が入ってるため)
- X500 (メインプログラムの V1 は500から変わってないため)
G72 $101 [V1=600] でサブプログラム O101 のローカル変数 V1 に数値を入れることできます。
ラベル変数
ラベル変数 VA~VZ
ローカル変数と同じ働きをしますが、変数名に数字ではなくアルファベットを使います。
ゼネラル変数
ゼネラル変数Ⅰ V31~V150
ゼネラル変数Ⅱ V151~V200
ゼネラル変数Ⅲ V200~V230
ゼネラル変数はメインプログラムとサブプログラム共通で1つか存在しない変数です。データが初期化(クリア)される条件で3つに分類されます。
- ゼネラル変数Ⅰ
- V31~V150はオールクリア、電源断のとき初期化されません。
- ゼネラル変数Ⅱ
- V151~V200は電源投入時に初期化されます。
- オールクリア時の初期化はパラメータで決まります。
- ゼネラル変数Ⅲ
- V200~V230はプログラムモーダル呼び出し(G74,G75)が指令された時初期化されます。
システム変数
システム変数は補正関係のデータやNCの状態などを扱うことができます。
登録してある工具径補正を読取りや書換え、有効なGコードやMコードを調べたりもできます。
システム変数は用途により決まっています。取説で確認してください。
未定義変数
未定義変数は中身がない「空」という意味でVと数字の0(ゼロ)「V0」であらわされます。
V0 に数値を代入することはできません。
変数の初期値は「空」です。変数を初期化したいときは V1=V0 と入力します。
未定義変数の演算について
位置決め指令の座標値が未定義(空)の場合無視されます。
[ V1= V0 ]
G0 G90 X[V1] Y100.
→G0 G90 Y100.と同じ
X[V0] は無視されます。
未定義変数が演算された場合は 0 として扱われます。
[ V1 = V0 ]
[ V2 = V1+5 ]
→ V2 は 5 が入ります
[ V2 = V1 * 5 ]
→ V2 は 0 が入ります
条件式で未定義変数が用いられたときは数値0より小さい値として扱われます。
演算
プログラム上で演算処理ができます。算術演算子、比較演算子、関数を説明します。
算術演算子
演算指令 | 意味 |
+ | 加算(+ 足し算) |
– | 減算(- 引き算) |
* | 積算(× 掛け算) |
/ | 除算(÷ 割り算) |
演算方法
- [ V1=2 + 5 * 5 ]
- → V1 には 27 が入ります
変数の演算もできます。
- [ V2 =3 ]
- [ V1 = V2 * 5 ]
- → V1 には 15 が入ります。
計算の順番は数学と同じです。優先させたい場合は [ ] (角カッコ)を使います。
- [ V1 = [ 2 + 5 ] * 5 ]
- → V1 には 35 が入ります
[ ]カッコを重ねることもできます。
- [ V1 = [ [ 2 + 5 ] * 5 ] / 7 ]
- → 35/7 = 5 で V1 には 5 が入ります
電卓で 50 ÷ 0 を計算するとエラーになります。
✖ V1=50 / 0
NCのプログラムでも同じように 0(ゼロ) で割る計算はアラームがでます。
0で割れない理由はこちら(外部リンクです)
比較演算子
比較演算子は IF(条件分岐) とセットで使われます。
2つの値を比較するときに使います。
指令方法は2通りあります。どちらかで指令してください。
演算指令1 符号 | 演算指令2 .文字.(ピリオド) | 意味 |
---|---|---|
V1 = V2 | V1 .EQ. V2 | = 等しい |
V1 <> V2 | V1 .NE. V2 | ≠ 等しくない |
V1 > V2 | V1 .GT. V2 | > より大きい |
V1 >= V2 | V1 .GE. V2 | ≧ 等しいかより大きい |
V1 < V2 | V1 .LT. V2 | < より小さい |
V1 <= V2 | V1 .LE. V2 | ≦ 等しいかより小さい |
IF文については、下で詳しく説明します。ここでは比較演算子の使い方を確認してください。
V1=-11
[IF , VC1 .LT. -10 , GO , 10]
→ もし VC1 が -10 より小さいときは N10 へ分岐するという意味です。
関数
マクロプログラムでは関数を扱うこともできます。
関数(記号) | 機能 |
---|---|
SIN | 正弦 |
COS | 余弦 |
TAN | 正接 |
ATAN | 逆正接 |
SQRT | 平方根 |
ABS | 絶対値 |
BIN | BCD から BINARY 変換 |
BCD | BINARY から BCD 変換 |
RND | 最小設定単位以下 四捨五入 |
FRND | 小数点以下 四捨五入 |
OMT | 最小設定単位以下 切捨て |
FOMT | 小数点以下 切捨て |
PCHK | プログラム名チェック |
ADP | 小数点付加 |
RUP | 最小設定単位以下 切上げ |
FRUP | 小数点以下 切上げ |
LN | 自然対数 |
EXP | 指数e |
TCD | 工具テーブル上工具番号参照 |
DCD | 工具テーブル上D番号参照 |
HCD | 工具テーブル上H番号参照 |
関数の使い方
[ V2 = 30 ]
[ V1 = SIN [ VC2 ]]
V1 に0.5が入ります。
分岐
NCのプログラムは上から順番に実行していきますが、任意の場所へ分岐させたり、条件により同じ処理を繰返すこともできます。無条件分岐、条件分岐を説明します。
GO(無条件分岐)
無条件分岐は「指定するシーケンス名へ行きなさい」という意味です。
[ GO , シーケンス番号 ]
プログラム例
[ GO , 3 ] ←ここから
N1
N2
N3 ←ここへ
M30
[GO, 3] でシーケンス名 N3 のブロックに行きます。N1 N2 は飛ばされます。
上のシーケンス番号に分岐する場合はシーケンス番号にマイナスを付けてください。
N1 … ←ここへ
N2 …
[ GO, -1] ←ここから上のN1へ
シーケンス番号は重複しないよう注意してください。
IF(条件分岐)
条件分岐は「もし、条件を満たしていれば、○○の処理をして、満たさなければ素通りしてください」という意味になります。
条件を満たすか判断するを条件式といい , データ 比較演算子 データ ,で表します。
[ IF , 条件式 , 条件が成立したとき処理 ]
または
[IF [ 条件式] 条件が成立したとき処理 ]
条件が成立したとき処理は GO指令か、変数の定義になります。
IF文の例
[ IF , V1 = 10 , GO , 101 ] (条件式は , V1 .EQ. 10 ,でも同じ指令になります)
→「もし V1と10 が等しい場合、N101へ行きなさい」という意味になります。
[ IF , V1 > 10 , V1=50]
→「もし V1が10 より大きいの場合、V1=50にしなさい」という意味になります。
マクロプログラムの練習
マシニングセンタのプログラムは同じ工具経路を繰返すことが多くあります。今回は穴を円弧切削で加工するプログラムでマクロプログラムを作ります。
- 加工径 φ35の穴、深さ50
- 穴位置 X0 Y0
- 工具 φ20エンドミル
変数は3つ使います。固定サイクルの R, Q, Z と同じと思ってください。
- VR レフレンス点
- VQ 切込量
- VZ 最終加工高さ
プログラム | 説明 |
$1 (PROGRAM) | プログラム名 |
T1 (20ENDMILL) | φ20エンドミル |
M6 | 工具交換 |
G57 H901 | |
G0 G90 X0 Y0 | 穴位置 |
G43 Z100. H1 | |
S1000 M3 | |
[ VR=2.2, VQ=2, VZ=-50 ] | レファレンス点 (初期値) 切込み量 (増分値) 最終加工高さ (最終値) |
N10 | 分岐用 シーケンス |
VR=VR-VQ | 加工高さの計算 |
[ IF , VR<VZ , VR=VZ ] | VRがVZより小さいとき VRがVZに代入される |
G1 Z[VR] F200 | 加工高さへ移動 |
Y7.5 | 円弧加工スタート位置へ移動 |
G3 J-7.5 | 円弧加工 |
G1 Y0 | 穴中心に戻る |
[ IF , VR > VZ , GO, -10 ] | VRがVZより大きい場合 上のN10へ戻る |
G0 Z100M5 | |
M30 | |
プログラムの説明
VR にR点を設定しています。VR に切込み量を増やしていき、VZ を超えると IF文 で強制的にVR を VZ に定義します。VR と VZ が等しい場合、 IF文をスルーしてプログラムエンドです。
加工高さは初回が 0.2 (2.2-2) で円弧加工を行い -1.8 , -3.8 ,と2㎜ずつ切込み、-47.8 , -49.8と続きPRが -51.8になると [IF, VR < VZ , VR=VZ] が働いてVRは -50 になります。VRとVZ が等しくなり [ IF , VR > VZ , GO, -10 ] を抜けてプログラムエンドになります。
このように同じブロックを繰返すマクロを作るときは初期値(VR)に増分値(VQ)を加えて、最終値(VZ)になるまで繰返すようにします。
マクロプログラムをサブ化して複数使う
上のマクロプログラムでは毎回コピーして穴径などを変更して使わなければなりません。
そこで変更が必要な数値を変数にして、サブプログラムにします。
サブプログラムの呼び出し(G72, G74) で変数の定義をして使えば便利になります。
練習のマクロプログラムをベースに作ります。メインプログラムから変数を定義して、いろいろな穴径、深さに対応できるようにします。
サブプログラム呼び出し
G72 $500 [ VR=2.2, VQ=2, VZ=-50, VI=50, VJ=7.5, VF=200 ]
G72 で呼び出すプログラム名の後にサブプログラムの変数を定義します。
※変数の間は , (カンマ)で区切ってください。また G74 も同様の変数の使い方ができます。
(SMPLE MAIN PROGRAM)
G57H901
G0 G90 X0 Y0
G43 Z100. H1
S1000 M3
G72 $500[VR=2.2,VQ=2,VZ=-50,VI=50,VJ=7.5,VF=200]
M5
M30
$500 (SUB ENKO)
(VR R TEN)
(VQ KIRIKOMI)
(VZ KAKOU TAKASA)
(VI NIGE TAKASA)
(VJ ENKO)
(VF OKURI)
[IF,VR=V0,GO,9999] ( R/ NOT SET)
[IF,VZ=V0,GO,9999] ( Z/ NOT SET)
[IF,VI=V0,GO,9999] ( I/ NOT SET)
[IF,VJ=V0,GO,9999] ( J/ NOT SET)
[IF,VJ<=0,GO,9999] ( J/ LE 0)
[IF,VR<VZ,GO,9999] ( R LE Z ERROR)
[IF,VI<VR,GO,9999] ( I LT R ERROR)
[IF,VQ=0,VQ=V0]
[IF,VQ<>V0,VQ=ABS[VQ]]
[V1=VR] (R/ SAVE)
G0 Z[VI] (NIGE TAKASA)
Z[VR]
N10
[IF,VQ<>V0,VR=VR-VQ]
[IF,VQ=V0,VR=VZ]
[IF,VR<VZ,VR=VZ]
G1 Z[VR] F[VF]
G91 Y[VJ] (ENKO)
G3 J[-VJ]
G1 Y[-VJ]
G90
[IF,VR>VZ,GO,-10]
G0 Z[VI]
[VR=V1] (VR MODOSU)
[GO,20]
N9999
M0 (ALARM)
[GO,9999]
N20
M02
マクロで使う変数
ローカル変数 | 説明 | 引数のない場合 |
VR | レファレンス点 | エラー※ |
VQ | 切り込み量 | Zの位置で一回加工、下に詳細あります |
VZ | 最終加工高さ | エラー※ |
VI | 逃げ高さ | エラー※ |
VJ | 円弧半径 | エラー※ |
VF | 送り速度 | モーダルFコードに従う |
V1 | 変数 VR の保存用 | |
※エラー処理について
誤作動を防ぐため、N9999 に分岐してM0プログラムストップします。
- エラーの条件
- VR、VZ、VI、VJのいずれかが定義されていない。
- 円弧半径 VJ が 0 以下の数値。
- 逃げ高さ VI より R点 VR が大きい。
- R点 VR よりZ最終高さ VZ が大きい。
切込み量の処理について
VQ の値により、切込み量に応じて繰り返して加工する場合、Zの高さで1度で加工を終わる場合の2通りに分かれます。
切り込み量のブロック | 説明 |
[IF,VQ=0,VQ=V0] | VQ が 0 のとき、VQ を空(V0)にする |
[IF,VQ<>V0,VQ=ABS [VQ]] | VQ が空でないとき、VQ は正の数値にする 負の数値だと誤作動するため |
[IF,VQ<>V0,VR=VR-VQ] | VQ が空でなV0とき、加工高さ VR に 切込み量 を増やす |
[IF,VQ=V0,VR=VZ] | VQ が空のとき、加工高さ VR を最終値 VZ に設定する |
サブプログラムのモーダル呼び出し(G74)について
今回のマクロプログラムは G72 で呼び出していますが、G74 でも使う想定で作っています。
G74 ので最初に変数が定義されてから、2回目以降の変数の定義がされない場合を想定して、
VR を変更する前に V1 に保存して、最後に VR を初期値に戻します。
G74$500[VR=2.2,VQ=2,VZ=-50,VI=50,VJ=7.5,VF=200]
G90 X0 Y0 ←最初は G74 で変数の定義を読込んで $500 を実行する
X40. Y30. ←2回目以降は変数の再定義が行われなくても良いようにV1に保存
G76
受取るラベル変数、ローカル変数は最初と最後で同じになるようにすることをお勧めします。
まとめ NCプログラムのマクロについて
マクロプログラムには変数、演算機能、分岐がありましたね。
- 変数
- ローカル変数
- ラベル変数
- ゼネラル変数
- システム変数
- 未定義変数
- 演算
- 算術演算子 +, -, *, /
- 比較演算子 EQ=, NE<>, GT>, GE>=, LT<, LE<=
- 関数 SIN、COS、TAN …
分岐- 無条件分岐 GO
- 条件分岐 IF
ここまで、NCプログラムのマクロについて説明してきましたが、いかがでしたか?
基本的な文法を理解したら、簡単なマクロプログラムを作ってみてください。
変数を1つ使うだけでも十分マクロです。
サンプルのマクロプログラムも自分流にアレンジすると理解がより深まります。
また、一度使ったマクロはバックアップを取っておくことをお勧めします。私も経験がありますが、不意に消してしまうと、もう一度プログラムを作って確認をとるのは大変な作業になります。
NCのプログラム用に使うUSBメモリーは大容量のものだと使えないことがあるので、私は4GBのUSBメモリーをいくつか使い分けています。
この記事が、NCのマクロプログラムに触れるきっかけになってくれたら嬉しいです。
最後まで読んでいただきありがとうございます。