七、作业文件操作(nrc_job_operate.h)
功能概述
作业文件(.JBR)是控制器的核心程序文件,由多条指令组成。本模块提供作业文件的上传/下载/新建/删除/打开、运行控制(运行/单步/暂停/继续/停止)、内容读取与编辑(按行查询/删除/插入指令)等完整操作能力。
作业文件生命周期: 上传/新建 → 打开 → 编辑(插入/修改指令)→ 运行 → 暂停/继续 → 停止
7.1 作业文件管理
job_get_all_jobfile_name
获取所有作业文件名。
函数原型:
Result job_get_all_jobfile_name(SOCKETFD socketFd, std::vector<std::vector<std::string>>& robotsFile);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotsFile | std::vector<std::vector<std::string>>& | 输出参数,二维数组,一维长度 4,对应 4 个机器人的作业文件列表 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
std::vector<std::vector<std::string>> files;
Result result = job_get_all_jobfile_name(fd, files);
if (result == SUCCESS) {
printf("机器人1的作业文件: \n");
for (const auto& name : files[0]) {
printf(" %s\n", name.c_str());
}
}job_upload_by_directory
根据文件夹上传一整个文件夹的作业文件。
函数原型:
Result job_upload_by_directory(SOCKETFD socketFd, const std::string& directoryPath);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| directoryPath | const std::string& | 目录的完整路径 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
Result result = job_upload_by_directory(fd, "C:/jobs/robot1");job_upload_by_file
根据文件名上传一个作业文件。
函数原型:
Result job_upload_by_file(SOCKETFD socketFd, const std::string& filePath);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| filePath | const std::string& | 文件的完整路径 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
Result result = job_upload_by_file(fd, "C:/jobs/main.JBR");job_sync_job_file
上传作业文件后同步刷新示教器文件列表。
函数原型:
Result job_sync_job_file(SOCKETFD socketFd);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
调用
job_upload_by_directory/job_upload_by_file后建议调用本接口刷新示教器显示。
job_download_by_directory
下载所有作业文件到指定文件夹。
函数原型:
Result job_download_by_directory(SOCKETFD socketFd, const std::string& directoryPath, bool isCover);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| directoryPath | const std::string& | 目录的完整路径 |
| isCover | bool | 是否覆盖已存在的文件 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
log_download_by_quantity
下载指定数量的日志文件到指定文件夹。
函数原型:
Result log_download_by_quantity(SOCKETFD socketFd, int counts, const std::string& directoryPath);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| counts | int | 文件数量 |
| directoryPath | const std::string& | 目录的完整路径 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
backup_system
一键备份系统,保存至当前执行程序目录下。
函数原型:
Result backup_system(SOCKETFD socketFd);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
job_create / job_create_robot
新建作业文件。
函数原型:
Result job_create(SOCKETFD socketFd, const std::string& jobName);
Result job_create_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| jobName | const std::string& | 作业文件名,只允许字母开头,字母数字组合 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
// 新建 QQQ.JBR
Result result = job_create(fd, "QQQ");job_delete / job_delete_robot
删除指定的作业文件。
函数原型:
Result job_delete(SOCKETFD socketFd, const std::string& jobName);
Result job_delete_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| jobName | const std::string& | 作业文件名 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
// 删除 QQQ.JBR
Result result = job_delete(fd, "QQQ");job_open / job_open_robot
打开指定的作业文件(打开后才能进行内容读取/编辑操作)。
函数原型:
Result job_open(SOCKETFD socketFd, const std::string& jobName);
Result job_open_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| jobName | const std::string& | 作业文件名 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
// 打开 QQQ.JBR
Result result = job_open(fd, "QQQ");7.2 作业内容操作
job_get_command_total_lines / job_get_command_total_lines_robot
获取当前打开作业文件的总行数。
函数原型:
Result job_get_command_total_lines(SOCKETFD socketFd, int& totalLines);
Result job_get_command_total_lines_robot(SOCKETFD socketFd, int robotNum, int& totalLines);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| totalLines | int& | 输出参数,总行数 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
int total = 0;
Result result = job_get_command_total_lines(fd, total);
printf("作业文件共 %d 行\n", total);job_get_command_content_by_line / job_get_command_content_by_line_robot
获取指定行号的作业文件内容。
函数原型:
Result job_get_command_content_by_line(SOCKETFD socketFd, int line, int& commandType, std::string& jobContent);
Result job_get_command_content_by_line_robot(SOCKETFD socketFd, int robotNum, int line, int& commandType, std::string& jobContent);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| line | int | 行号 |
| commandType | int& | 输出参数,指令类型 |
| jobContent | std::string& | 输出参数,该行指令内容 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
int cmdType = 0;
std::string content;
Result result = job_get_command_content_by_line(fd, 3, cmdType, content);
if (result == SUCCESS) {
printf("第3行: %s\n", content.c_str());
}job_delete_command_by_line / job_delete_command_by_line_robot
删除指定行号的指令。
函数原型:
Result job_delete_command_by_line(SOCKETFD socketFd, int line);
Result job_delete_command_by_line_robot(SOCKETFD socketFd, int robotNum, int line);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| line | int | 要删除的行号 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
7.3 作业运行控制
job_run / job_run_robot
运行指定的作业文件。
函数原型:
Result job_run(SOCKETFD socketFd, const std::string& jobName);
Result job_run_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| jobName | const std::string& | 作业文件名 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
// 运行 QQQ.JBR
Result result = job_run(fd, "QQQ");job_step / job_step_robot
单步运行指定的作业文件的某一行。
函数原型:
Result job_step(SOCKETFD socketFd, const std::string& jobName, int line);
Result job_step_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName, int line);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| jobName | const std::string& | 作业文件名 |
| line | int | 行号,范围 [1, 最大行号] |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
// 单步运行 QQQ.JBR 的第一行
Result result = job_step(fd, "QQQ", 1);job_pause / job_pause_robot
暂停当前运行的作业文件。
函数原型:
Result job_pause(SOCKETFD socketFd);
Result job_pause_robot(SOCKETFD socketFd, int robotNum);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
job_continue / job_continue_robot
继续运行暂停的作业文件。
函数原型:
Result job_continue(SOCKETFD socketFd);
Result job_continue_robot(SOCKETFD socketFd, int robotNum);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
需要运行模式。
job_stop / job_stop_robot
停止作业文件(不会下电)。
函数原型:
Result job_stop(SOCKETFD socketFd);
Result job_stop_robot(SOCKETFD socketFd, int robotNum);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
job_run_times / job_run_times_robot
设置作业文件运行次数。
函数原型:
Result job_run_times(SOCKETFD socketFd, int index);
Result job_run_times_robot(SOCKETFD socketFd, int robotNum, int index);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| index | int | 运行次数,0=无限次 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
job_break_point_run / job_break_point_run_robot
断点续跑指定的作业文件(从上次中断位置继续运行)。
函数原型:
Result job_break_point_run(SOCKETFD socketFd, const std::string& jobName);
Result job_break_point_run_robot(SOCKETFD socketFd, int robotNum, const std::string& jobName);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| jobName | const std::string& | 作业文件名 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
需要运行模式。
job_get_current_file / job_get_current_file_robot
获取当前打开的作业文件名称(std::string 版本)。
函数原型:
Result job_get_current_file(SOCKETFD socketFd, std::string& jobName);
Result job_get_current_file_robot(SOCKETFD socketFd, int robotNum, std::string& jobName);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| jobName | std::string& | 输出参数,当前打开的作业文件名 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
job_get_current_file_csharp / job_get_current_file_csharp_robot
获取当前打开的作业文件名称(std::vector<char> 版本,供 C# 使用)。
函数原型:
Result job_get_current_file_csharp(SOCKETFD socketFd, std::vector<char>& jobName);
Result job_get_current_file_csharp_robot(SOCKETFD socketFd, int robotNum, std::vector<char>& jobName);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| jobName | std::vector<char>& | 输出参数,当前打开的作业文件名 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
job_get_current_line / job_get_current_line_robot
获取当前打开的作业文件运行到的行数。
函数原型:
Result job_get_current_line(SOCKETFD socketFd, int& line);
Result job_get_current_line_robot(SOCKETFD socketFd, int robotNum, int& line);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| line | int& | 输出参数,运行到的行数 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
7.4 点位操作
job_insert_local_position / job_insert_local_position_robot
作业文件插入一个局部点位。
函数原型:
Result job_insert_local_position(SOCKETFD socketFd, PositionData posData);
Result job_insert_local_position_robot(SOCKETFD socketFd, int robotNum, PositionData posData);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| posData | PositionData | 位置数据 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
job_set_local_position / job_set_local_position_robot
根据点位名修改当前作业文件局部点位。
函数原型:
Result job_set_local_position(SOCKETFD socketFd, const std::string& posName, std::vector<double> posInfo);
Result job_set_local_position_robot(SOCKETFD socketFd, int robotNum, const std::string& posName, std::vector<double> posInfo);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| posName | const std::string& | 需要修改的点位名 |
| posInfo | std::vector<double> | 点位数据,长度 14:[0]坐标系(0=关节,1=直角,2=工具,3=用户);[1]角度制(0)/弧度制(1);[2]形态;[3]工具手坐标序号;[4]用户坐标序号;[5][6]备用;[7-13]点位信息 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
7.5 运动指令插入
向作业文件指定行号插入运动指令,所有接口均提供 _robot 版本。
| 接口 | 指令 | 说明 |
|---|---|---|
job_insert_moveJ | MoveJ | 关节运动指令 |
job_insert_moveL | MoveL | 直线运动指令 |
job_insert_moveC | MoveC | 圆弧运动指令 |
job_insert_imove | IMOVE | 增量运动指令(moveCmd.targetPosType = 3,moveCmd.targetPosName = "RP0001") |
job_insert_moveComm | moveComm | 外部点指令,moveType 为插补方式 "MovJ"/"MovL",参数含速度/加速度/减速度/时间/平滑度 |
job_insert_samov_command | SAMOV | 定点移动指令(点位数据用 PositionData) |
job_insert_EImoveL | EImoveL | 外部轴直线运动 |
job_insert_EImoveC | EImoveC | 外部轴圆弧运动 |
job_insert_EImoveCA | EImoveCA | 外部轴圆弧绝对运动 |
moveJ/moveL/moveC 函数原型:
Result job_insert_moveJ(SOCKETFD socketFd, int line, MoveCmd moveCmd);
Result job_insert_moveL(SOCKETFD socketFd, int line, MoveCmd moveCmd);
Result job_insert_moveC(SOCKETFD socketFd, int line, MoveCmd moveCmd);moveComm 函数原型:
Result job_insert_moveComm(SOCKETFD socketFd, int line, std::string moveType, double m_vel, double m_acc, double m_dec, int m_time, int m_pl);使用示例(插入 MoveJ 指令):
MoveCmd cmd;
cmd.coord = 0; // 关节坐标
cmd.velocity = 80; // 速度 80%
cmd.acc = 50;
cmd.dec = 50;
// 在第 5 行插入 MoveJ 指令
Result result = job_insert_moveJ(fd, 5, cmd);7.6 延迟、IO、逻辑控制指令插入
| 接口 | 指令 | 说明 |
|---|---|---|
job_insert_timer_command | TIMER | 延时指令,time 单位秒 |
job_insert_io_out_command | IO_OUT | IO 输出指令,参数 IOCommandParams |
job_insert_until | UNTIL | 直到循环开始(条件组 + 逻辑类型) |
job_insert_end_until | END_UNTIL | 直到循环结束 |
job_insert_while | WHILE | 条件循环开始 |
job_insert_end_while | END_WHILE | 条件循环结束 |
job_insert_if | IF | 条件判断开始 |
job_insert_end_if | END_IF | 条件判断结束 |
job_insert_label | LABEL | 标签指令,label 为标签名 |
job_insert_jump | JUMP | 跳转指令(条件组 + 跳转条件标志 + 目标标签) |
条件指令通用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| conditionGroups | std::vector<std::vector<Condition>> | 条件组的二维向量 |
| logic | std::vector<int> | 第一层逻辑类型,0=与,1=或 |
| logicGroup | std::vector<std::vector<int>> | 第二层逻辑类型,0=与,1=或 |
使用示例(插入延时指令):
// 在第 3 行插入 2 秒延时
Result result = job_insert_timer_command(fd, 3, 2.0);使用示例(插入 IF 指令):
std::vector<std::vector<Condition>> conds; // 构造条件组...
std::vector<int> logic = {0}; // 第一层"与"
std::vector<std::vector<int>> logicGroup = {{0}};
Result result = job_insert_if(fd, 5, conds, logic, logicGroup);7.7 工艺指令插入
视觉工艺指令
| 接口 | 指令 | 说明 |
|---|---|---|
job_insert_vision_craft_start | VISION_RUN | 开始视觉,参数 id 为工艺号 |
job_insert_vision_craft_get_pos | VISION_POS | 获取视觉位置,posName 为存放位置变量名(如 GP0001) |
job_insert_vision_craft_trajectory | VISION_TARCE | 获取视觉轨迹位置(24.03 可用),参数 VisualTrajectoryPosition |
job_insert_vision_craft_visual_trigger | VISION_POS | 触发视觉,参数 id 为工艺号 |
job_insert_vision_craft_visual_end | VISION_END | 视觉结束,参数 id 为工艺号 |
使用示例:
// 在第 5 行插入视觉开始指令(工艺号 1)
Result result = job_insert_vision_craft_start(fd, 5, 1);传送带工艺指令
| 接口 | 指令 | 说明 |
|---|---|---|
job_insert_conveyor_check_pos | CONVEYOR_CHECKPOS | 传送带工件检测开始 |
job_insert_conveyor_check_end | CONVEYOR_CHECKEND | 传送带工件检测结束 |
job_insert_conveyor_on | CONVEYOR_ON | 传送带跟踪开始(posTtype:0=手动传点位,1=默认工件点;vel 范围 [2,2000]mm/s;acc 范围 [1,100]%) |
job_insert_conveyor_off | CONVEYOR_OFF | 传送带跟踪结束 |
job_insert_conveyor_pos | CONVEYOR_POS | 获取传送带跟踪位置,posName 为全局点位名 |
job_insert_conveyor_clear | CONVEYOR_POS | 清除传送带跟踪目标(removeType:0=全部目标,1=本次目标) |
job_insert_conveyor_wait | CONVEYOR_Wait | 传送带等料(24.03 可用),参数含超时时间/来料结果/来料位置 |
CONVEYOR_ON 函数原型:
Result job_insert_conveyor_on(SOCKETFD socketFd, int line, int id, int postype, std::vector<double> pos, int vel, int acc);使用示例:
// 在第 8 行插入传送带跟踪开始(工艺号 1,使用工件点,速度 500mm/s)
std::vector<double> pos(14, 0);
Result result = job_insert_conveyor_on(fd, 8, 1, 1, pos, 500, 50);相贯线与独立轴指令
| 接口 | 指令 | 说明 |
|---|---|---|
job_insert_cil | CIL | 相贯线指令(MoveCmd + 工艺号) |
job_insert_axis_motion_position | 轴点动 | 轴点到点运行控制(AXISPostion) |
job_insert_axis_motion_velocity | 轴恒转速 | 轴恒转速控制(AxisVelocity) |
job_insert_axis_motion_torque | 轴恒转矩 | 轴恒转矩控制(AxisTorque) |
job_insert_axis_motion_stop | 轴停止 | 轴运动停止,axisNum 为轴号 |
job_insert_axis_motion_cancel_independent_control | 取消独立控制 | 取消独立轴控制,axisNum 为轴号 |
job_insert_axis_motion_speed_judge | 轴速度判断 | 轴运动速度判断(Axisspeedjudge) |
job_insert_axis_motion_position_stop | 主轴准停 | 主轴准停指令,angle 为准停角度 |
7.8 多机协调指令插入
job_insert_tasks / job_insert_tasks_rbobt
插入声明协调参数指令。
函数原型:
Result job_insert_tasks(SOCKETFD socketFd, int line, int crafId, std::vector<int> robotGroup);
Result job_insert_tasks_rbobt(SOCKETFD socketFd, int robotNum, int line, int crafId, std::vector<int> robotGroup);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| line | int | 插入位置 |
| crafId | int | 协调任务号,范围 1-999 |
| robotGroup | std::vector<int> | 需要同步的机器人组,传入需要同步的机器人编号 1-4 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
// 声明协调任务 1,同步机器人 1 和 2
std::vector<int> group = {1, 2};
Result result = job_insert_tasks(fd, 10, 1, group);job_insert_wait_sync_task / job_insert_wait_sync_task_rbobt
插入等待任务同步点指令。
函数原型:
Result job_insert_wait_sync_task(SOCKETFD socketFd, int line, int crafId, std::string waitSignal);
Result job_insert_wait_sync_task_rbobt(SOCKETFD socketFd, int robotNum, int line, int crafId, std::string waitSignal);参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| socketFd | SOCKETFD | 连接句柄 |
| robotNum | int | 机器人编号 (1-4),仅 _robot 版本 |
| line | int | 插入位置 |
| crafId | int | 协调任务号,范围 1-999 |
| waitSignal | std::string | 同步信号量 |
返回值: SUCCESS(0) 表示成功,负数表示失败。
使用示例:
// 等待协调任务 1 的同步信号 "SYNC_1"
Result result = job_insert_wait_sync_task(fd, 12, 1, "SYNC_1");