七、作业文件操作(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 作业运行控制
断点与续跑
哪些操作会清除断点、续跑为什么会失败、什么时候该从头运行,见 §7.9 断点与续跑。
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_get_command_total_lines。
| 接口 | 指令 | 说明 |
|---|---|---|
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");7.9 断点与续跑
断点续跑能省掉现场重新对位的时间,但断点什么时候会丢一直没有成文口径,导致「昨天还能续跑,今天不行」。本节说明断点的产生、清除条件、续跑与从头启动。
上位机侧只有续跑入口,断点由控制器管理
断点是控制器侧状态,清除条件由控制器决定。本节涉及的 NRC_* 接口属控制器二开 API(不在 nrc_*.h 里),见控制器 · 作业文件-指令操作;上位机侧的续跑入口只有 job_break_point_run。
断点是什么
- 作业运行过程中,控制器会记录「当前作业文件 + 当前行号 + 运行上下文」,用于中断后从原位置继续。
- 断点属于控制器侧状态,不是上位机保存的;上位机断开连接、重启程序不会清除断点。
- 是否允许续跑,取决于断点是否仍然「有效」(见下方「旧断点失效」)。
断点清除条件
下表为现场确认口径,按触发类型分组。固件版本不同可能有增删,升级后请以实测为准。
一、正常与人工操作
| 条件 | 说明 |
|---|---|
| 作业正常运行结束 | 跑完即无断点 |
| 急停,且配置了 IO 复位 | 复位动作会清断点 |
| 在示教器上导入程序 | 覆盖作业内容 |
使用 startOver=true 从头启动 | JSON 协议重头运行见程序运行控制 |
| 回复位点 / 执行复位程序 | 现场恢复流程的一部分 |
二、旧断点失效(断点还在,但判定为不可恢复)
出现任一情况,控制器不再允许从旧断点续跑:
- 没有原运行上下文(控制器重启后上下文丢失);
- 作业文件名不一致;
- 断点行号小于 1;
- 当前行所属作业与断点记录的作业不一致;
- 断点保存模式与当前模式不同;
- 调用程序或子程序被修改;
- 工艺状态不允许恢复。
三、异常与失败
| 条件 | 说明 |
|---|---|
| 作业打开失败、文件为空、语法错误、插补错误等异常退出 | 运行未正常建立 |
| 断点续跑计算失败或恢复超时 | 续跑请求本身失败 |
四、配置与模式变更
| 条件 | 说明 |
|---|---|
| 修改机型、轴映射、DH、关节参数 | 机器人对象重建,断点上下文失效 |
| 切换追加运行等特殊模式 | 与作业运行上下文不兼容 |
五、接口主动触发
| 条件 | 说明 |
|---|---|
自定义错误 NRC_TriggerErrorReport(控制器侧接口) | 会主动发送清断点命令,见控制器 · 作业文件-指令操作 |
| 带「保留断点」语义的错误上报接口(控制器侧) | 按版本提供,是否可用见本节「版本差异与待核」 |
续跑与从头启动
| 需求 | 做法 | 说明 |
|---|---|---|
| 从中断位置继续 | job_break_point_run(jobName) | 需要运行模式,见 §7.3 |
| 从头重新跑 | job_run + JSON 协议 startOver=1 | C++ 接口无 startOver 参数,重头运行走 JSON 协议或先停止再运行 |
| 只跑一步 | job_step | 调试用,不产生可续跑断点 |
判断能否续跑
先确认两件事:作业文件没被改过(内容/子程序)、机器人配置没动过。这两条命中「旧断点失效」或「配置与模式变更」的任一条件,续跑都会失败,直接从头跑更快。
常见场景处置
| 场景 | 建议动作 |
|---|---|
| 客户现场断电后想续跑 | 控制器重启会丢上下文,按「旧断点失效」判断;不行就从头跑并检查安全点位 |
| 示教点位改了,想接着跑 | 改点位属于修改作业,断点失效,需从头运行 |
| 报错提示后作业停了,想续跑 | 若用的是 NRC_TriggerErrorReport,断点已被清除;改用保留断点的上报方式(按版本) |
| 换了机器人配置/换了机型 | 断点必然失效,重新运行 |
| 续跑接口返回失败 | 先用 job_get_current_file / job_get_current_line 看当前状态,再决定是否从头运行 |
相关接口
| 接口 | 用途 | 前置 |
|---|---|---|
job_run / job_run_robot | 运行作业 | 作业已上传 |
job_step | 单步 | 运行模式 |
job_pause / job_continue | 暂停 / 继续 | 作业运行中 |
job_stop | 停止 | — |
job_run_times | 设置循环次数 | 0=无限次 |
job_break_point_run | 断点续跑 | 运行模式 |
job_get_current_file / job_get_current_line | 查当前作业与行号 | — |
版本差异与待核
- 「保留断点的错误上报」接口(
NRC_TriggerErrorReportKeepBreakpoint)在客户群中已被提及为新增能力,但当前仓库文档与头文件中尚未收录,使用前请向研发确认所在版本,不要按本节描述直接调用。 - 断点清除条件清单来自现场核对,个别条目(如「切换追加运行」)与固件版本相关,升级后建议回归验证。
- 断点是否跨控制器重启保留,各版本行为不一致,属待补项。