Trap (ユーザー定義トリガー)
割込み、および割込み発生時の処理の定義を行います。
Trap命令を使用すると、イベント発生により、ラベルにジャンプする、または、ファンクションを呼び出すことができます。Trap命令には2つのタイプがあります。
- ユーザーの定義する入力状態をトリガーにする4つのTrap
- システム状態をトリガーにする7つのTrapです。
本項目ではユーザ定義トリガーのTrapを説明します。
書式
Trap トラップ番号, イベント条件式 GoTo ラベル
Trap トラップ番号, イベント条件式 Call ファンクション名
Trap トラップ番号, イベント条件式 Xqt ファンクション名
Trap トラップ番号
パラメーター
- トラップ番号
- トラップ番号 (1~4の整数)を、式または直接数値で指定します。 (SPEL+では同時に有効なTrapを4つまでサポートします。)
- イベント条件式
- トリガーとする入力状態を指定します。
- [イベント] 比較演算子(=, <>, >=, >, <, <=) [整数式]
- 次の関数や変数をイベントに使うことができます。
関数: Sw, In, InW, Oport, Out, OutW, MemSw, MemIn, MemInW, Ctr, GetRobotInsideBox, GetRobotInsidePlane, AIO_In, AIO_InW, AIO_Out, AIO_OutW, Hand_On, Hand_Off, SF_GetStatus
変数: Byte, Int32, Integer, Long, Short, UByte, UInt32, UShort 型のバックアップ変数, グローバル変数, モジュール変数
- また、以下の演算子で複数のイベント条件式にマスクを掛けることや、複合的に組み合わせることができます。
演算子: And, Or, Xor
- [例]
Trap 1, Sw(5) = On Call TrapFunc Trap 1, Sw(5) = On And Sw(6) = Off Call TrapFunc - ラベル
- Trap条件が成立した場合に、プログラムの実行を移行させる先のラベルです。
- ファンクション名
- Trap条件が成立したときCall又はXqtされるファンクションです。引数のあるファンクションを指定することはできません。
解説
Trapは、条件成立時にGoTo, Call, Xqtなどで指定された割込み処理を実行します。Trap条件式には、上記の関数を1つ以上含んでいなくてはいけません。
一度割込み処理が実行されると、そのTrap 設定はクリアされます。同じ割込み処理を行うためには、再度Trap 命令を実行しなくてはいけません。
Trap設定をキャンセルするためには、トラップ番号パラメーターだけを指定してTrap 命令を実行します。
[例] "Trap 3" は、Trap #3をキャンセルします。
また、Trap Gotoは宣言したファンクションから抜けると自動的にキャンセルされます。
Trap Callは宣言したタスクが終了するとキャンセルされます。
Trap Xqtはすべてのタスクが終了するまでキャンセルされません。
GoTo を指定したとき
Trapを設定したタスクで、実行中のコマンドは下記のように処理され、制御は、指定先のラベルに移行します。
- アーム動作を直ちに一時停止(クイックポーズ)します。
- WaitやInputコマンドによる待機状態を中断します。
- その他のコマンドはすべて、制御が移る前に完了します。
Callを指定したとき
GoToと同じ処理を実行した後、制御は、指定先のファンクションに移行します。
ファンクションが終了すると、プログラムは割込み発生時の次のステートメントに戻ります。
トラップ処理のファンクションにはCallを使うことはできません。
また、トラップ処理のファンクション中でエラーが発生した場合、OnErrによるエラーハンドリングは無効となり、必ずエラーが発生します。
Xqtが指定されたとき
プログラム制御は指定されたファンクションを割込み処理専用のタスクとして生成します。この場合、Trapコマンドを実行するタスクはそのまま継続されます。
割込み処理タスクからXqtでさらにタスクを実行することはできません。
注意
EPSON RC+ 4.xユーザーの方へ
EPSON RC+ 4.x までの Trap Callの機能は、Epson RC+ 8.0ではTrap Xqtに置き換えられています。
EPSON RC+ 4.x までの Trap GoSubの機能は、Epson RC+ 8.0では削除されました。Trap Callを使うことにより代用してください。
イベント条件式で変数を使用する場合
- 使用できる変数型は整数型 (Byte, Int32, Integer, Long, Short, UByte, UInt32, UShort)です。
- 配列変数は、使用できません。
- ローカル変数は、使用できません。
- 変数値が0.01秒以上の間、イベント条件を満足していない場合、変数の変化をシステムが検出できない場合があります。
- システム内で使用できる変数待ちの数に制限があります。1システム内で使用できる変数待ちの個数は最大64個です (Waitなどのイベント条件式で使用された変数待ちも含みます)。最大数を超えた場合には、プロジェクトビルド時にエラーになります。
- 変数待ちを行う変数をByrefで参照渡しするとエラーになります。
- イベント条件式の右辺の整数式に変数、関数が含まれたときは、その値はTrap条件設定時に演算されます。意図しない条件になる場合があるので、整数式には変数、関数を使用しないことを推奨します。
参照
Call, GoTo, Xqt, SF_GetStatus関数
Trap使用例
[例 1] ユーザー定義のエラー処理
Sw(0) Input は、ユーザー定義のエラー入力とします。
Function Main
Trap 1, Sw(0)= On GoTo EHandle 'Trapを定義
.
.
.
EHandle:
On 31 'シグナルタワー点灯
OpenCom #1
Print #1, "Error is issued"
CloseCom #1
Fend
[例 2] マルチタスク的な使用
Function Main
Trap 2, MemSw(0) = On Or MemSw(1) = On Call Feeder
.
.
.
Fend
.
Function Feeder
Select TRUE
Case MemSw(0) = On
MemOff 0
On 2
Case MemSw(1) = On
MemOff 1
On 3
Send
'次のサイクルのTrapを再設定
Trap 2, MemSw(0) = On Or MemSw(1) = On Call Feeder
Fend
[例 3] グローバル変数をイベント条件に使用
Global Integer gi
Function main
Trap 1, gi = 5 GoTo THandle
Xqt sub
Wait 100
Exit Function
THandle:
Print "IN Trap ", gi
Fend
Function sub
For gi = 0 To 10
Print gi
Wait 0.5
Next
Fend