Skip to content

3.5 ProgramManager Class

Overview

ProgramManager handles program start/stop, running-program queries, program pose read/write, and BasScript execution. After Arm is connected, access the instance through arm.programManager ; no separate initialization is required.

3.5.1 Program Execution Control

3.5.1.1 Start Program

cpp
Start(const std::string& programName) -> STATUS_CODE
ItemDescription
DescriptionStarts the specified program
Request ParametersprogramName : std::string program name
Return ValueSTATUS_CODE: function execution result
NotesReturns PROGRAM_NOT_FOUND if the program does not exist
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.1.2 Stop Program

cpp
Stop(const std::string& programName = "") -> STATUS_CODE
ItemDescription
DescriptionStops the specified program. If the program name is empty, stops the currently running program
Request ParametersprogramName : std::string program name, optional
Return ValueSTATUS_CODE: function execution result
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.1.3 Pause Program

cpp
Pause(const std::string& programName = "") -> STATUS_CODE
ItemDescription
DescriptionPauses the specified program. If the program name is empty, pauses the currently running program
Request ParametersprogramName : std::string program name, optional
Return ValueSTATUS_CODE: function execution result
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.1.4 Resume Program

cpp
Resume(const std::string& programName = "") -> STATUS_CODE
ItemDescription
DescriptionResumes the specified program. If the program name is empty, resumes the currently paused program
Request ParametersprogramName : std::string program name, optional
Return ValueSTATUS_CODE: function execution result
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.1.5 Get All Running Programs

cpp
AllRunningPrograms() -> std::pair<std::vector<RunningProgramInfo>, STATUS_CODE>
ItemDescription
DescriptionGets the current list of all running programs
Request ParametersNone
Return Valuestd::vector<RunningProgramInfo> : running program list
STATUS_CODE: function execution result
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.2 Execute BasScript

3.5.2.1 Execute Script Text Lines

cpp
ExecuteBasScript(const std::vector<std::string>& scriptLines) -> STATUS_CODE
ItemDescription
DescriptionExecutes script text lines directly
Request ParametersscriptLines : std::vector<std::string> list of script text lines
Return ValueSTATUS_CODE: function execution result
NotesExecutes the text exactly as provided by the caller
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.2.2 Execute Builder-Generated Script

cpp
ExecuteBasScript(const BasScript& basScript) -> STATUS_CODE
ItemDescription
DescriptionExecutes a script generated by the builder
Request ParametersbasScript : script object generated by the BasScript builder
Return ValueSTATUS_CODE: function execution result
NotesWhen BasScript is passed, closure validation is performed first, and the execution path automatically appends RETURN / END
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.3 Program Poses

3.5.3.1 Read Program Pose

cpp
PoseRead(const std::string& programName, int32_t index, ProgramType programType = ProgramType::USER) -> std::pair<ProgramPose, STATUS_CODE>
ItemDescription
DescriptionReads the specified pose from the specified program
Request ParametersprogramName : std::string program name
index : int32_t pose index
programType : ProgramType program type, default USER
Return ValueProgramPose: program pose
STATUS_CODE: function execution result
NotesReturns PROGRAM_NOT_FOUND if the program does not exist, and PROGRAM_POSE_NOT_FOUND if the pose does not exist
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.3.2 Write Program Pose

cpp
PoseWrite(const std::string& programName, int32_t index, const ProgramPose& value, ProgramType programType = ProgramType::USER) -> STATUS_CODE
ItemDescription
DescriptionWrites the specified pose to the specified program
Request ParametersprogramName : std::string program name
index : int32_t pose index
value : ProgramPose pose value
programType : ProgramType program type, default USER
Return ValueSTATUS_CODE: function execution result
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.3.3 Add Program Pose

cpp
PoseAdd(const std::string& programName, int32_t index, const ProgramPose& value, ProgramType programType = ProgramType::USER) -> STATUS_CODE
ItemDescription
DescriptionAdds a pose at the specified position
Request ParametersprogramName : std::string program name
index : int32_t pose index
value : ProgramPose pose value
programType : ProgramType program type, default USER
Return ValueSTATUS_CODE: function execution result
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.3.4 Read All Program Poses

cpp
PoseReadAll(const std::string& programName, ProgramType programType = ProgramType::USER) -> std::pair<std::vector<ProgramPose>, STATUS_CODE>
ItemDescription
DescriptionReads all poses from the specified program
Request ParametersprogramName : std::string program name
programType : ProgramType program type, default USER
Return Valuestd::vector<ProgramPose> : pose list
STATUS_CODE: function execution result
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.3.5 Batch Write Program Poses

cpp
PoseWriteBatch(const std::string& programName, const std::vector<ProgramPose>& posesToUpdate) -> STATUS_CODE
ItemDescription
DescriptionBatch-writes program poses
Request ParametersprogramName : std::string program name
posesToUpdate : std::vector<ProgramPose> pose list
Return ValueSTATUS_CODE: function execution result
NotesBlock programs are not supported and return UNSUPPORTED_FILETYPE ; missing programs return PROGRAM_NOT_FOUND
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

3.5.3.6 Pose Type Conversion

cpp
PoseConvert(const ProgramPose& pose, PoseType fromType, PoseType toType) -> std::pair<ProgramPose, STATUS_CODE>
ItemDescription
DescriptionConverts a pose from one type to another
Request Parameterspose : ProgramPose to convert
fromType : PoseType source type
toType : PoseType target type
Return ValueProgramPose: converted pose
STATUS_CODE: function execution result
Compatible Robot Software VersionsCollaborative (Copper): v7.5.0.0+
Industrial (Bronze): v7.5.0.0+

PoseWriteBatch Boundaries

ItemDescription
User programSupported
Block programNot supported; returns UNSUPPORTED_FILETYPE
Program does not existReturns PROGRAM_NOT_FOUND

Minimal Call Example

cpp
#include <iostream>      // Standard output stream for printing program and pose results
#include "arm_api.h"    // Arm entry point; after connection, program and motion APIs are available
#include "status_code.h" // STATUS_CODE for checking SDK call results

int 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;
}

Scenario Examples

The snippets below cover running-state queries, script execution, pose reads, pose maintenance, and program control. They assume the arm object from the minimal example is already connected. Calls that change program or robot state remain commented out; run them only after checking the site.

Query Running Programs

cpp
auto [runningPrograms, runningRet] = arm.programManager.AllRunningPrograms();
if (runningRet == STATUS_CODE::OK) {
    std::cout << "running_program_count=" << runningPrograms.size() << "\n";
}

Execute BasScript

cpp
std::vector<std::string> scriptLines = {"WAIT 0.1"};
// STATUS_CODE execLinesRet = arm.programManager.ExecuteBasScript(scriptLines);
BasScript script("demo.bas");
STATUS_CODE waitRet = script.structure.WaitTime(ValueType::VALUE, Float64{0.1});
if (waitRet != STATUS_CODE::OK) {
    return;
}
// STATUS_CODE execScriptRet = arm.programManager.ExecuteBasScript(script);

Read and Convert Program Poses

cpp
const std::string programName = "demo_program";
auto [poseFromProgram, readRet] = arm.programManager.PoseRead(programName, 0, ProgramType::USER);
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";
}

Maintain Program Poses

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});

Control Program Execution

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);

Example code:

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;
}