头文件: 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表示精确到达)
返回值:
使用示例:
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表示精确到达)
返回值:
使用示例:
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表示精确到达)
返回值:
使用示例:
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")
返回值:
使用示例:
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:作业文件名
返回值:
使用示例:
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:输出参数,二维字符串数组,每个元素是一个分组内的文件名列表
返回值:
使用示例:
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:作业文件名
返回值:
使用示例:
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;
}