Skip to content

4.3 로봇 프로그램 실행 수업

개요

Execution 클래스는 로봇 프로그램 및 모션 작업을 위한 통합 예약 인터페이스를 제공합니다. 다음을 담당합니다.

  • /stopping/pausing/resuming 교육 프로그램 시작
  • 동시 실행 작업 목록 관리
  • 사용자 정의 BAS 스크립트 흐름 실행

ArmMotion 와 결합된 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+

예제 코드

Execution/ProgramExecution.cs
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+

예제 코드

Execution/ExecuteBasScript.cs
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;
    }
}