执行方法
Spel 类中有多种方法。有关可使用方法的介绍,请参阅以下内容。
Spel 类方法
执行一种方法时,将在与控制器通信并执行相关函数的 Epson RC+ 服务器进程中调用相关内部函数。共有两种类型的方法:立即和异步。对于立即方法:在控制器执行内部函数,并立即返回回复。立即命令包括所有 I/O 命令。对于异步方法,在控制器开始相关函数,然后 Spel 类实例等待从 Epson RC+ 服务器进程返回表示函数完成的事件。异步方法包括所有机器人动作命令。在等待命令完成过程中,Spel 类实例发送 Windows 事件,使用户 GUI 仍然可响应。例如调用 Go 方法时,机器人正在移动至一点,用户可通过点击按钮使其停止。可以通过将 DisableMsgDispatch 设为 True,在异步方法时禁用 Windows 事件发送。也可以通过将 AsyncMode 设为 True,等待程序中的异步方法完成。
使用多线程
可以在应用中的多线程执行 Spel 方法。以下章节中将介绍各种场景。
在多线程使用一个 Spel 类实例
可以在多线程使用相同 Spel 类实例执行方法,但每次仅可执行一个异步命令。如果试图在一个线程执行异步命令时已经在另一个线程中执行了另一个异步命令,将得到“command in cycle”错误。可以在一个线程中执行立即命令,即使是在另一个线程中执行异步命令期间。
在各线程中使用独立 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
' 对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 线程
默认为控制器仅支持一个 API 线程。在这种情况下,即使在控制多个机器人时,控制器中异步方法每次执行一个。对于使用一个机器人或使用 SPEL+ 任务执行机器人动作的大部分应用,这已足够,但在例如从同一控制器控制多个机器人等情况下,可以将系统配置为在控制器最多使用 10 个 API 任务,允许 .NET 线程并行处理。
要在控制器中使用多个 API 任务,需要两个基本步骤。
- 在 Epson RC+ GUI 中连接控制器,然后打开[Setup]-[System Configuration]-[Controller]-[Preferences]。将“Reserved tasks for API”设为所需的 API 任务数量。请注意,预留的 API 任务越多,SPEL+ 程序中可以使用的任务越少。例如,如果预留 5 个 API 任务,则 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 相同的控制器
' 使用控制器的第二个 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 相同的控制器
// 使用控制器的第二个 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);