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| Item | Description |
|---|---|
| Description | Starts the specified program |
| Request Parameters | programName : std::string program name |
| Return Value | STATUS_CODE: function execution result |
| Notes | Returns PROGRAM_NOT_FOUND if the program does not exist |
| Compatible Robot Software Versions | Collaborative (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| Item | Description |
|---|---|
| Description | Stops the specified program. If the program name is empty, stops the currently running program |
| Request Parameters | programName : std::string program name, optional |
| Return Value | STATUS_CODE: function execution result |
| Compatible Robot Software Versions | Collaborative (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| Item | Description |
|---|---|
| Description | Pauses the specified program. If the program name is empty, pauses the currently running program |
| Request Parameters | programName : std::string program name, optional |
| Return Value | STATUS_CODE: function execution result |
| Compatible Robot Software Versions | Collaborative (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| Item | Description |
|---|---|
| Description | Resumes the specified program. If the program name is empty, resumes the currently paused program |
| Request Parameters | programName : std::string program name, optional |
| Return Value | STATUS_CODE: function execution result |
| Compatible Robot Software Versions | Collaborative (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>| Item | Description |
|---|---|
| Description | Gets the current list of all running programs |
| Request Parameters | None |
| Return Value | std::vector<RunningProgramInfo> : running program list STATUS_CODE: function execution result |
| Compatible Robot Software Versions | Collaborative (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| Item | Description |
|---|---|
| Description | Executes script text lines directly |
| Request Parameters | scriptLines : std::vector<std::string> list of script text lines |
| Return Value | STATUS_CODE: function execution result |
| Notes | Executes the text exactly as provided by the caller |
| Compatible Robot Software Versions | Collaborative (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| Item | Description |
|---|---|
| Description | Executes a script generated by the builder |
| Request Parameters | basScript : script object generated by the BasScript builder |
| Return Value | STATUS_CODE: function execution result |
| Notes | When BasScript is passed, closure validation is performed first, and the execution path automatically appends RETURN / END |
| Compatible Robot Software Versions | Collaborative (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>| Item | Description |
|---|---|
| Description | Reads the specified pose from the specified program |
| Request Parameters | programName : std::string program name index : int32_t pose index programType : ProgramType program type, default USER |
| Return Value | ProgramPose: program pose STATUS_CODE: function execution result |
| Notes | Returns PROGRAM_NOT_FOUND if the program does not exist, and PROGRAM_POSE_NOT_FOUND if the pose does not exist |
| Compatible Robot Software Versions | Collaborative (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| Item | Description |
|---|---|
| Description | Writes the specified pose to the specified program |
| Request Parameters | programName : std::string program name index : int32_t pose index value : ProgramPose pose value programType : ProgramType program type, default USER |
| Return Value | STATUS_CODE: function execution result |
| Compatible Robot Software Versions | Collaborative (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| Item | Description |
|---|---|
| Description | Adds a pose at the specified position |
| Request Parameters | programName : std::string program name index : int32_t pose index value : ProgramPose pose value programType : ProgramType program type, default USER |
| Return Value | STATUS_CODE: function execution result |
| Compatible Robot Software Versions | Collaborative (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>| Item | Description |
|---|---|
| Description | Reads all poses from the specified program |
| Request Parameters | programName : std::string program name programType : ProgramType program type, default USER |
| Return Value | std::vector<ProgramPose> : pose list STATUS_CODE: function execution result |
| Compatible Robot Software Versions | Collaborative (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| Item | Description |
|---|---|
| Description | Batch-writes program poses |
| Request Parameters | programName : std::string program name posesToUpdate : std::vector<ProgramPose> pose list |
| Return Value | STATUS_CODE: function execution result |
| Notes | Block programs are not supported and return UNSUPPORTED_FILETYPE ; missing programs return PROGRAM_NOT_FOUND |
| Compatible Robot Software Versions | Collaborative (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>| Item | Description |
|---|---|
| Description | Converts a pose from one type to another |
| Request Parameters | pose : ProgramPose to convert fromType : PoseType source type toType : PoseType target type |
| Return Value | ProgramPose: converted pose STATUS_CODE: function execution result |
| Compatible Robot Software Versions | Collaborative (Copper): v7.5.0.0+ Industrial (Bronze): v7.5.0.0+ |
PoseWriteBatch Boundaries
| Item | Description |
|---|---|
| User program | Supported |
| Block program | Not supported; returns UNSUPPORTED_FILETYPE |
| Program does not exist | Returns 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:
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;
}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;
}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;
}