OSP MACRO マクロプログラムに関する参考資料


Mail: 自己紹介ページを参照下さい

OSP5000系(5000M〜E100M)のマクロプログラムに関する情報提供のページです。

オークマは相当古くからNC装置を自製していて、80年頃OSP5000と言うのが完成し、言語的にはそれ以降は現在までほぼ完全な上位互換が保障されています。
上位互換というのは、5000M用のマクロは最新のE100Mでも問題なく動くと言う事です。
「ほぼ完全と」言うのは100%互換ではないと言う意味です。(一部途中でシステム変数が変更された部分があり、それらを使うマクロは互換性がありません)
通常の命令語に関しては完全な上位互換が確保されています。

このページで言うマクロとは5000M系(マシニング)のマクロを指します。L(旋盤系)は一部異なります。(G(研削盤系)に付いては資料が無く不明ですが、Lに準じているものと思われます)

OSPのマクロプログラミングに関しては、オークマのHP中にokumamerit.comと言うページがあり(このHPからリンクがあります)、そこにマクロプログラムの解説書を分割してPDFファイルの形で公開していますのでそれを参照して下さい。またオークマのマシニングのNCスクールを受けた方は希望すれば「ユーザータスク解説書」と言うガイド本がもらえます。(上記PDFはこの本を分割収録した物です。但し内容的には5020M当時のものです)

ここでは説明書に記載が無いか、記載があってもよくわからない部分の補足とバグ情報しかありません。

(1)コモン変数とローカル変数
コモン変数とは、文字通りプログラムの何処からでも設定参照が可能な、共有変数です。
変数名はVCn(nは正の整数)となります。
nは1〜128ですが、7030Mからは1〜200までとなります。
128個仕様の機械では、VC1〜32までは常時バックアップされ電源切でも保持され、VC33〜128は電源投入時はEMPTYになっています。
これに対し、7030M以降はVC1〜200まで常時バックアップとなっています。
またコモン変数は配列として間接参照が出来ます。
VC[n] nは定数または変数(式も可)。
(L系の場合はVnになる(nの上限値も異なる))

ローカル変数とは各プログラム毎に独立した変数です。従ってサブプログラムでは、呼び出した側のプログラムと、呼ばれた側のサブプログラムに同名の変数があっても夫々独立した別物です。
変数名は[ONV]以外の英字で始まり2〜4桁の英数字(2文字目は英字のみ)で構成されます。但しNCの命令語に該当する物は除きます。
同時に定義可能なローカル変数は最大255個です。1つのプログラムで使用出来るローカル変数の個数は、同時に最大255個の制限内であれば制限はありません。
ローカル変数の内、Pで始まる物をパラメータ変数と呼び特別な処理が行われます。
-1 未定義のローカル変数が参照された場合通常アラームとなりますが、パラメータ変数はEMPTYとして処理されます。
-2 Gコードマクロ時値をアドレスのみで渡す事が出来ます。(詳細は取説参照の事)
(L系の場合はパラメータ変数は無い。但し引数の有無はサブ側でIF文で判定可能になっている)

(2)CALLとMODINの違い。
CALLとMODINは説明書記載の通り機能が違うのですが、機能だけでなくサブプログラム呼び出しブロックでの動作も違います。これはOSPマクロの上級者でも気が付かず悩まされている場合があります。
CALLの場合は、当然ですがCALLのブロックで呼び出したサブプログラムが実行されます。
例えば「CALL OABC..」.の場合そのブロックでOABCが実行され、当然OABC内の命令も全て実行されます。
これに対し、MODINの場合はMODINのブロックではサブプログラムは(まだ)実行されません。
MODINのブロックはそれ以降位置決め毎に呼び出すサブの宣言のみで、そのブロックではサブの呼び出しはありません。
位置決め後にしかサブの呼び出しが行われない事。毎回同じサブが呼ばれる事に注意する必要があります。
またMODINはマクロプログラムを固定サイクルのように使うためのものなので、「MODIN O***...」と「NCYL G**(固定サイクル)...」は同等の使用法になりますが、実際は「NCYL G**(固定サイクル)...」ではサイクル軸の動作以外は実行されているのに対し、MODINのブロックでは(機械は)何もしないという点で異なります。

(3)シーケンスナンバーとシーケンスラベル。
OSPの場合、他社NCと異なりプログラム番号(注1)やシーケンス番号と言う概念はありません。
Nで始まるブロック名をOSPではシーケンス名と呼びます。
このうちNの次が数字だけの物をシーケンスナンバー。Nの次が英字で始まる英数字の物をシーケンスラベルと呼びます。
シーケンスナンバーも便宜的にそう呼んでいるだけで、上記の通り番号ではなく数字だけの文字列として解釈されています。
では何故この二つを呼び分けているのでしょう。
シーケンスラベルは文字通りラベルで、ブランチ命令の分岐アドレスとして使用した場合高速に分岐します。但し分岐が高速化されるのは各プログラムの先頭から30個までのシーケンスラベルに限られます。31個目以降のシーケンスラベルはシーケンスナンバーと同じ扱いになります。
この事はプログラム説明書にも明記されているにもかかわらず、OSPマクロの最上級者でも殆どこの機能を理解していません。(OSPの場合(NCで提供される)マクロの高速化はこの機能の活用以外方法はありません。後はひたすらアルゴリズムを工夫するか、制御装置を新しくするしかない。勿論一番効果があるのは制御装置の交換!)

注1)02年5月からU/E100Mにはプログラム番号が標準適用との事。これにより間接CALLは可能となった。


バグ情報

(1)システム変数VSPCO(工具補正組数や座標系組数を読み出す変数)が死んでいる。
5000M(84年頃)〜5020Mの一部(90年頃)までは死んでいる。(読み込んだ値はデタラメ)
それ以降のことは不明。(当方では判らない)
この変数はマクロプログラマーとしては非常に使いたい変数なのだが、残念ながら使えない。
対策はありません。

(2)5000M−Gの一部で未定義のパラメータ変数を式として参照した場合、−1として処理されることがある。(正しくは未定義パラメータ変数(EMPTY)を式として参照した場合は0として処理される)
このバグは88年以降は直っているはず(87年ごろ私が指摘したので...)。
尚5000M(5000M−Gより古い)では私の調査では問題はなかった。
対策としては、未定義パラメータ変数を式として参照する場合は、IF文でEMPTYの時は0に置換しておく処理をする。

(3)システム変数VINCH(単位系参照/変更用変数)の仕様変更。
これはバグでは有りませんが、常用のシステム変数の仕様が途中でコロコロ変更されたため、非常に困った例です。
VINCHは最初(5000M−Gの途中まで)は読み書き可能だった。これはマクロ内で単位系を変更して動かし、復帰時に元の単位系に戻して復帰出来る非常に優れものであった。
5000M−Gの途中で何を思ったかリードオンリーに変更されたため、上記の処理は不可能になってしまった。当然VINCHがリ−ド/ライトを前提にしたマクロは全部駄目になった。
この時の物凄い悪評に懲りたと思ったら、5000M−Gの終わり頃パラメータ設定でリードオンリー|リード/ライト可を切換式に変更してしまい、更に面倒な事になった。
依って現在はこの変数はリードオンリーと考えないといけない。
気まぐれな仕様変更により、マクロプログラムを作る人は物凄い不利益をこうむり、現在もこうむリ続けている。しかもこの仕様変更に必然性は全く認められない。


お便り、問い合わせ、仕事の依頼大歓迎。

尚このページの内容に関して、オークマへの問合せは絶対にご遠慮下さい。

戻る