サブプログラム
関数:サブプログラムの呼び出し
ポケットフライス盤、穴あけ、工具交換などの頻繁に繰り返されるタスクは、Gコードサブプログラムにスワップアウトして、そこから呼び出すことができます。呼び出し中に、パラメータをサブプログラムに渡すことができます。データ型 BOOL
、 LREAL
、 と STRING
この目的のために許可されています。
ヒント
サブプログラムを使用する場合は、汎用ブロックを使用する必要があります SMC_ReadNCFile2
と SMC_NCInterpreter
それ以外の SMC_ReadNCFile
と SMC_NCDecoder
。
ヒント
サブプログラムはオンラインデコーダーでのみ機能します(CNCエディターでは機能しません)。
各サブプログラムは個別のファイルに保存されます。これらのファイルは、コントローラー上の1つ以上のサブディレクトリーに保存されます。彼らはファイル拡張子を持っている必要があります .cnc
。ファイル名は、サブプログラムの名前に対応し、小文字である必要があります。例:サブプログラム名「ドリル」->ファイル名 drill.cnc
。
重要
サブプログラムのファイル名は小文字で記述する必要があることに注意してください。
POU SMC_ReadNCFile2
入力があります aSubProgramDirs : ARRAY[0..4] OF STRING(174)
。これを超えて、最大5つのサブディレクトリを指定できます。それらは指定された順序でスキャンされます。複数のディレクトリに同じ名前のサブプログラムがある場合、配列内でインデックスが最も低いディレクトリを持つサブプログラムが見つかります。サブプログラム名は小文字に変換されます。
aSubProgramDirs = ['subprograms/user', 'subprograms/system', '']
サブプログラム DrillA1
ファイル内で最初にスキャンされます subprograms/user/drilla1.cnc
。このファイルが存在しない場合、検索は次の場所で続行されます。 subprograms/system/drilla1.cnc
。
変数を使用して(より正確には、型の式を使用して)サブプログラムを間接的に呼び出すことができます。 STRING
)。式(したがって、変数のルックアップも)は、インタープリターが行に到達したときの前処理時に評価されます(通常、Gコードで変数を使用する場合)。この場合、引数の型チェックは、静的呼び出しの場合のように、インタープリターが行に到達したときにのみ実行され、解析中には実行されません。
ヒント
CNCエディタでサブプログラムをオフラインで作成することはできません。
サブプログラム呼び出しの最大ネスティング深度
バージョン 4.18.0.0 以前:サブプログラム呼び出しの最大ネスト深度は 14 に制限されています。
バージョン 4.18.0.0 以降:ネスティングの深さはメモリによってのみ制限されるようになりました。最大値は library パラメーターを使用して変更できます。 SMC_CNC_LibParams.MAX_SUBPROGRAM_NESTING_DEPTH。
呼び出しの構文
サブプログラム呼び出しは、ブロック番号と呼び出しのみで構成されるGコードの特別なブロックです。追加の単語は許可されていません。
N<SentenceNo> <Name> <BracketOpen> <ActualParamList> <BracketClosed> N<SentenceNo> DYNCALL <BracketOpen> <SubNameExp> [, <ActualParamListNotEmpty] <BracketClosed> <SubNameExp> : An expression with exactly one value of type STRING <ActualParamList> ::= Empty | <ActualParamListNotEmpty> <ActualParamListNotEmpty> ::= <ActualParamValue> | <ActualParamValue>, <ActualParamListNotEmpty>
| 最小 3 文字から最大 80 文字の有効な IEC 識別子。サブプログラムが定義されているファイル名 (拡張子なし) に対応している必要があります。サブプログラム名は大文字でも小文字でもかまいません。 次のキーワードは名前には無効です。 |
| サブプログラムが定義するのとまったく同じ数のパラメーター値を指定する必要があります(「宣言の構文」を参照)。各パラメーター値のタイプは、宣言と一致する必要があります。 |
| 互換性の理由から、デフォルト設定では括弧の代わりに中括弧が使用されます。 機能ブロック |
| 変数、リテラル、または任意の式 |
例
N10 SUB1() N20 DRILL(10.0) N30 SUB2(5, "Text", 2.5) N40 G36 O#SUBNAME D'DRILL' % Indirect call via local variable N40 DYNCALL(#SUBNAME, 2) % equivalent to N40 DRILL(2) N50 DYNCALL($SUBNAME$, 2, 4) % Indirect call via IEC variable
宣言の構文
サブプログラムは別のファイルに保存する必要があります。最初の行(空でもコメント行でもない)には、サブプログラムの宣言が含まれている必要があります。次の構文が適用されます。
SUBPROGRAM <Name> <BracketOpen> <FormalParamList> <BracketClosed> <RESTORE_OPT> <Inhalt Unterprogramm> END_SUBPROGRAM <FormalParamList> ::= Empty | <FormalParamListNotEmpty> <FormalParamListNoEmpty> ::= <FormalParam> | <FormalParam> , <FormalParamListNotEmpty> <FormalParam> ::= <ParamName> : <ParamType> <ParamName> ::= #[a-zA-Z0-9_]+ <ParamType> ::= LREAL | BOOL | STRING ; String with a maximum length of 255 bytes <RESTORE_OPT> ::= RESTORE_MODES
| 名前の長さは最大80文字です(プレフィックスは含まれません) |
| このキーワードが指定されている場合、呼び出し側プログラムに戻るときに、次のモーダル状態が復元されます(呼び出し時に持っていた値に設定されます)。
次のモーダル状態は復元されません。
注:このキーワードに関係なく、暗黙のカウンター変数(G36、G37)は、サブプログラムから呼び出し側プログラムに戻るときに復元されます。 |
例
SUBPROGRAM SUB1() ; no formal parameters SUBPROGRAM DRILL(#depth : LREAL) SUBPROGRAM SUB2(#a : LREAL, #b : STRING, #c : LREAL) SUBPROGRAM SRM1() RESTORE_MODES
戻り値の構文
戻りは、サブプログラムテキストの最後( END_SUBPROGRAM
)または次の構文で明示的に: N<block number> RETURN
。
サブプログラムで仮パラメータを使用する
仮パラメータの値には、サブプログラムで次の方法でアクセスできます。 #<ParamName>
。
正式なパラメータの数は21に制限されています。
SUBPROGRAM SUB(#Param1 : LREAL) N10 G01 X#Param1
コールスタックの表示
通訳(SMC_NCInterpreter
)には、上位10個のアクティブなプログラム/サブプログラムを含む出力があります。 aActivePrograms : ARRAY[0..9] OF STRING
。最初のエントリ(aActivePrograms[0]
)は現在解釈されているプログラム/サブプログラムです。 2番目のエントリ(aActivePrograms[1]
)は呼び出し側プログラム/サブプログラムなどです。呼び出し側プログラムがない場合、対応する文字列は空です。
コールスタックは、補間時に表示することもできます。 NS SMC_DisplayNCCallstack
POUは、アクティブなプログラム/サブプログラムをインタプリタと同じ形式で、後で(つまり、移動が実行されたときに)表示します。そうすることで、インタープリターの出力 CallstackInfo (SMC_NCCallstackInfo)
補間器は次のように渡されます VAR_IN_OUT
変数。 SMC_NCCallstackInfo
対応するものを含む、すべてのコールスタックの変更を保存します SMC_GeoInfo
リングバッファ内のオブジェクト番号。現時点では、これにより、解釈時間と補間時間の間の保存可能なコールスタックの変更数が128に制限されます。リングバッファがマルチタスク基準を満たしていないため、 SMC_DisplayNCCallstack
インタプリタタスクから呼び出す必要があります。
サンプルプログラムCNC 例 07: 式とサブプログラムの使用補間時のコール スタックの表示例を示します。