作业运动控制接口

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

方法: insert_job_moveJ(socket_fd: int, line: int, move_cmd: MoveCmd)

功能描述: 在控制器当前打开的作业(Job)文件指定行号处,以指定的 P 变量点位模式插入一条关节运动(MoveJ)指令。

参数:

  • socket_fd:已连接的机械臂控制器句柄,整型格式(int)。
  • line:准备插入指令的行号(从 1 开始),整型格式(int)。
  • move_cmd(底层输出参数):用于存储运动属性的控制结构体容器(对应代码中的 nrc.MoveCmd()),方法内部自动创建、配置运动参数(包括速度、加减速、P 变量名及关节数据向量)并传入底层接口,无需外部手工创建。

返回值:

  • bool:执行结果布尔值
    • True:插入成功。底层接口返回 0,指令成功写入作业文件。
    • False:插入失败。句柄无效、行号越界、底层接口返回非 0 错误码或触发通信异常。

使用示例:

Python
import nrc_interface as nrc

# 1. 实例化官方定义的运动指令结构体容器
move_cmd = nrc.MoveCmd()

# 2. 精准配置核心测试参数(以 6 轴机械臂为例)
robot_dof = 6
pos = nrc.VectorDouble(robot_dof)
target_angles = [10.0, -20.0, 30.0, 0.0, 90.0, 0.0]  # 测试目标角度

for i in range(robot_dof):
    pos[i] = target_angles[i]

move_cmd.targetPosValue = pos                     # 绑定目标位置向量
move_cmd.targetPosType = 1                       # 核心设置:1 代表使用 P 变量名模式
move_cmd.targetPosName = "P0001"                # 绑定点位变量名
move_cmd.coord = 0                            # 核心设置:0 代表关节坐标系

# 3. 配置运动动力学核心参数
move_cmd.velocity = 5                         # 主运行速度
move_cmd.velocitySync = 5                      # 同步速度
move_cmd.acc = 20                            # 加速度
move_cmd.dec = 20                            # 减速度
move_cmd.pl = 0                              # 平滑度(0代表精准到达,无过渡弧度)

# 4. 调用底层接口向作业文件第 1 行插入该指令
ret = nrc.job_insert_moveJ(socket_fd, 1, move_cmd)

# 5. 校验执行结果并返回布尔状态
if ret == 0:
    print("成功:MoveJ 核心测试指令成功插入到作业文件第 1 行!")
    return True
else:
    print(f"错误:插入 MoveJ 指令失败,底层错误码: {ret}")
    return False

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

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

方法: insert_job_moveL(socket_fd: int, line: int, move_cmd: MoveCmd)

功能描述: 在控制器当前打开的作业(Job)文件指定行号处,以指定的 P 变量(点位变量)模式插入一条笛卡尔空间直线运动(MoveL)指令。

参数:

  • socket_fd:已连接的机械臂控制器句柄,整型(int)。
  • line:插入指令的目标行号(从 1 开始),整型(int)。
  • move_cmd(底层输出参数):运动控制属性结构体容器(对应代码中的 nrc.MoveCmd())。由方法内部自动创建并配置核心数组成员,无需外部手工创建。

返回值:

  • bool:执行结果布尔值
    • True:插入成功。底层接口返回 0,指令已成功写入作业文件。
    • False:插入失败。句柄无效、行号越界、底层接口返回非 0 错误码或触发通信异常。

使用示例:

Python
import nrc_interface as nrc

# 1. 实例化官方定义的运动指令结构体容器
move_cmd = nrc.MoveCmd()

# 2. 精准配置核心测试参数(直角坐标系下通常包含 6 个空间自由度)
coord_len = 6
pos = nrc.VectorDouble(coord_len)
# 测试目标直角坐标数据 [X, Y, Z, Rx, Ry, Rz]
target_coords = [350.0, 0.0, 400.0, 180.0, 0.0, 0.0]

for i in range(coord_len):
    pos[i] = target_coords[i]

move_cmd.targetPosValue = pos                     # 绑定目标直角坐标向量
move_cmd.targetPosType = 1                       # 核心设置:1 代表使用 P 变量名模式
move_cmd.targetPosName = "P0002"                # 绑定点位变量名
move_cmd.coord = 1                            # 核心设置:1 代表直角/笛卡尔坐标系

# 3. 配置运动动力学核心参数
move_cmd.velocity = 20                        # 主运行速度
move_cmd.velocitySync = 20                     # 同步速度
move_cmd.acc = 20                            # 加速度
move_cmd.dec = 20                            # 减速度
move_cmd.pl = 0                              # 平滑度(0代表精准到达直线终点)

# 4. 调用底层接口向作业文件第 1 行插入该指令
ret = nrc.job_insert_moveL(socket_fd, 1, move_cmd)

# 5. 校验执行结果并返回布尔状态
if ret == 0:
    print("成功:MoveL 核心测试指令成功插入到作业文件第 1 行!")
    return True
else:
    print(f"错误:插入 MoveL 指令失败,底层错误码: {ret}")
    return False

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

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

方法: insert_job_moveC(socket_fd: int, line: int, move_cmd: MoveCmd)

功能描述: 在控制器当前打开的作业(Job)文件指定行号处,以指定的 P 变量(点位变量)模式插入一条笛卡尔空间圆弧运动(MoveC)指令。在实际作业中,通常需要连续插入两条 MoveC 指令分别代表圆弧的中间点与终点。

参数:

  • socket_fd:已连接的机械臂控制器句柄,整型(int)。
  • line:插入指令的目标行号(从 1 开始),整型(int)。
  • move_cmd(底层输出参数):运动控制属性结构体容器(对应代码中的 nrc.MoveCmd())。由方法内部自动创建并配置核心数组成员,无需外部手工创建。

返回值:

  • bool:执行结果布尔值
    • True:插入成功。底层接口返回 0,指令已成功写入作业文件。
    • False:插入失败。句柄无效、行号越界、底层接口返回非 0 错误码或触发通信异常。

使用示例:

Python
import nrc_interface as nrc

# ---------- 第一步:配置并插入圆弧"中间点" (P0003) ----------
move_cmd_mid = nrc.MoveCmd()
coord_len = 6

pos_mid = nrc.VectorDouble(coord_len)
coords_mid = [300.0, 100.0, 400.0, 180.0, 0.0, 0.0]  # 中间点空间坐标(自己设定)
for i in range(coord_len):
    pos_mid[i] = coords_mid[i]

move_cmd_mid.targetPosValue = pos_mid
move_cmd_mid.targetPosType = 1
move_cmd_mid.targetPosName = "P0003"                  # 命名为中间点变量
move_cmd_mid.coord = 1                               # 直角坐标系
move_cmd_mid.velocity = 20
move_cmd_mid.velocitySync = 20
move_cmd_mid.acc = 20
move_cmd_mid.dec = 20
move_cmd_mid.pl = 0

# 插入到第 1 行
ret1 = nrc.job_insert_moveC(socket_fd, 1, move_cmd_mid)

# ---------- 第二步:配置并插入圆弧"终点" (P0004) ----------
move_cmd_end = nrc.MoveCmd()

pos_end = nrc.VectorDouble(coord_len)
coords_end = [250.0, 200.0, 400.0, 180.0, 0.0, 0.0]  # 终点空间坐标(自己设定)
for i in range(coord_len):
    pos_end[i] = coords_end[i]

move_cmd_end.targetPosValue = pos_end
move_cmd_end.targetPosType = 1
move_cmd_end.targetPosName = "P0004"                  # 命名为终点变量
move_cmd_end.coord = 1
move_cmd_end.velocity = 20
move_cmd_end.velocitySync = 20
move_cmd_end.acc = 20
move_cmd_end.dec = 20
move_cmd_end.pl = 0

# 插入到第 2 行(排在中间点之后)
ret2 = nrc.job_insert_moveC(socket_fd, 2, move_cmd_end)

# ---------- 第三步:综合校验测试结果 ----------
if ret1 == 0 and ret2 == 0:
    print("成功:完整的 MoveC 圆弧轨迹测试指令(中间点+终点)已成功写入作业文件!")
    return True
else:
    print("错误:圆弧指令序列插入失败")
    return False

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

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

方法: open_job(socket_fd: int, job_name: str)

功能描述: 通知机械臂控制器打开指定的作业(Job)文件,使其成为当前处于激活并准备执行的程序。相当于在示教器上手工选中并打开某个在线作业。

参数:

  • socket_fd:已连接的机械臂控制器句柄,整型格式(int)。
  • job_name:准备打开的作业文件名称(例如 "TEST" 或 "TEST.JOB"),字符串格式(str)。

返回值:

  • int:执行结果
    • True:打开成功。底层接口返回 0,文件成功加载并激活。
    • False:打开成功。句柄无效、指定文件不存在、底层接口返回非 0 错误码或触发通信异常。

使用示例:

Python
import nrc_interface as nrc

# 1. 定义需要测试激活的作业文件名称
test_job = "TEST.JOB"

# 2. 调用底层接口加载文件
ret = nrc.job_open(socket_fd, test_job)

# 3. 校验执行结果并返回布尔状态
if ret == 0:
    print(f"成功: 打开作业文件成功 -> {test_job}")
    return True
else:
    print("错误: 打开作业文件失败")
    return False

5. job_create - 创建作业文件名

方法: create_job(socket_fd: int, job_name: str)

功能描述: 在控制器内新建一个指定名称的空作业(Job)文件。方法内部集成了防重名机制,在调用底层接口前会自动读取控制器的作业列表进行智能忽略后缀名比对。若文件已存在则自动拦截,避免破坏系统中的现有作业。

参数:

  • socket_fd:已连接的机械臂控制器句柄,整型格式(int)。
  • job_name:准备新建的作业文件名称(例如 "NEW_JOB" 或 "NEW_JOB.JOB"),字符串格式(str)。

返回值:

  • bool:执行结果布尔值
    • True:新建成功。底层接口返回 0,空作业文件成功在控制器内生成。
    • False:新建失败。句柄无效、系统中已存在同名作业文件(忽略后缀名)、底层接口返回非 0 错误码或触发通信异常。

使用示例:

Python
import nrc_interface as nrc

# 1. 定义需要测试创建的全新作业文件名
new_job = "CORE_TEST.JOB"

# 2. 调用底层接口执行创建操作 (内部自动拦截重名文件)
ret = nrc.job_create(socket_fd, new_job)

# 3. 校验执行结果并返回布尔状态
if ret == 0:
    print(f"成功: 新建作业文件成功 -> {new_job}")
    return True
else:
    print("错误: 新建作业文件失败")
    return False

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

方法: get_all_jobfile_names(socket_fd: int, robots_file: VectorVectorString)

功能描述: 遍历并获取控制器内部存储的全部作业(Job)文件名称列表。多用于防重名机制的预校验或示教程序文件的盘点。方法内部采用稳健的双重循环机制,完整解包底层 C++ 二维容器,确保不遗漏任何一个文件名。

参数:

  • socket_fd:已连接的机械臂控制器句柄,整型格式(int)。
  • robots_file(底层输出参数):用于接收文件列表的 C++ 二维字符串数组容器(对应代码中的 nrc.VectorVectorString()),由方法内部自动创建、配置并作为参数传入底层接口,无需外部手工创建。

返回值:

  • list:作业文件名列表
    • ["FILE1.JOB", "FILE2.JOB", ...]:获取成功。返回包含控制器中所有作业文件完整名称(含后缀名)的字符串列表,并同步在控制台打印。
    • [](空列表):获取失败。句柄无效、内部无文件、底层接口返回非 0 错误码或触发通信异常。

使用示例:

Python
import nrc_interface as nrc

# 1. 实例化官方定义的二维字符串数组容器以接收数据
robots_file = nrc.VectorVectorString()

# 2. 调用底层接口获取全部文件名
ret = nrc.job_get_all_jobfile_name(socket_fd, robots_file)

# 3. 校验执行结果并将其提取为标准 Python 列表返回(核心安全遍历逻辑)
if ret == 0:
    job_names = []
    # 严格采用双重循环遍历 C++ 容器,确保抓取到所有名字
    for i in range(robots_file.size()):
        for j in range(len(robots_file[i])):
            job_names.append(robots_file[i][j])
    print(f"成功: 获取作业文件列表成功!共找到 {len(job_names)} 个文件")
    print(job_names)  # 控制台打印输出完整列表
    return job_names
else:
    print("错误: 获取作业文件列表失败")
    return []

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

方法: run_job(socket_fd: int, job_name: str)

功能描述: 通知机械臂控制器启动运行指定的作业(Job)文件,使机械臂开始按照该文件内编译好的轨迹和控制指令执行自动化动作。该接口通常在作业文件成功打开(加载)后调用。

参数:

  • socket_fd:已连接的机械臂控制器句柄,整型格式(int)。
  • job_name:准备启动运行的作业文件名称(例如 "TEST3"),字符串格式(str)。

返回值:

  • bool:执行结果布尔值
    • True:启动成功。底层接口返回 0,控制器成功接收启动指令并控制机械臂开始执行程序。
    • False:启动失败。句柄无效、文件未打开/不存在、控制器处于报警/未伺服使能状态、底层接口返回非 0 错误码或触发通信异常。

使用示例:

Python
import nrc_interface as nrc
import time

# 1. 定义测试准备运行的作业文件名
target_job = "TEST3"

# 2. 调用底层接口执行启动指令
ret = nrc.job_run(socket_fd, target_job)

# 3. 校验执行结果并返回布尔状态
if ret == 0:
    print(f"成功: 启动运行作业文件成功 -> {target_job}!")
    return True
else:
    print("错误: 启动作业失败")
    return False

time.sleep(10)