執行方法

Spel類別具有多種方法。有關的可用方法,請參閱以下內容。
Spel類別方法
執行方法時,關聯的內部函數會在Epson RC+伺服器程序中調用,接著與控制器進行通信以執行關聯的函數。方法有以下兩種:立即和非同步。使用立即方法時,內部函數會在控制器中執行並且會立即傳回回覆。立即命令包含所有I/O命令。使用非同步方法時,關聯的函數會在控制器中啟動,然後Spel類別執行個體會等待來自Epson RC+伺服器程序的事件指出函數已完成。非同步方法包含所有機器人動作命令。當等待命令完成時,Spel類別執行個體會發送Windows事件,讓使用者GUI保持回應。例如:當調用Go方法時,機器人會移至指定點,使用者可能會想按一下按鈕來停止移動。您可將DisableMsgDispatch設為True,即可在執行非同步方法時停用Windows事件發送。您也可以將AsyncMode設為True,等待非同步方法在程式中完成。

使用多執行緒

您可在應用程式中以多執行緒執行Spel方法。下列章節說明各種案例。
一個Spel類別執行個體用於多執行緒
您可在多執行緒中使用相同的Spel類別執行個體來執行方法,但一次只能執行一個非同步命令。如果您嘗試在一個執行緒中執行非同步命令,但同時已經有另一個非同步命令在其他執行緒中執行,將會發生「命令循環中」錯誤。當在其他執行緒中執行非同步命令時,您可執行立即命令。
獨立Spel類別執行個體用於每個執行緒
對於每個控制器連線,您可以有一或多個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  
' 將m_spel_2執行個體用於I/O  
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  
// 將m_spel_2執行個體用於I/O  
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執行緒
根據預設,控制器僅支援一個API執行緒。在此範例中,即使控制多個機器人,在控制器中一次只執行一個非同步方法。對於使用一個機器人或以SPEL+任務執行機器人動作的大多數應用,此設定便以足夠,但您可將系統設為最多在控制器中使用10個API任務,用以平行處理您的.NET執行緒,例如從相同控制器控制多個機器人時。

若要在控制器中使用多個API任務,必須執行兩個基本步驟。

  1. 在Epson RC+ GUI中,連接至控制器,然後開啟[Setup]-[System Configuration]-[Controller]-[Preferences]。將「Reserved tasks for API」設為所需的API任務數量。請注意,您保留的API任務越多,SPEL+程式可使用的任務就越少。例如:如果您保留5個API任務,則SPEL+可使用27個任務(32 – 5)。
  2. 在應用程式中,設定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相同的控制器,  
' 並在控制器中使用第二個CommandTask。  
m_spel_2 = New Spel  
m_spel_2.ServerInstance = 1  
m_spel_2.CommandTask = 2  
  
執行緒1  
‘ 將m_spel_1執行個體用於Robot 1動作  
m_spel_1.Robot = 1  
Do  
m_spel_1.Go(1)  
m_spel_1.Go(2)  
Loop Until m_stop  
執行緒2  
‘ 將m_spel_2執行個體用於Robot 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相同的控制器,  
//  並在控制器中使用第二個CommandTask。  
RCAPINet.Spel m_spel_2 = new RCAPINet.Spel();  
m_spel_2.ServerInstance = 1;  
m_spel_2.CommandTask = 2;  
  
執行緒1  
// 將m_spel_1執行個體用於Robot 1動作  
m_spel_1.Robot = 1;  
do{  
m_spel_1.Go(1);  
m_spel_1.Go(2);  
}while(\!m_stop);  
  
執行緒2  
// 將m_spel_2執行個體用於Robot 2動作  
m_spel_2.Robot = 2;  
do{  
m_spel_2.Go(1);  
m_spel_2.Go(2);  
}while(\!m_stop);