作业运动控制接口

头文件: cpp/interface/nrc_job_operate.h 及 cpp/parameter/nrc_interface_parameter.h

1. job_insert_moveJ - 作业里添加关节运动关节空间运动

方法: int job_insert_moveJ(SOCKETFD socket_fd, int line, const MoveCmd& move_cmd);

功能描述: 在作业文件指定行插入一条关节空间运动(MoveJ)指令,需使用P变量模式。

参数:

  • socket_fd:已连接的句柄
  • line:行号(从1开始)
  • move_cmd:运动命令结构体,需设置以下成员:
    • targetPosType:设为PosType::PType
    • targetPosName:点位变量名,如"P0001"
    • coord:0(关节坐标系)
    • targetPosValue:std::vector<double>,长度至少6,存储目标角度(度)
    • velocity:速度百分比(1~100)
    • acc、dec:加速度/减速度百分比
    • pl:平滑度(0表示精确到达)

返回值:

  • int
    • 0:成功
    • 负值:失败(行号越界、参数错误等)

使用示例:

C++
bool test_insert_moveJ(int line, const std::vector<double>& angles,
                     int vel = 20, int acc = 20, int dec = 20,
                     const std::string& pos_name = "P0001") {
    if (socket_fd_6001_ <= 0) return false;
    // 实例化并初始化 MoveCmd 运动命令结构体
    MoveCmd cmd;
    cmd.targetPosType  = PosType::PType;    // 设置目标位置类型为关节变量类型(P变量)
    cmd.targetPosName  = pos_name;          // 指定目标位置在作业程序中的点位名称
    cmd.coord          = 0;                // 指定参考坐标系(0通常代表关节或基坐标系)
    cmd.velocity       = vel;               // 设置运动速度百分比
    cmd.acc            = acc;               // 设置加速百分比
    cmd.dec            = dec;               // 设置减速百分比
    cmd.pl             = 0;                 // 设置平滑过渡等级(0代表精准到位,不拐弯)
    cmd.targetPosValue = angles;            // 写入各关节的目标角度数据向量
    // 传入控制端口句柄和指定的行号,调用底层接口在作业程序中插入该条关节运动(MoveJ)指令
    int ret = job_insert_moveJ(socket_fd_6001_, line, cmd);
    CHECK_RET(ret, "在第" + std::to_string(line) + "行插入MoveJ");
    return ret == SUCCESS;
}

完整作业里添加关节运动关节空间运动示例见使用示例6


2. job_insert_moveL - 作业里添加关节运动笛卡尔空间直线运动

方法: int job_insert_moveL(SOCKETFD socket_fd, int line, const MoveCmd& move_cmd);

功能描述: 插入笛卡尔空间直线运动(MoveL)指令。

参数:

  • socket_fd:已连接的句柄
  • line:行号(从1开始)
  • move_cmd:运动命令结构体,需设置以下成员:
    • targetPosType:设为PosType::PType
    • targetPosName:点位变量名,如"P0001"
    • coord:1(直角坐标系)
    • targetPosValue:[X(mm), Y(mm), Z(mm), RX(rad), RY(rad), RZ(rad)]
    • velocity:速度百分比(1~100)
    • acc、dec:加速度/减速度百分比
    • pl:平滑度(0表示精确到达)

返回值:

  • int
    • 0:成功
    • 负值:失败

使用示例:

C++
bool test_insert_moveL(int line, const std::vector<double>& pos,
                     int vel = 20, int acc = 20, int dec = 20,
                     const std::string& pos_name = "P0002") {
    if (socket_fd_6001_ <= 0) return false;
    // 实例化并初始化 MoveCmd 运动命令结构体
    MoveCmd cmd;
    cmd.targetPosType  = PosType::PType;    // 设置目标位置类型为变量类型(P变量)
    cmd.targetPosName  = pos_name;          // 指定目标位置在作业程序中的点位名称
    cmd.coord          = 1;                // 指定参考坐标系(直线运动通常基于1:基坐标系/直角坐标系)
    cmd.velocity       = vel;               // 设置运动速度百分比/绝对速度
    cmd.acc            = acc;               // 设置加速百分比
    cmd.dec            = dec;               // 设置减速百分比
    cmd.pl             = 0;                 // 设置平滑过渡等级(0代表精准到位)
    cmd.targetPosValue = pos;               // 写入目标点位的数据向量(通常为直角坐标 [X, Y, Z, RX, RY, RZ])
    // 传入控制端口句柄和指定的行号,调用底层接口在作业程序中插入该条直线运动(MoveL)指令
    int ret = job_insert_moveL(socket_fd_6001_, line, cmd);
    CHECK_RET(ret, "在第" + std::to_string(line) + "行插入MoveL");
    return ret == SUCCESS;
}

完整作业里添加关节运动笛卡尔空间直线运动示例见使用示例6


3. job_insert_moveC - 作业里添加关节运动笛卡尔空间圆弧运动

方法: int job_insert_moveC(SOCKETFD socket_fd, int line, const MoveCmd& move_cmd);

功能描述: 插入笛卡尔空间圆弧运动(MoveC)指令。通常需要连续插入两条MoveC指令,第一条为圆弧中间点,第二条为终点。

参数:

  • socket_fd:已连接的句柄
  • line:行号(从1开始)
  • move_cmd:运动命令结构体,需设置以下成员:
    • targetPosType:设为PosType::PType
    • targetPosName:点位变量名,如"P0001"
    • coord:1(直角坐标系)
    • targetPosValue:[X(mm), Y(mm), Z(mm), RX(rad), RY(rad), RZ(rad)](终点坐标)
    • velocity:速度百分比(1~100)
    • acc、dec:加速度/减速度百分比
    • pl:平滑度(0表示精确到达)

返回值:

  • int
    • 0:成功
    • 负值:失败

使用示例:

C++
bool test_insert_moveC(int line, const std::vector<double>& pos,
                     int vel = 20, int acc = 20, int dec = 20,
                     const std::string& pos_name = "P0003") {
    if (socket_fd_6001_ <= 0) return false;
    // 实例化并初始化 MoveCmd 运动命令结构体
    MoveCmd cmd;
    cmd.targetPosType  = PosType::PType;    // 设置目标位置类型为变量类型(P变量)
    cmd.targetPosName  = pos_name;          // 指定目标位置在作业程序中的点位名称
    cmd.coord          = 1;                // 指定参考坐标系(圆弧运动通常基于1:基坐标系/直角坐标系)
    cmd.velocity       = vel;               // 设置运动速度
    cmd.acc            = acc;               // 设置加速百分比
    cmd.dec            = dec;               // 设置减速百分比
    cmd.pl             = 0;                 // 设置平滑过渡等级(0代表精准到位)
    cmd.targetPosValue = pos;               // 写入目标点位的数据向量(通常为直角坐标 [X, Y, Z, RX, RY, RZ])
    // 传入控制端口句柄和指定的行号,调用底层接口在作业程序中插入该条圆弧运动(MoveC)指令
    int ret = job_insert_moveC(socket_fd_6001_, line, cmd);
    CHECK_RET(ret, "在第" + std::to_string(line) + "行插入MoveC");
    return ret == SUCCESS;
}

完整作业里添加关节运动笛卡尔空间圆弧运动示例见使用示例6


4. job_open - 打开指定作业文件

方法: int job_open(SOCKETFD socket_fd, const std::string& job_name);

功能描述: 打开已存在的作业文件,使其成为当前激活程序(后续插入指令将写入该文件)。

参数:

  • socket_fd:已连接的句柄
  • job_name:作业文件名(如"MY_JOB"或"MY_JOB.JOB")

返回值:

  • int
    • 0:成功
    • 负值:失败(文件不存在等)

使用示例:

C++
bool test_open_job(const std::string& job_name) {
    if (socket_fd_6001_ <= 0) return false;
    // 传入控制端口句柄和指定的作业名称,调用底层接口加载并打开该作业程序
    int ret = job_open(socket_fd_6001_, job_name);
    CHECK_RET(ret, "打开作业 " + job_name);
    return ret == SUCCESS;
}

5. job_create - 创建作业文件名

方法: int job_create(SOCKETFD socket_fd, const std::string& job_name);

功能描述: 在控制器内新建一个空的作业文件(自动防止重名)。

参数:

  • socket_fd:已连接的句柄
  • job_name:作业文件名

返回值:

  • int
    • 0:成功
    • 负值:失败(如文件已存在)

使用示例:

C++
std::string jobName = "MY_JOB";
int ret = job_create(fd6001, jobName);
if (ret == SUCCESS) {
    std::cout << "成功创建作业文件: " << jobName << std::endl;
}

6. job_get_all_jobfile_name - 获取全部作业文件名

方法: int job_get_all_jobfile_name(SOCKETFD socket_fd, std::vector<std::vector<std::string>>& robots_file);

功能描述: 获取控制器内所有作业文件列表(按机器人分组,通常只有一组)。

参数:

  • socket_fd:已连接的句柄
  • robots_file:输出参数,二维字符串数组,每个元素是一个分组内的文件名列表

返回值:

  • int
    • 0:成功
    • 负值:失败

使用示例:

C++
bool test_get_all_jobfile_name() {
    if (socket_fd_6001_ <= 0) return false;
    // 传入控制端口句柄,获取嵌套的二维向量数据(外层为机器人/分组,内层为文件名列表)
    std::vector<std::vector<std::string>> robots_file;
    int ret = job_get_all_jobfile_name(socket_fd_6001_, robots_file);
    if (ret == SUCCESS) {
        std::cout << "[成功] 获取所有作业文件名成功" << std::endl;
        // 遍历每个机器人分组的文件列表
        size_t group_idx = 0;
        for (const auto& files : robots_file) {
            std::cout << "分组/机器人 [" << group_idx++ << "] 的文件列表:" << std::endl;
            // 若当前分组的文件列表为空,打印提示;否则遍历输出所有文件名
            if (files.empty()) {
                std::cout << "  (无文件)" << std::endl;
            } else {
                for (const auto& file_name : files) {
                    std::cout << "  - " << file_name << std::endl;
                }
            }
        }
        return true;
    }
    // 获取失败,打印对应的错误码
    std::cout << "[失败] 获取所有作业文件名失败,错误码: " << ret << std::endl;
    return false;
}

7. job_run - 启动指定作业文件

方法: int job_run(SOCKETFD socket_fd, const std::string& job_name);

功能描述: 启动运行已打开的作业文件。

参数:

  • socket_fd:已连接的句柄
  • job_name:作业文件名

返回值:

  • int
    • 0:成功
    • 负值:失败(文件未打开、未使能等)

使用示例:

C++
bool test_run_job(const std::string& job_name) {
    if (socket_fd_6001_ <= 0) return false;
    // 传入控制端口句柄和指定的作业名称,调用底层接口启动并执行该作业程序
    int ret = job_run(socket_fd_6001_, job_name);
    CHECK_RET(ret, "运行作业 " + job_name);
    return ret == SUCCESS;
}