4.3 로봇 프로그램 실행 수업
개요
Execution 클래스는 로봇 프로그램 및 모션 작업을 위한 통합 예약 인터페이스를 제공합니다. 다음을 담당합니다.
- /stopping/pausing/resuming 교육 프로그램 시작
- 동시 실행 작업 목록 관리
- 사용자 정의 BAS 스크립트 흐름 실행
Arm 및 Motion 와 결합된 Execution 는 호스트 측 트리거링과 컨트롤러 측 프로그램 흐름 제어를 처리합니다.
4.3.1 지정된 프로그램 실행
| 메서드 이름 | Execution.Start(string programName ) |
|---|---|
| 설명 | 지정된 프로그램을 실행합니다. |
| 요청 매개변수 | programName : 문자열 실행할 프로그램 이름 |
| 반환 값 | StatusCode: 작업 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.3.2 현재 실행 중인 프로그램 중지
| 메서드 이름 | Execution.Stop(string programName = null) |
|---|---|
| 설명 | 현재 실행 중인 프로그램을 중지하거나 로봇의 현재 동작 명령을 중지합니다. |
| 요청 매개변수 | programName : 문자열 중지할 프로그램 이름, 기본값은 null입니다. 이는 현재 실행 중인 프로그램 또는 모션 명령을 중지함을 의미합니다. |
| 반환 값 | StatusCode: 작업 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.3.3 실행 중인 모든 프로그램의 세부 정보 반환
| 메서드 이름 | Execution.AllRunningPrograms() |
|---|---|
| 설명 | 프로그램 ID 및 프로그램 이름을 포함하여 실행 중인 모든 프로그램에 대한 자세한 정보를 반환합니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | Dictionary<string, int>: 프로그램 ID에서 프로그램 이름으로 매핑 StatusCode: 연산 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.3.4 프로그램 실행 일시 중지
| 메서드 이름 | Execution.Pause(string programName = null) |
|---|---|
| 설명 | 현재 실행 중인 프로그램을 일시 정지하거나 로봇의 현재 동작을 일시 정지합니다. |
| 요청 매개변수 | programName : 문자열 일시 중지할 프로그램의 이름입니다. 통과하지 못한 경우 기본값은 현재 실행 중인 프로그램 또는 실행 중인 작업을 제어하는 것입니다. |
| 반환 값 | StatusCode: 작업 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.3.5 프로그램 실행 재개
| 메서드 이름 | Execution.Resume(string programName = null) |
|---|---|
| 설명 | 일시정지된 상태에서 프로그램을 계속 실행합니다. |
| 요청 매개변수 | programName : 문자열 재개할 프로그램 이름, 기본값은 null입니다. 즉, 현재 일시 중지된 프로그램 또는 모션 명령을 재개한다는 의미입니다. |
| 반환 값 | StatusCode: 작업 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Types;
public class ProgramExecution
{
/// <summary>
/// 测试程序执行完整流程功能
/// 验证程序的启动、暂停、恢复和停止等完整操作流程
/// </summary>
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
Console.WriteLine("开始程序执行完整流程/Starting Program Execution Complete Flow");
// [ZH] 获取测试文件路径
// [EN] Get test file path
string file_user_program = GetTestFilePath("test_prog.xml");
// [ZH] 设置程序名称
// [EN] Set program name
string progName = "test_prog";
// [ZH] 上传用户程序文件
// [EN] Upload user program file
code = controller.FileManager.Upload(file_user_program, FileType.UserProgram, true);
if (code == StatusCode.OK)
{
Console.WriteLine($"用户程序文件上传成功/User Program File Upload Success: {progName}");
}
else
{
Console.WriteLine($"用户程序文件上传失败/User Program File Upload Failed: {code.GetDescription()}");
return code;
}
// [ZH] 等待
// [EN] Wait
Thread.Sleep(3000);
// [ZH] 启动程序
// [EN] Start program
code = controller.Execution.Start(progName);
if (code == StatusCode.OK)
{
Console.WriteLine($"程序启动成功/Program Started Successfully: {progName}");
}
else
{
Console.WriteLine($"程序启动失败/Program Start Failed: {code.GetDescription()}");
return code;
}
Thread.Sleep(2000);
// [ZH] 获取所有正在运行的程序列表
// [EN] Get all running programs list
Dictionary<string, int> progList;
(progList, code) = controller.Execution.AllRunningPrograms();
if (code == StatusCode.OK)
{
Console.WriteLine("获取运行程序列表成功/Get Running Programs List Success");
Console.WriteLine($"运行程序数量/Running Programs Count: {progList.Count}");
foreach (var prog in progList)
{
Console.WriteLine($" 程序/Program: {prog.Key}, 状态/Status: {prog.Value}");
}
}
else
{
Console.WriteLine($"获取运行程序列表失败/Get Running Programs List Failed: {code.GetDescription()}");
return code;
}
Thread.Sleep(2000);
// [ZH] 暂停程序
// [EN] Pause program
code = controller.Execution.Pause(progName);
if (code == StatusCode.OK)
{
Console.WriteLine($"程序暂停成功/Program Paused Successfully: {progName}");
}
else
{
Console.WriteLine($"程序暂停失败/Program Pause Failed: {code.GetDescription()}");
return code;
}
Thread.Sleep(2000);
// [ZH] 恢复程序
// [EN] Resume program
code = controller.Execution.Resume(progName);
if (code == StatusCode.OK)
{
Console.WriteLine($"程序恢复成功/Program Resumed Successfully: {progName}");
}
else
{
Console.WriteLine($"程序恢复失败/Program Resume Failed: {code.GetDescription()}");
return code;
}
Thread.Sleep(2000);
// [ZH] 停止程序
// [EN] Stop program
code = controller.Execution.Stop(progName);
if (code == StatusCode.OK)
{
Console.WriteLine($"程序停止成功/Program Stopped Successfully: {progName}");
}
else
{
Console.WriteLine($"程序停止失败/Program Stop Failed: {code.GetDescription()}");
return code;
}
// [ZH] 删除用户程序文件
// [EN] Delete user program file
code = controller.FileManager.Delete(progName, FileType.UserProgram);
if (code == StatusCode.OK)
{
Console.WriteLine($"用户程序文件删除成功/User Program File Delete Success: {progName}");
}
else
{
Console.WriteLine($"用户程序文件删除失败/User Program File Delete Failed: {code.GetDescription()}");
return code;
}
Console.WriteLine("程序执行完整流程结束/Program Execution Complete Flow Test Completed");
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
if (disconnectCode != StatusCode.OK)
{
Console.WriteLine(disconnectCode.GetDescription());
if (code == StatusCode.OK)
code = disconnectCode;
}
}
return code;
}
/// <summary>
/// 获取test_files文件夹中文件的路径示例方法
/// 展示如何获取当前程序目录下的test_files文件夹中的文件路径
/// </summary>
private static string GetTestFilePath(string fileName)
{
// [ZH] 获取当前程序集的目录
// [EN] Get current assembly directory
string? codeFilePath = new System.Diagnostics.StackTrace(true).GetFrame(0)?.GetFileName();
if (string.IsNullOrEmpty(codeFilePath))
{
throw new InvalidOperationException("无法获取当前文件路径/Cannot get current file path");
}
string? codeDirectory = Path.GetDirectoryName(codeFilePath);
if (string.IsNullOrEmpty(codeDirectory))
{
throw new InvalidOperationException("无法获取当前目录路径/Cannot get current directory path");
}
// [ZH] 构建test_files文件夹路径
// [EN] Build test_files folder path
string testFilesDirectory = Path.Combine(codeDirectory, "test_files");
// [ZH] 构建文件完整路径
// [EN] Build complete file path
string filePath = Path.Combine(testFilesDirectory, fileName);
return filePath;
}
}4.3.6 BAS 스크립트 프로그램 실행
| 메서드 이름 | Execution.ExecuteBasScript(BasScript script ) |
|---|---|
| 설명 | 사용자 정의 BAS 스크립트 프로그램을 실행합니다. |
| 요청 매개변수 | script : BasScript 사용자 정의 BAS 스크립트 프로그램 |
| 반환 값 | StatusCode: 작업 실행 결과 |
| 메모 | BAS 스크립트 프로그램 일시 중지, 재개 및 중지 방법은 일반 프로그램과 동일합니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 산업용 로봇: v7.6.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.BasScript;
using Agilebot.IR.Execution;
using Agilebot.IR.Types;
public class ExecuteBasScript
{
/// <summary>
/// 测试执行Bas脚本功能
/// 验证能否成功执行包含条件判断、运动控制和赋值操作的Bas脚本
/// </summary>
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
Console.WriteLine("开始执行Bas脚本程序/Starting Execute BasScript");
// [ZH] 创建BAS脚本程序
// [EN] Create BAS script program
BasScript script = new BasScript("test_bas");
// [ZH] 添加条件判断到脚本
// [EN] Add conditional statement to script
code = script.Logical.IF(RegisterType.R, 1, OtherType.VALUE, 0);
if (code != StatusCode.OK)
{
Console.WriteLine($"添加条件判断失败/Add Conditional Statement Failed: {code.GetDescription()}");
return code;
}
// [ZH] 添加运动控制到脚本
// [EN] Add motion control to script
BasScript.ExtraParam param = new BasScript.ExtraParam();
param.Acceleration(80);
code = script.Motion.MoveJoint(
MovePoseType.PR,
1,
SpeedType.VALUE,
30,
SmoothType.SD,
10,
extraParam: param
);
if (code != StatusCode.OK)
{
Console.WriteLine($"添加运动控制失败/Add Motion Control Failed: {code.GetDescription()}");
return code;
}
// [ZH] 添加赋值操作到脚本
// [EN] Add assignment operation to script
code = script.AssignValue(AssignType.R, 1, 99);
if (code != StatusCode.OK)
{
Console.WriteLine($"添加赋值操作失败/Add Assignment Operation Failed: {code.GetDescription()}");
return code;
}
// [ZH] 结束条件判断
// [EN] End conditional statement
code = script.Logical.END_IF();
if (code != StatusCode.OK)
{
Console.WriteLine($"结束条件判断失败/End Conditional Statement Failed: {code.GetDescription()}");
return code;
}
// [ZH] 等待上一个测试结束
// [EN] Wait for previous test to end
Thread.Sleep(1000);
// [ZH] 执行BAS脚本程序
// [EN] Execute BAS script program
code = controller.Execution.ExecuteBasScript(script);
if (code == StatusCode.OK)
{
Console.WriteLine("BAS脚本执行成功/Execute BasScript Success");
Console.WriteLine(
"脚本包含条件判断、运动控制和赋值操作/Script includes conditional statements, motion control and assignment operations"
);
}
else
{
Console.WriteLine($"BAS脚本执行失败/Execute BasScript Failed: {code.GetDescription()}");
}
Console.WriteLine("执行Bas脚本测试完成/Execute BasScript Test Completed");
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
if (disconnectCode != StatusCode.OK)
{
Console.WriteLine(disconnectCode.GetDescription());
if (code == StatusCode.OK)
code = disconnectCode;
}
}
return code;
}
}