メソッドの実行
Spelクラスにはメソッドがあります。利用できるメソッドについては、以下を参照してください。
Spelクラスメソッド
メソッドを実行すると、コントローラーと通信して関数を実行するEpson RC+サーバープロセスに関連する内部関数を呼び出します。メソッドには即時メソッドと非同期メソッドの2種類があります。即時メソッドは内部関数をコントローラーで実行し、即時に応答を返します。即時コマンドはすべてのI/Oコマンドを含みます。非同期メソッドは関連する関数をコントローラーで開始し、Spelクラスインスタンスが関数の完了を示すEpson RC+サーバープロセスからのイベントを待ちます。非同期メソッドはすべてのロボット動作コマンドを含みます。コマンドの完了を待つ間、SpelクラスインスタンスはユーザーGUIを応答可能に保つためにWindowsイベントを送信します。例えばGoメソッドを呼び出す場合、ロボットがポイントに移動している間に、ボタンをクリックすることでロボットを停止できます。DisableMsgDispatchをTrueに設定することで、非同期メソッド中のWindowsイベントの送信を無効にできます。また、AsyncModeをTrueに設定することで、プログラム中で非同期メソッドが完了するのを待つこともできます。
マルチスレッドの使用
アプリケーションの複数のスレッドでSpelメソッドを実行できます。この項では、様々な使用場面について説明します。
1つのSpelクラスインスタンスを複数のスレッドで使用する
複数のスレッドで、同一のSpelクラスインスタンスを使用してメソッドを実行できますが、1度に実行できる非同期コマンドは1つだけです。すでに他のスレッドで非同期コマンドを実行している場合に別のスレッドで非同期コマンドを実行しようとすると、"コマンド実行中"エラーが発生します。他のスレッドで非同期コマンドを実行中に即時コマンドを実行することは可能です。
各スレッドで個別のSpelクラスインスタンスを使用する
それぞれのコントローラー接続で、1つかそれ以上のSpelクラスインスタンスを利用できます。各コントローラーの最初のインスタンスでEpson RC+ 8.0のサーバープロセスを初期化し、指定したコントローラーに接続します。同じコントローラーと通信するために、追加のインスタンスを別のスレッドで使用するには、ServerInstanceプロパティーに同じ値を指定する必要があります。追加のSpelクラスインスタンスを使用する前に、最初のインスタンスに対してInitializeを呼び出します。
VB 例:
' スレッド1のSpelクラスインスタンスを初期化
m_spel_1 = New Spel
m_spel_1.ServerInstance = 1
m_spel_1.Initialize()
m_spel_1.Project = "c:\EpsonRC80\Projects\MyProject\MyProject.sprj"
m_spel_1.Connect(1)
' スレッド2のSpelクラスインスタンスを初期化
' このインスタンスはm_spel_1と同じコントローラーを使用
m_spel_2 = New Spel
m_spel_2.ServerInstance = 1
スレッド1
' 動作にm_spel_1のインスタンスを使用
m_spel_1.Robot = 1
Do
m_spel_1.Go(1)
m_spel_1.Go(2)
Loop Until m_stop
スレッド 2
' I/Oにm_spel_2のインスタンスを使用
Do
m_spel_2.On(1)
m_spel_2.Delay(500)
m_spel_2.Off(1)
m_spel_2.Delay(500)
Loop Until m_stop
C# 例:
// スレッド1のSpelクラスインスタンスを初期化
RCAPINet.Spel m_spel_1 = new RCAPINet.Spel();
m_spel_1.ServerInstance = 1;
m_spel_1.Initialize();
m_spel_1.Project = @"c:\EpsonRC80\Projects\MyProject\MyProject.sprj";
m_spel_1.Connect(1);
// スレッド2のSpelクラスインスタンスを初期化
// このインスタンスはm_spel_1と同じコントローラーを使用
RCAPINet.Spel m_spel_2 = new RCAPINet.Spel();
m_spel_2.ServerInstance = 1;
スレッド1
// 動作にm_spel_1のインスタンスを使用
m_spel_1.Robot = 1;
do{
m_spel_1.Go(1);
m_spel_1.Go(2);
}while(\!m_stop);
スレッド2
// I/Oにm_spel_2のインスタンスを使用
do{
m_spel_2.On(1);
m_spel_2.Delay(500);
m_spel_2.Off(1);
m_spel_2.Delay(500);
}while(\!m_stop);
コントローラーでAPIスレッドを使用する
デフォルトでは、1つのAPIスレッドのみコントローラーでサポートしています。この場合、複数のロボットを操作する場合でも、非同期メソッドは1度に1つ実行されます。これは、1台のロボットを使用したり、SPEL+タスクでロボット動作を実行する多くのアプリケーションでは十分ですが、1台のコントローラーで複数のロボットを操作する場合には、.NETスレッドで並列処理を行うために最大10個のAPIタスクを使用できるように設定できます。
コントローラーで1つ以上のAPIタスクを使用するには、以下の2つの手順が必要です。
- Epson RC+ GUIでコントローラーに接続し、[セットアップ]-[システム設定]-[コントローラー]-[環境設定]を開きます。"RC+ API用タスク数"から必要なタスク数を選択します。タスク数が増えると、SPEL+プログラムで使用できるタスクの数が少なくなります。例えば、API用タスク数に5を指定すると、SPEL+では27個 (32 - 5) のタスクが使用できます。
- アプリケーションでCommandTaskプロパティーを設定し、どのAPIタスクに対してメソッドを実行するか指定します。
以下の例では、同じコントローラー内のそれぞれのロボットに対してスレッドを使用します。各スレッドで異なるCommandTaskを使用するため、ロボット動作コマンドは並列で実行され、両方のSpelインスタンスに対してServerInstanceに1が設定されます。
VB 例:
' スレッド1のSpelクラスインスタンスを初期化
m_spel_1 = New Spel
m_spel_1.ServerInstance = 1
m_spel_1.CommandTask = 1
m_spel_1.Initialize()
m_spel_1.Project = "c:\EpsonRC80\Projects\MyProject\MyProject.sprj"
m_spel_1.Connect(1)
' スレッド2のSpelクラスインスタンスを初期化
' このインスタンスはm_spel_1と同じコントローラーを使用し、
' コントローラーの2番目のCommandTaskを使用する
m_spel_2 = New Spel
m_spel_2.ServerInstance = 1
m_spel_2.CommandTask = 2
スレッド1
' Robot 1の動作にm_spel_1のインスタンスを使用する
m_spel_1.Robot = 1
Do
m_spel_1.Go(1)
m_spel_1.Go(2)
Loop Until m_stop
スレッド2
' Robot 2の動作にm_spel_2のインスタンスを使用する
m_spel_2.Robot = 2
Do
m_spel_2.Go(1)
m_spel_2.Go(2)
Loop Until m_stop
C# 例:
// スレッド1のSpelクラスインスタンスを初期化
RCAPINet.Spel m_spel_1 = new RCAPINet.Spel();
m_spel_1.ServerInstance = 1;
m_spel_1.CommandTask = 1;
m_spel_1.Initialize();
m_spel_1.Project = @"c:\EpsonRC80\Projects\MyProject\MyProject.sprj";
m_spel_1.Connect(1);
// スレッド2のSpelクラスインスタンスを初期化
// このインスタンスはm_spel_1と同じコントローラーを使用し、
// コントローラーの2番目のCommandTaskを使用する
RCAPINet.Spel m_spel_2 = new RCAPINet.Spel();
m_spel_2.ServerInstance = 1;
m_spel_2.CommandTask = 2;
スレッド1
// Robot 1の動作にm_spel_1のインスタンスを使用する
m_spel_1.Robot = 1;
do{
m_spel_1.Go(1);
m_spel_1.Go(2);
}while(\!m_stop);
スレッド2
// Robot 2の動作にm_spel_2のインスタンスを使用する
m_spel_2.Robot = 2;
do{
m_spel_2.Go(1);
m_spel_2.Go(2);
}while(\!m_stop);