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); // 停止指定程序会改变程序运行状态,确认现场后再执行示例代码
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;
}