////--------------------   プログラム名とシーケンス名   ----------------////
・プログラム名 （O）
　アドレス O に続いてアルファベット（A～Z）または数字（0～9）桁数は 4桁まで
	〇例　O123　、O1234　、OA12　、OABCD
	×例　O12345　、ABC　、O12A1
	※　「O123」と「O0123」は異なる

・シーケンス名 （N）
　アドレス N に続いてアルファベット（A～Z）または数字（0～9）桁数は 5桁まで
	〇例　N123　、N1234　、N12345　、NA12　、NABCD
	×例　N123456　、ABC　、N12A1
	※　「N123」と「N0123」は異なる

////---------------   無条件分岐 （GOTO）と条件付分岐 （IF）   ---------////
・無条件分岐 （GOTO）
　GOTOとシーケンス名の間には、スペースが必要
	〇例　GOTO N1234　、GOTO NABC　
　　　　※運動方式B（大容量プログラムのメモリ運転時）の場合のジャンプ先は
　　　　シーケンスラベル（英数字列）で指定しなければならない。例　GOTO NA123

・条件付分岐 （IF）
　演算子の両端には、スペースが必要。
　※運動方式Bの場合は、GOTO同様にシーケンスラベル指定
	〇例　IF [VC1 LT 5] N100　、IF [VC1 LT 5] GOTO N100　
	〇例　IF[VC1 LT 5]N100（[]の前後にスペースが無くても良い）

　※条件式に使える演算子
　EQ （＝　：EQual to ） 　　　　　　IF [VC1 EQ 10] N100
　NE （≠　：Not Equal to ） 　　　　IF [VC1 NE 10] N100
　LT （＜　：Less Than ）　　　　　　IF [VC1 LT 10] N100
　LE （≦　：Less than or Equal to ）IF [VC1 LE 10] N100
　GT （＞　：Greater Than ）　　　　 IF [VC1 GT 10] N100
　GE （≧　：Greater than or Equal ）IF [VC1 GE 10] N100

////-------------------------------   変数   --------------------------////
・変数（コモン、ローカル、（システム)）
  アドレスと変数の区切りには、”＝ ”、式の間には”スペース”を使用する。
　O、Nのアドレスには、値を渡せない。
　G、Mなどに指令範囲外の値を渡すと小数点以下は、切り捨てになる。
  〇例　G=VC1（VC1=1.9 の場合 G1 になる。）
  〇例　G00X=PA Y=PB　(X=PAとY=PBの間にはスペースが必要)

　★ コモン変数（VC1～（VC128）～VC200）※VC[1]=VC1
　数値はパラメータ設定画面でも設定可能。
　VC1～VC32は、電源切、NCリセット、RTS指令で変化しない。
　VC33～VC128は電源投入時に“EMPTY”にクリアされる。
　※VC0やVC、VC201などは、定義されずエラーになります。
　設定画面でEMPTYを設定したい場合「＊」を設定する。

　★ ローカル変数(予約語以外の4字以内の変数名）
　「O、N、V」以外から始まる変数　…　未定義は エラー になる
　「P」から始まる変数　…　未定義は“EMPTY”扱いになる
  最大255個まで設定可能で、電源切、NCリセット、RTS指令により消滅する。

　※ローカル変数に定義できない予約語
　ABS AND AG ARC ATAN ATAN2 BCD BHC BIN CALL CLEAR COPY COPYE COS
　DA DB DC DEF DELETE DFIX DFUP DGRDX DGRDY DIN DRAW DROUND
　EIN EMPTY EQ EOR FA FB FC FIX FMILF FMILR FUP
　GE GOTO GRCI GRCV GRDX GRDY GRER GROF GRON GRSK GRST GT
　HA HB HC IF LAA LE LPRINT LT MITCAN MOD MODIN MODOUT MSG NE NOT OR
　PCIR PMILL PMILR PRINT RCIRI RCIRO RMILI RMILO RH ROUND RP RQNFL
　RS RSQCO RSQRI RSQRO RSTRT RT RTMCR RTMDT RTI RTS SAVE SIN SPRINT
　SQRT SQRX SQRY TAN TLCO TLFR TLFOFF TLFON TLOK TN

　( ※ NCx2では システム変数 未対応 ）

////-----------------------   演算機能   ------------------------------////
・演算機能
　演算子「 +（加算） -（減算） *（乗算） /（除算） 」によって
　四則演算と正負符号を設定できる「アドレスキャラクタ又は各種変数 ＝ 式」
　 〇例　X＝100 + 100　　、　VC1＝VC1 * 10

////---------------------   EMPTY （空）  -----------------------------////
　コモン変数「VCn（n：数値）」か　P から始まる「Pxxx（xxx：英数）」
　のローカル変数は、値を定義してない場合には、値が“ETMPTY”で表される。
　そのほかのローカル変数は、値を定義してない場合には、エラーになる。

 ----------------  EMPTY の 使用例  -----------------------
  ・アドレスの場合
　　　未定義である変数を割り当てるとアドレスが省略される。

　　　　例（VC1＝EMPTYの場合）
　　　　　G00X = VC1  →　G00 と処理される（命令の省略）

  ・演算式の場合
　　　演算記号を使うときに限り、EMPTYは0として扱われる。

　　　　例（VC1＝EMPTYの場合）
　　　　　VC2＝VC1 →　VC2＝EMPTY と処理される（EMPTYとして）
　　　　　VC2＝+VC1（式だと）　　→　VC2＝0 と処理される（0として）

  ・条件式の場合
　　　　EQ NE の場合だけ 「EMPTY≠0」として処理される。

　例（VC1＝EMPTYの場合）　
　　　　IF[VC1 EQ 0] N10 →　　N10へは飛ばない

  　ちなみにそれ以外は「 EMPTY＝0 」として処理される。
　　　　IF[VC1 GE 0] N10 →　　N10へ飛ぶ
　　　　IF[VC1 GE EMPTY] N10 →　　N10へ飛ぶ
　　　　IF[VC1 GT 0] N10 →　　N10へは飛ばない

////------------------------   サブプログラム機能   -------------------////
・サブプログラム機能
　サブプログラムは最大126個まで。ネストは8重まで。
　★単純呼び出し機能（CALL）
　⇒ 呼び出し指令を行ったとき、 サブプログラムを実行する
　 〇例　CALL O__ Q__　（繰り返し回数：9999 回以内、（Q1＝省略））

・単純呼び出しサブプログラムの受け渡し変数設定（ ← ローカル変数の応用）
　プログラム間で受け渡すデータを引数として設定できる
　Qが2回以上の場合は、引数は再設定されない。（←CALLの初回のみ定義）
　 〇例　CALL O__ Q__PA=1 PB=2　（Q__とPA=1の間にスペースが無くてもOK）

　※コモン変数VC1～VC200は、システムの書き換えのため「MAIN ⇔ SUB」共通になる
　（↑システム変数 も コモン変数 同様）

　例　メイン OMIN1　⇒　サブ OSUB1

　   OMIN1(メイン)
　   PA=10 PB=20
　   G00X=PA Y=PB（　⇒　G00X10 Y20　の意味）
　   CALL OSUB1 PA=50 PB=60（　←　PA=50 PB=60はCALLの引数）
　   G00X=PA Y=PB（　⇒　G00X10 Y20　）
　   CALL OSUB2 Q2 LA=100 LB=200（　←　LA=100 LB=200はCALLの引数）
　   M02

　   OSUB1(サブ)
　   PA=PA+1 PB=PB+1
　   G00X=PA Y=PB（　⇒　G00X51 Y61　）
　   RTS

　   OSUB2(サブ)
　   LA=LA+1 LB=LB+1
　   G00X=PA Y=PB（　1回目⇒　G00X101 Y201　/　2回目⇒　G00X102 Y202）
　   RTS

////-------------------   関数機能（機械オプション）   ---------------////

　関数記号（関数名）： 使用例　（VC2=60）

・SIN(正弦) : VC1=SIN [30] → 0.5  [30]は30°

・COS(余弦) : VC1=COS [VC2] → 0.5

・TAN(正接) : VC1=TAN [45] → 1

・ATAN(逆正接) : VC1=ATAN [1] → 45°（角度は-90°～90°の範囲）（注4）

・ATAN2(逆正接) : VC1=ATAN2 [1,[SQRT [3]]] → 150°（注5）

・SQRT(平方根) : VC1=SQRT [VC2+4] → 8

・ABS(絶対値) : VC1=ABS [20-VC2] → 40

・ROUND(四捨五入による整数化）:  VC1=ROUND [27.6348] → 28

・FIX(小数点以下切り捨て）:  VC1=FIX [27.6348] → 27

・FUP(小数点以下切り上げ）:  VC1=FUP [27.6348] → 28

・DROUND(設定がミリ系 ⇒ 小数点の第4位以下を四捨五入の単位整数化）
　　　　　: VC1=DROUND [13.26462] → 13.265 （注6）
　　　　　
・DFIX(設定がミリ系 ⇒ 小数点の第4位以下を切捨ての単位整数化）
　　　　　: VC1=DFIX [13.26462] → 13.264 （注6）

・DFUP(設定がミリ系 ⇒ 小数点の第4位以下を切上げの単位整数化）
　　　　　: VC1=DFUP [13.26462] → 13.265 （注6）

・MOD(余り) : VC1=MOD [VC2, 7] → 4（60÷7＝8 余り4）

（注1）関数名の後に付く変数、数字は必ず[　]でくくって指令する。
       また[　]は演算の優先順位を決める数式の括弧として使用される。
（注2）[　]内に要素が2つある場合はコンマ「，」で区切る。
（注3）VC1欄はVC2=60のときに使用例を実行した場合のVC1の値
（注4）・逆正接（ATAN）θ=ATAN[b/a]
       ・逆正接（ATAN2）θ=ATAN2[b,a]
（注5）ATAN2[b,a]の値は直角座標が（a,b）で与えられる点の偏角で、
　　　　-180°～180°までの間の表記
（注6）設定単位が、インチ単位系の場合は、小数点の第5位以下を四捨五入、
　　　　切り捨て、切り上げになる。( ※ NCx2では インチ単位系未対応 ）
　( ※ NCx2では BIN、BCD関数 の 16進数のABCDEF表記に問題があります。）

////--------------------------------------------------------------------////


----------------------------------------------------------------------------
注記 -----↓--↓--↓-（ NCx2では未対応 : 考慮してない点 ）-↓--↓--↓-------
----------------------------------------------------------------------------
・BIN関数とBCD関数（10進 ⇔ 16進）
　BIN(10進から16進への変換) ： VC1=BIN [16] → 10
　BCD(16進から10進への変換) ： VC1=BCD [20] → 32
　( ※ NCx2では BIN、BCD関数 の 考慮が不完全です。）

・システム変数
　制御装置によって用途が決まっている変数
　「V」から始まる変数で、2文字目は「C」以外の変数
　　VZOFX[式]　や　VTOHT[式1,式2]　などの書式
　〇例　　→　"原点オフセットNo10のX軸の値" へ 20 の書込
　〇例　VTOHT[10,10001]=100　→　"工具番号10の第1工具長補正HA" へ 100 の書込
　※NCx2 の変換では、「システム変数」を考慮していません。

・軸移動呼び出し機能（MODIN、MODOUT）　（ ※ NCx2では未対応 ）
　⇒ 軸移動指令をするたびに軸移動実行後にサブプログラムを実行する
　 〇例　MODIN O__ Q__
　※NCx2 の変換では、「MODIN、MODOUT」を考慮していません。

・G、Mコードマクロ　（ ※ NCx2では未対応 ）
　G100 ： MODOUT と同じ。変数設定は無効
　G101 ～ G110 ： MODIN O ＿＿ と 同じ意味
　G111 ～ G120 ： CALL O ＿＿ と 同じ意味
　M201 ～ M210 ： CALL O ＿＿ と 同じ意味
　※NCx2 の変換では、「G、Mコードマクロ」考慮していません。

※　解析のエラーが予想される点　※
　予約語の対応が未完全なので、
　　　　組み合わせ方でエラーが起こると思われます。＜（＿　＿）＞
                                                       　　　　　 などなど
----------------------------------------------------------------------------
////----////----////----////----////----////----////----////----////----////
----------------------------------------------------------------------------

----------------------------------------------------------------
----------------  追加の説明（もう少し具体的に） ---------------

・変数(コモン、ローカル、システム)について

・・コモン変数（VC1～（VC128）～VC200）について

VC1=123.456
G=VC1 X=VC1 Y=VC1-123
Z=SIN[VC1]
VC[ROUND[VC1]]=5.
M=VC123
M2

⇒ 代入式が可能になります。
　コモン変数は制御装置に登録されます。
（※コモン common とは「共通の」の意味）
----------------------------------------------------------------

・・ローカル変数について
　「O、N、V」以外から始まる変数
　「P」から始まる変数

XSEP=123.456
PPP=XSEP*2
G=XSEP X=PPP
M02

⇒ 代入式が可能になります。
　ローカル変数はリセット等で消滅します。
　同名であっても MAIN ⇔ SUB で別の定義になる
（※ローカル local とは「地元の」の意味）
----------------------------------------------------------------

・・システム変数について

VZOFX[1]=12
X=VZOFX[1]
M02

⇒ 制御器情報が読み込めます
　　※ NCx2 では 未対応
----------------------------------------------------------------


・四則演算

O123
VC1=12+34
X=VC1
VC2=-12+56*2
Y=VC2
G00X=VC1+VC2 Y=VC2-VC1
M2

OABC
VC1=SIN[30]
X=VC1
VC2=VC1*[-10]
Y=VC2
T=-VC2
M02
⇒ 計算が可能になります。
----------------------------------------------------------------


・関数ついて

G00X=SIN[30]
G00Y=COS[45]
T=ROUND[12.34567]
G00Z=DROUND[12.34567]
M02

⇒ 計算が可能になります。
----------------------------------------------------------------

・分岐（GOTO　IF）

・・GOTO

N01
N02
GOTO N9999
N03
N04
N9999
M02
⇒ 指令位置（シーケンス番号）へ移動出来ます


・・IF

①-2
VC1=0
IF[VC1 EQ 0] NTRUE(TRUE)
NFALSE G=VC1(FALSE)
GOTO N9999
NTRUE G=VC1(TRUE)
N9999
M02


①-2
VC1=3
IF[VC1 EQ 0] NTRUE(TRUE)
NFALSE G=VC1(FALSE)
GOTO N9999
NTRUE G=VC1(TRUE)
N9999
M02
⇒ 条件式によって分岐出来ます
----------------------------------------------------------------

・EMPTY（空）について

①（数値の定義がない場合は、EMPTYになります）
(VC1=0)
G00X=VC1
M02
⇒ コモン変数は定義可能（アドレスの省略になります）

②-1（予約語 EMPTY の 定義）
PPP=EMPTY
X=PPP
M02
⇒ Pから始まるローカル変数は定義可能

②-2
XSEP=EMPTY
G=XSEP
M02
⇒ コモン変数、Pから始まるローカル変数以外は定義不可



★・EMPTY（空）と 0（数値）の違いについて

①-1（EMPTY と 0）
IF[VC1 EQ 0] NTRUE(TRUE)
NFALSE G=VC1(FALSE)
GOTO N9999
NTRUE G=VC1(TRUE)
N9999
M02

①-2（0 と EMPTY）
VC1=0
IF[VC1 EQ EMPTY] NTRUE(TRUE)
NFALSE G=VC1(FALSE)
GOTO N9999
NTRUE G=VC1(TRUE)
N9999
M02
⇒ 条件式　EQ NE の場合だけ 「EMPTY≠0」として処理される。
----------------------------------------------------------------

・プログラム名　シーケンス名

OA123
GOTO NAA1
NBB1 G00X10.
NAA1 G01Y20.
M02
⇒ 数値以外も使える。（ルールがある）
----------------------------------------------------------------

・CALLによる引数の引き渡し(Q：回数）

①-1 (ローカル変数を定義して渡す)
OMIN1
PA=10 PB=20
G00X=PA Y=PB
CALL OSUB1 Q2 LA=100 LB=200
G00X=PA Y=PB
M02

OSUB1
LA=LA+1 LB=LB+1
G00X=LA Y=LB
CALL OSUB2 Q3 LA=1000 LB=2000
G00X=LA Y=LB
RTS

OSUB2
LA=LA+1 LB=LB+1
G00X=LA Y=LB
RTS
⇒ ローカル変数の引き渡しに利用できる

①-2 (引数として変数を定義して渡す)
OA123
G=1.23456 Y123.
ZS=1
CALL OSUB1 ZS=ZS
Z=ZS
M2

OSUB1
ZS=ZS+1
X=ZS
CALL OSUB2 ZS=ZS+10
X=ZS
RTS

OSUB2
Y=ZS
RTS
⇒ 同じ名前のローカル変数に引き渡しできる
----------------------------------------------------------------


・コモン変数（VC1-200）の範囲

OMIN1
VC120=12 VC121=13 VC122=14
CALL OSUB1 VC1=100
G02X=VC1
M02

OSUB1
G02X=VC1
VC1=48
G03X=VC120
G03X=VC121
G03X=VC122
RTS
⇒ コモン変数（VC1-200）は引き渡さなくても 共通する
----------------------------------------------------------------

・分岐判断の範囲

O123
N01
X=123.+6

STEP=STEP+1
X=STEP
IF [ STEP LT 5] N01

CALL O456
N02
M02

O456
N01
STEP=STEP+1
X=STEP
IF [ STEP LT 5] N01
GOTO N02
G00X123.
N02
RTS

⇒ サブプロの分岐は　サブプロ中で完結する
　（メインやほかのサブではサーチしない）
----------------------------------------------------------------

・ニーモニックに式を代入

VC1=100 VC2=20 VC3=50 VC4=3
PMIL X=VC1-2.*VC3 Y=6.-8. Z-1I50J30K0.5 P=VC3 Q3R3 D=VC4 F100 FA=VC1 FB=VC2
M2


----------------------------------------------------------------

・固定サイクルに式を代入

OMIN1
PA=10 PB=20
G00X=PA Y=PB
CALL OSUB1 PA=50 PB=60
G00X=PA Y=PB
CALL OSUB2 Q2 LA=100 LB=200
NCYL G81Z=-PA R=10-3. F=1000*0.1
CALL OSUB1  PA=0 PB=0
G80
M02

OSUB1
PA=PA+10 PB=PB+10
X=PA Y=PB
RTS

OSUB2
LA=LA+1 LB=LB+2
G00X=PA Y=PB
G00X=LA Y=LB
RTS
----------------------------------------------------------------

----------------------------------------------------------------
-----         　OSP　マクロ　サンプルプログラム         　------
-----                  （ 関数　楕円　球 ）             　------
----------------------------------------------------------------
G00X=SIN[30]
G00X=COS[60]
G00X=TAN[45]
G00X=ATAN[1]
G00X=ATAN2[1,[-SQRT[3]]]
G00X=SQRT[1+2]
G00X=ABS[20-25]
G00X=BIN[16]
G00X=BCD[20]
G00X=ROUND[12.34567]
G00X=FIX[12.34567]
G00X=FUP[12.34567]
G00X=DROUND[12.34567]
G00X=DFIX[12.34567]
G00X=DFUP[12.34567]
G00X=MOD[22,7]




(---- ELLIPSE -----)
VC1=120(WIDTH)
VC2=50(HEIGHT)
VC3=45(ANGLE)
VC4=5(R POINT)
VC5=-1(Z POINT)
VC6=5(LINE PICH)

G15H1
T1M6
G90G00X0Y0
G56Z100.0HA
S1000M03

N02 X=VC1/2*COS[VC3]Y=VC1/2*SIN[VC3]

Z=VC4(R POINT)
G01Z=VC5F100(Z POINT)
AST=0(AST A-STEP)

N03
XST=VC1/2*COS[AST](XST X-STEP)
YST=VC2/2*SIN[AST](YST Y-STEP)

G01X=XST*COS[VC3]-YST*SIN[VC3] Y=XST*SIN[VC3]+YST*COS[VC3] F200
AST=AST+VC6
IF [AST LE 360] N03

G00Z100
X0Y0M05
M01


(---- HEMISPHERE -----)
VC1=30(HEMISPHERE RADIOS)
VC2=5(X-Z ANGLE PICH)
VC3=5(R POINT)
VC4=5(TOOL RADIOS)

G15H1
T1M6
G90G00X0Y0
G56Z100.0HA
S1000M03

XZST=-VC2(X-Z ANGLE PICH)
X=[VC1-VC4]*COS[XZST]
Z=VC3

N102 G01Z=[VC1-VC4] *SIN[XZST] F100
G03I=-[VC1-VC4]*COS[XZST] F200
XZST=XZST-VC2
IF [XZST LE -90] N103
G01X=[VC1-VC4] *COS[XZST]
GOTO N102

N103G00Z100
X0Y0M05
M02


＝＝＝＝＝＝＝＝＝＝＝　メモ書きVer1.01　＝＝＝＝＝＝＝＝　END