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"  // 引入 STATUS_CODE,用于检查 SDK 调用结果
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;  // 示例正常结束
}  // 结束示例主函数

场景化示例

下面几组片段按 “查询运行状态、执行脚本、读取点位、维护点位、控制程序” 交叉覆盖本页 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;
}