Skip to content

3.5 ProgramManager 프로그램 클래스

개요

ProgramManager 은 프로그램 시작/정지, 실행 중인 프로그램 조회, 프로그램 포즈 읽기/쓰기, BasScript 실행을 담당합니다. Arm 연결이 완료된 뒤 arm.programManager 을 통해 Program 인스턴스를 가져오며, 별도 초기화는 필요하지 않습니다.

3.5.1 프로그램 실행 제어

3.5.1.1 프로그램 시작

cpp
Start(const std::string& programName) -> STATUS_CODE
항목설명
설명지정 프로그램을 시작합니다.
요청 파라미터programName : std::string 프로그램 이름
반환값STATUS_CODE: 함수 실행 결과
비고프로그램이 존재하지 않으면 PROGRAM_NOT_FOUND 를 반환합니다.
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.1.2 프로그램 정지

cpp
Stop(const std::string& programName = "") -> STATUS_CODE
항목설명
설명지정 프로그램을 정지합니다. 프로그램 이름이 비어 있으면 현재 실행 중인 프로그램을 정지합니다.
요청 파라미터programName : std::string 프로그램 이름(선택 사항)
반환값STATUS_CODE: 함수 실행 결과
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.1.3 프로그램 일시정지

cpp
Pause(const std::string& programName = "") -> STATUS_CODE
항목설명
설명지정 프로그램을 일시정지합니다. 프로그램 이름이 비어 있으면 현재 실행 중인 프로그램을 일시정지합니다.
요청 파라미터programName : std::string 프로그램 이름(선택 사항)
반환값STATUS_CODE: 함수 실행 결과
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.1.4 프로그램 재개

cpp
Resume(const std::string& programName = "") -> STATUS_CODE
항목설명
설명지정 프로그램을 재개합니다. 프로그램 이름이 비어 있으면 현재 일시정지된 프로그램을 재개합니다.
요청 파라미터programName : std::string 프로그램 이름(선택 사항)
반환값STATUS_CODE: 함수 실행 결과
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.1.5 모든 실행 중 프로그램 가져오기

cpp
AllRunningPrograms() -> std::pair<std::vector<RunningProgramInfo>, STATUS_CODE>
항목설명
설명현재 실행 중인 모든 프로그램 목록을 가져옵니다.
요청 파라미터파라미터 없음
반환값std::vector<RunningProgramInfo> : 실행 중 프로그램 목록
STATUS_CODE: 함수 실행 결과
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.2 BasScript 실행

3.5.2.1 스크립트 텍스트 라인 실행

cpp
ExecuteBasScript(const std::vector<std::string>& scriptLines) -> STATUS_CODE
항목설명
설명스크립트 텍스트 라인을 직접 실행합니다.
요청 파라미터scriptLines : std::vector<std::string> 스크립트 텍스트 라인 목록
반환값STATUS_CODE: 함수 실행 결과
비고호출자가 제공한 텍스트를 추가 처리 없이 그대로 실행합니다.
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.2.2 빌더가 생성한 스크립트 실행

cpp
ExecuteBasScript(const BasScript& basScript) -> STATUS_CODE
항목설명
설명빌더가 생성한 스크립트를 실행합니다.
요청 파라미터basScript : BasScript 빌더가 생성한 스크립트 객체
반환값STATUS_CODE: 함수 실행 결과
비고BasScript 를 전달하면 먼저 닫힘 검증을 수행하며, 실행 경로에서 RETURN / END 를 자동으로 보완합니다.
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.3 프로그램 포즈

3.5.3.1 프로그램 포즈 읽기

cpp
PoseRead(const std::string& programName, int32_t index, ProgramType programType = ProgramType::USER) -> std::pair<ProgramPose, STATUS_CODE>
항목설명
설명지정 프로그램의 지정 포즈를 읽습니다.
요청 파라미터programName : std::string 프로그램 이름
index : int32_t 포즈 인덱스
programType : ProgramType 프로그램 타입(기본값 USER)
반환값ProgramPose: 프로그램 포즈
STATUS_CODE: 함수 실행 결과
비고프로그램이 존재하지 않으면 PROGRAM_NOT_FOUND , 포즈가 존재하지 않으면 PROGRAM_POSE_NOT_FOUND 를 반환합니다.
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.3.2 프로그램 포즈 쓰기

cpp
PoseWrite(const std::string& programName, int32_t index, const ProgramPose& value, ProgramType programType = ProgramType::USER) -> STATUS_CODE
항목설명
설명지정 프로그램의 지정 포즈를 씁니다.
요청 파라미터programName : std::string 프로그램 이름
index : int32_t 포즈 인덱스
value : ProgramPose 포즈 값
programType : ProgramType 프로그램 타입(기본값 USER)
반환값STATUS_CODE: 함수 실행 결과
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.3.3 프로그램 포즈 추가

cpp
PoseAdd(const std::string& programName, int32_t index, const ProgramPose& value, ProgramType programType = ProgramType::USER) -> STATUS_CODE
항목설명
설명지정 위치에 포즈를 추가합니다.
요청 파라미터programName : std::string 프로그램 이름
index : int32_t 포즈 인덱스
value : ProgramPose 포즈 값
programType : ProgramType 프로그램 타입(기본값 USER)
반환값STATUS_CODE: 함수 실행 결과
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.3.4 모든 프로그램 포즈 읽기

cpp
PoseReadAll(const std::string& programName, ProgramType programType = ProgramType::USER) -> std::pair<std::vector<ProgramPose>, STATUS_CODE>
항목설명
설명지정 프로그램의 모든 포즈를 읽습니다.
요청 파라미터programName : std::string 프로그램 이름
programType : ProgramType 프로그램 타입(기본값 USER)
반환값std::vector<ProgramPose> : 포즈 목록
STATUS_CODE: 함수 실행 결과
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.3.5 프로그램 포즈 배치 쓰기

cpp
PoseWriteBatch(const std::string& programName, const std::vector<ProgramPose>& posesToUpdate) -> STATUS_CODE
항목설명
설명프로그램 포즈를 배치로 씁니다.
요청 파라미터programName : std::string 프로그램 이름
posesToUpdate : std::vector<ProgramPose> 포즈 목록
반환값STATUS_CODE: 함수 실행 결과
비고블록 프로그램은 지원하지 않으며 UNSUPPORTED_FILETYPE 을 반환합니다. 프로그램이 존재하지 않으면 PROGRAM_NOT_FOUND 를 반환합니다.
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

3.5.3.6 포즈 타입 변환

cpp
PoseConvert(const ProgramPose& pose, PoseType fromType, PoseType toType) -> std::pair<ProgramPose, STATUS_CODE>
항목설명
설명포즈를 한 타입에서 다른 타입으로 변환합니다.
요청 파라미터pose : ProgramPose 변환할 포즈
fromType : PoseType 소스 타입
toType : PoseType 대상 타입
반환값ProgramPose: 변환된 포즈
STATUS_CODE: 함수 실행 결과
호환 로봇 소프트웨어 버전협동(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

PoseWriteBatch 범위

항목설명
사용자 프로그램지원
블록 프로그램지원하지 않으며 UNSUPPORTED_FILETYPE 반환
프로그램 없음PROGRAM_NOT_FOUND 반환

최소 호출 예제

cpp
#include <iostream>  // 프로그램 및 포즈 결과를 출력하기 위한 표준 출력 스트림을 포함합니다.
#include "arm_api.h"  // Arm 주 진입점을 포함하며, 연결 후 program 및 motion 인터페이스 모듈에 접근합니다.
#include "status_code.h"  // SDK 호출 결과 확인용 STATUS_CODE를 포함합니다.
int main()  // 예제 프로그램 진입점입니다.
{  // 예제 main 함수에 진입합니다.
    Arm arm;  // 로봇 세션 객체를 생성합니다.
    STATUS_CODE connectRet = arm.Connect("192.168.110.2", "");  // 컨트롤러에 연결합니다. 티치 펜던트 주소를 비워 기본 규칙을 사용합니다.
    if (connectRet != STATUS_CODE::OK) {  // 연결 실패 여부를 판단합니다.
        return 1;  // 연결 실패 시 바로 종료합니다.
    }  // 연결 결과 판단을 종료합니다.
    auto [runningPrograms, queryRet] = arm.programManager.AllRunningPrograms();  // 현재 실행 중인 모든 프로그램을 조회합니다.
    if (queryRet != STATUS_CODE::OK) {  // 실행 중 프로그램 조회 실패 여부를 판단합니다.
        return 1;  // 조회 실패 시 오류 코드로 반환합니다.
    }  // 프로그램 조회 판단을 종료합니다.
    auto [jointPose, poseRet] = arm.motionControl.GetCurrentPose(PoseType::JOINT);  // 현재 관절 포즈를 가져와 이후 프로그램 포즈 소스로 사용합니다.
    if (poseRet != STATUS_CODE::OK) {  // 현재 포즈 읽기 실패 여부를 판단합니다.
        return 1;  // 포즈 읽기 실패 시 오류 코드로 반환합니다.
    }  // 포즈 읽기 판단을 종료합니다.
    ProgramPose programPose;  // 프로그램 포즈 객체를 생성합니다.
    programPose.name = "demo_pose";  // 프로그램 포즈 이름을 설정합니다.
    programPose.pose = jointPose;  // 현재 관절 포즈를 프로그램 포즈 객체에 씁니다.
    auto [cartPose, convertRet] = arm.programManager.PoseConvert(  // 프로그램 포즈 변환 인터페이스를 호출합니다.
        programPose,  // 변환할 프로그램 포즈를 전달합니다.
        PoseType::JOINT,  // 소스 포즈 타입을 관절 포즈로 지정합니다.
        PoseType::CART  // 대상 포즈 타입을 직교 좌표 포즈로 지정합니다.
    );  // 프로그램 포즈 변환 호출을 종료합니다.
    if (convertRet != STATUS_CODE::OK) {  // 프로그램 포즈 변환 실패 여부를 판단합니다.
        return 1;  // 변환 실패 시 오류 코드로 반환합니다.
    }  // 변환 결과 판단을 종료합니다.
    std::cout << "running_program_count=" << runningPrograms.size() << "\n";  // 실행 중 프로그램 수를 출력합니다.
    std::cout << "converted_pose_type="  // 변환된 포즈 타입 라벨을 출력합니다.
              << static_cast<int>(cartPose.pose.poseType) << "\n";  // 포즈 타입 열거형 값을 출력하고 줄바꿈합니다.
    return 0;  // 예제를 정상 종료합니다.
}  // 예제 main 함수를 종료합니다.

시나리오 예제

아래 조각들은 "실행 상태 조회, 스크립트 실행, 포즈 읽기, 포즈 유지보수, 프로그램 제어" 흐름으로 이 페이지의 API를 교차해서 다룹니다. 조각들은 최소 호출 예제에서 이미 연결에 성공한 arm 객체를 이어받는다고 가정합니다. 프로그램 또는 로봇 상태를 변경하는 호출은 주석으로 유지되어 있으므로 현장을 확인한 뒤 실행하십시오.

실행 중 프로그램 조회

cpp
auto [runningPrograms, runningRet] = arm.programManager.AllRunningPrograms();  // 현재 실행 중인 프로그램 목록을 조회합니다.
if (runningRet == STATUS_CODE::OK) {  // 실행 중 프로그램 조회 성공 여부를 판단합니다.
    std::cout << "running_program_count=" << runningPrograms.size() << "\n";  // 실행 중 프로그램 수를 출력합니다.
}  // 실행 중 프로그램 조회 판단을 종료합니다.

BasScript 실행

cpp
std::vector<std::string> scriptLines = {"WAIT 0.1"};  // ExecuteBasScript 텍스트 라인 오버로드에 필요한 스크립트 텍스트를 준비합니다.
// STATUS_CODE execLinesRet = arm.programManager.ExecuteBasScript(scriptLines);  // 스크립트 텍스트 라인 실행은 스크립트를 전달하므로 현장을 확인한 뒤 실행하십시오.
BasScript script("demo.bas");  // ExecuteBasScript(BasScript) 오버로드에 필요한 빌더 객체를 준비합니다.
STATUS_CODE waitRet = script.structure.WaitTime(ValueType::VALUE, Float64{0.1});  // 빌더에 대기 문장을 추가합니다.
if (waitRet != STATUS_CODE::OK) {  // 빌더 문장 구성 실패 여부를 판단합니다.
    return;  // 구성 실패 시 현재 흐름을 종료합니다.
}  // 빌더 구성 결과 판단을 종료합니다.
// STATUS_CODE execScriptRet = arm.programManager.ExecuteBasScript(script);  // 빌더 스크립트 실행은 컨트롤러로 전달되므로 현장을 확인한 뒤 실행하십시오.

프로그램 포즈 읽기 및 변환

cpp
const std::string programName = "demo_program";  // 예제 프로그램 이름을 준비합니다. 실제 사용 시 컨트롤러의 프로그램 이름으로 교체합니다.
auto [poseFromProgram, readRet] = arm.programManager.PoseRead(programName, 0, ProgramType::USER);  // 사용자 프로그램의 0번 포즈를 읽습니다.
auto [allPoses, readAllRet] = arm.programManager.PoseReadAll(programName, ProgramType::USER);  // 사용자 프로그램의 모든 포즈를 읽습니다.
if (readRet == STATUS_CODE::OK && readAllRet == STATUS_CODE::OK) {  // 포즈 읽기 성공 여부를 판단합니다.
    std::cout << "pose_name=" << poseFromProgram.name << " pose_count=" << allPoses.size() << "\n";  // 포즈 이름과 포즈 수를 출력합니다.
}  // 포즈 읽기 결과 판단을 종료합니다.
auto [convertedPose, convertRet] = arm.programManager.PoseConvert(poseFromProgram, PoseType::JOINT, PoseType::CART);  // 프로그램 포즈를 관절 포즈에서 직교 좌표 포즈로 변환합니다.
if (convertRet == STATUS_CODE::OK) {  // 포즈 변환 성공 여부를 판단합니다.
    std::cout << "converted_pose_type=" << static_cast<int>(convertedPose.pose.poseType) << "\n";  // 변환된 포즈 타입을 출력합니다.
}  // 포즈 변환 판단을 종료합니다.

프로그램 포즈 유지보수

cpp
const std::string programName = "demo_program";  // 예제 프로그램 이름을 준비합니다. 실제 사용 시 컨트롤러의 프로그램 이름으로 교체합니다.
ProgramPose poseToWrite;  // 쓰기, 추가, 배치 쓰기 예제 포즈를 생성합니다.
poseToWrite.name = "demo_pose";  // 예제 포즈 이름을 설정합니다.
// STATUS_CODE writeRet = arm.programManager.PoseWrite(programName, 0, poseToWrite, ProgramType::USER);  // 포즈 쓰기는 프로그램 내용을 변경하므로 확인한 뒤 실행하십시오.
// STATUS_CODE addRet = arm.programManager.PoseAdd(programName, 1, poseToWrite, ProgramType::USER);  // 포즈 추가는 프로그램 내용을 변경하므로 확인한 뒤 실행하십시오.
// STATUS_CODE batchRet = arm.programManager.PoseWriteBatch(programName, std::vector<ProgramPose>{poseToWrite});  // 포즈 배치 쓰기는 프로그램 내용을 변경하므로 확인한 뒤 실행하십시오.

프로그램 실행 제어

cpp
const std::string programName = "demo_program";  // 예제 프로그램 이름을 준비합니다. 실제 사용 시 컨트롤러의 프로그램 이름으로 교체합니다.
// STATUS_CODE startRet = arm.programManager.Start(programName);  // 지정 프로그램 시작은 컨트롤러가 프로그램을 실행하게 하므로 안전을 확인한 뒤 실행하십시오.
// STATUS_CODE pauseRet = arm.programManager.Pause(programName);  // 지정 프로그램 일시정지는 프로그램 실행 상태를 변경하므로 현장을 확인한 뒤 실행하십시오.
// STATUS_CODE resumeRet = arm.programManager.Resume(programName);  // 지정 프로그램 재개는 프로그램 실행 상태를 변경하므로 현장을 확인한 뒤 실행하십시오.
// STATUS_CODE stopRet = arm.programManager.Stop(programName);  // 지정 프로그램 정지는 프로그램 실행 상태를 변경하므로 현장을 확인한 뒤 실행하십시오.

예제 코드

cpp17/program_execution/src/control_programs/run.cpp
cpp
#include <iostream>
#include "arm_api.h"
#include "status_code.h"

#include "control_programs/run.h"

/**
 * 程序控制门面。
 * @return 0 表示成功,否则返回 1。
 */
int RunProgramExecutionControlPrograms(void)
{
    // [ZH] 连接机器人,请直接修改下面的魔鬼字符串。
    // [EN] Connect to the robot and edit the hard-coded magic strings below directly.
    Arm arm;
    STATUS_CODE connectRet = arm.Connect("10.27.1.2", "10.27.1.102");
    if (connectRet != STATUS_CODE::OK) {
        std::cerr << "[cpp17_program] 连接机器人失败 / Connect to the robot failed, 状态码 / Status code: "
                  << static_cast<int>(connectRet) << "\n";
        return 1;
    }
    std::cout << "[cpp17_program] 机器人连接成功 / Robot connected successfully\n";
    // [ZH] 顺序执行启动、暂停、恢复和停止接口。
    // [EN] Execute the start, pause, resume, and stop APIs in sequence.
    STATUS_CODE startRet = arm.programManager.Start("demo.bas");
    STATUS_CODE pauseRet = arm.programManager.Pause("demo.bas");
    STATUS_CODE resumeRet = arm.programManager.Resume("demo.bas");
    STATUS_CODE stopRet = arm.programManager.Stop("demo.bas");
    std::cout << "[cpp17_program] Start 状态码 / Start status code: " << static_cast<int>(startRet) << "\n";
    std::cout << "[cpp17_program] Pause 状态码 / Pause status code: " << static_cast<int>(pauseRet) << "\n";
    std::cout << "[cpp17_program] Resume 状态码 / Resume status code: " << static_cast<int>(resumeRet) << "\n";
    std::cout << "[cpp17_program] Stop 状态码 / Stop status code: " << static_cast<int>(stopRet) << "\n";

    // [ZH] 断开连接,结束示例。
    // [EN] Disconnect and finish the example.
    arm.Disconnect();
    std::cout << "[cpp17_program] 示例结束 / Example finished\n";
    return 0;
}
cpp17/bas_script_execution/src/build_bas_script/run.cpp
cpp
#include <iostream>
#include <vector>
#include "arm_api.h"
#include "status_code.h"

#include "build_bas_script/run.h"

/**
 * 构造 BAS 脚本门面。
 * @return 0 表示成功,否则返回 1。
 */
int RunBasScriptExecutionBuildBasScript(void)
{
    // [ZH] 连接机器人,请直接修改下面的魔鬼字符串。
    // [EN] Connect to the robot and edit the hard-coded magic strings below directly.
    Arm arm;
    STATUS_CODE connectRet = arm.Connect("10.27.1.2", "10.27.1.102");
    if (connectRet != STATUS_CODE::OK) {
        std::cerr << "[cpp17_bas_script] 连接机器人失败 / Connect to the robot failed, 状态码 / Status code: "
                  << static_cast<int>(connectRet) << "\n";
        return 1;
    }
    std::cout << "[cpp17_bas_script] 机器人连接成功 / Robot connected successfully\n";
    // [ZH] 构造 BAS 脚本对象并覆盖全部脚本构造接口。
    // [EN] Build the BAS script object and cover the script-building APIs.
    BasScript script("example_bas_script.bas");
    ExtraParam extraParam;
    extraParam.Acceleration(20.0);
    extraParam.Rctp();
    extraParam.Offset(1);
    extraParam.Tb(0.5, "DI", "", 1, "ON");
    extraParam.Skip(2);
    extraParam.Approach(5.0, 3.0);
    script.SetParam(ParamType::OVC, ValueType::VALUE, Float64{20.0});
    script.AssignValue(AssignType::R, 1, OtherType::VALUE, Float64{1.0});
    script.AssignValue(AssignType::R, 2, AssignType::MR, int32_t{3});
    script.motion.MoveJoint(MovePoseType::PR, 1, SpeedType::VALUE, 10.0, SmoothType::FINE, 0.0, &extraParam);
    script.motion.MoveLine(MovePoseType::PR, 2, SpeedType::VALUE, 10.0, SmoothType::SMOOTH_DISTANCE, 1.0, &extraParam);
    script.motion.MoveCircle(MovePoseType::PR, 1, MovePoseType::PR, 2, SpeedType::VALUE, 10.0, SmoothType::SMOOTH_DISTANCE, 1.0, &extraParam);
    std::vector<int32_t> jumpIndexList;
    jumpIndexList.push_back(1);
    jumpIndexList.push_back(2);
    jumpIndexList.push_back(3);
    script.motion.MoveJump(MovePoseType::PR, 3, 10.0, 100.0, SpeedType::VALUE, 20.0, SmoothType::FINE, 0.0, &extraParam);
    script.motion.MoveJump3(MovePoseType::PR, jumpIndexList, 10.0, 100.0, SmoothType::FINE, 0.0, &extraParam);
    script.motion.MoveJump3cp(MovePoseType::PR, jumpIndexList, 10.0, SmoothType::FINE, 0.0, &extraParam);
    script.logical.LogiIf(RegisterType::R, 1, OtherType::VALUE, Float64{1.0}, BooleanOperator::EQ);
    script.logical.LogiElseIf(RegisterType::R, 1, OtherType::VALUE, Float64{2.0}, BooleanOperator::EQ);
    script.logical.LogiElse();
    script.logical.LogiEndIf();
    script.logical.LogiSwitch(RegisterType::MR, 1);
    script.logical.LogiCase(OtherType::VALUE, int32_t{1});
    script.logical.LogiDefault();
    script.logical.LogiEndSwitch();
    script.logical.LogiWhile(RegisterType::R, 1, OtherType::VALUE, Float64{10.0}, BooleanOperator::LT);
    script.logical.LogiBreak();
    script.logical.LogiContinue();
    script.logical.LogiEndWhile();
    script.logical.LogiGoto(100);
    script.logical.LogiLabel(100);
    script.logical.LogiSkipCondition(RegisterType::R, 1, OtherType::VALUE, Float64{0.0}, BooleanOperator::EQ);
    script.structure.Wait(RegisterType::R, 1, ValueType::VALUE, Float64{0.5}, BooleanOperator::GE);
    script.structure.WaitTime(ValueType::VALUE, Float64{0.1});
    script.structure.Pause();
    script.structure.Abort();
    script.structure.Call("demo_user_program");
    script.structure.Run("demo_user_program");
    script.structure.Load(LoadType::R, int32_t{1});
    script.structure.Unload(LoadType::R, int32_t{1});
    script.structure.Exec(LoadType::STRING, std::string("demo"));
    script.socket.SocketOpen(1);
    script.socket.SocketConnect(1);
    script.socket.SocketSend(1, StrType::STRING, std::string("hello"));
    script.socket.SocketRecv(1, 16, StrType::SR, int32_t{1});
    script.socket.SocketClose(1);
    script.modbus.ModbusReadMH(1, 1, 0, 1, 1);
    script.modbus.ModbusReadMI(1, 1, 0, 1, 1);
    script.modbus.ModbusWriteMH(1, 1, 0, 1, ValueType::VALUE, 1);
    script.vision.VisionFind("camera_1");
    script.vision.VisionGetOffset("camera_1", 1, 0);
    script.vision.VisionGetQuantity("camera_1", 1);
    std::cout << "[cpp17_bas_script] 脚本文本 / Script text:\n" << script.GetScript() << "\n";

    // [ZH] 断开连接,结束示例。
    // [EN] Disconnect and finish the example.
    arm.Disconnect();
    std::cout << "[cpp17_bas_script] 示例结束 / Example finished\n";
    return 0;
}
cpp17/bas_script_execution/src/execute_bas_script/run.cpp
cpp
#include <iostream>
#include "arm_api.h"
#include "status_code.h"

#include "execute_bas_script/run.h"

/**
 * 执行 BAS 脚本门面。
 * @return 0 表示成功,否则返回 1。
 */
int RunBasScriptExecutionExecuteBasScript(void)
{
    // [ZH] 连接机器人,请直接修改下面的魔鬼字符串。
    // [EN] Connect to the robot and edit the hard-coded magic strings below directly.
    Arm arm;
    STATUS_CODE connectRet = arm.Connect("10.27.1.2", "10.27.1.102");
    if (connectRet != STATUS_CODE::OK) {
        std::cerr << "[cpp17_bas_script] 连接机器人失败 / Connect to the robot failed, 状态码 / Status code: "
                  << static_cast<int>(connectRet) << "\n";
        return 1;
    }
    std::cout << "[cpp17_bas_script] 机器人连接成功 / Robot connected successfully\n";
    // [ZH] 直接执行两种 BAS 脚本接口。
    // [EN] Execute both BAS script APIs directly.
    BasScript script("example_bas_script.bas");
    script.structure.WaitTime(ValueType::VALUE, Float64{0.1});
    script.structure.Abort();
    STATUS_CODE linesRet = arm.programManager.ExecuteBasScript(script.content);
    STATUS_CODE scriptRet = arm.programManager.ExecuteBasScript(script);
    std::cout << "[cpp17_bas_script] ExecuteBasScript(lines) 状态码 / ExecuteBasScript(lines) status code: " << static_cast<int>(linesRet) << "\n";
    std::cout << "[cpp17_bas_script] ExecuteBasScript(script) 状态码 / ExecuteBasScript(script) status code: " << static_cast<int>(scriptRet) << "\n";

    // [ZH] 断开连接,结束示例。
    // [EN] Disconnect and finish the example.
    arm.Disconnect();
    std::cout << "[cpp17_bas_script] 示例结束 / Example finished\n";
    return 0;
}