作业运动控制接口

头文件:include/tl_job_operate.h
相关示例代码:examples\cpp\ex_job_control.cpp

1. job_create - 创建作业文件名

方法:Result job_create(SOCKETFD socketFd, const std::string& jobName);

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

参数:

  • socketFd:已连接的句柄。
  • jobName:作业文件名。

返回值:

  • 0:成功。
  • 非0:失败(如文件已存在)。

使用示例:

C++
    // 创建作业文件
    std::string job_name = "TEST_CPP";
    auto ret = tl::job_create(socket_fd, job_name);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 创建作业文件失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 创建作业文件成功" << std::endl;

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

方法:Result job_open(SOCKETFD socketFd, const std::string& jobName);

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

参数:

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

返回值:

  • 0:成功。
  • 非0:失败(文件不存在等)。

使用示例:

C++
    // 打开作业文件
    auto ret = tl::job_open(socket_fd, job_name);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 打开作业文件失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 打开作业文件成功" << std::endl;

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

方法:Result job_insert_moveJ(SOCKETFD socketFd, int line, MoveCmd moveCmd);

功能描述:在作业文件指定行插入一条关节空间运动(MoveJ)指令。

参数:

  • socketFd:已连接的句柄。
  • line:行号(从1开始)。
  • moveCmd:运动命令结构体,需设置以下成员:
    • targetPosType:目标位置类型,PosType 枚举(data / PType / E_TYPE / RP_TYPE / AP_TYPE / GPType / GEType)
    • targetPosName:目标位置名称(如 "P0001")
    • coord:坐标系,Coord 枚举(JOINT / BASE / TOOL / USER)
    • velocity:速度
    • acc:加速度
    • dec:减速度
    • pl:平滑度(0表示精确到达)
    • targetPosValue:目标位置数据,长度 14(前 7 位本体值,后 7 位外部轴值)

返回值:

  • 0:成功。
  • 非0:失败(行号越界、参数错误等)。

使用示例:

C++
    // 作业文件插入 MoveJ(P 变量模式)
    int line = 1;
    tl::MoveCmd cmd;
    cmd.targetPosType = tl::PosType::PType;   // 使用 P 变量
    cmd.targetPosName = "P0001";
    cmd.coord         = tl::Coord::JOINT;     // 关节坐标系
    cmd.velocity      = 40;
    cmd.acc           = 10;
    cmd.dec           = 10;
    cmd.pl            = 0;                    // 精确到达
    cmd.targetPosValue = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                          0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};

    auto ret = tl::job_insert_moveJ(socket_fd, line, cmd);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 作业文件插入 MoveJ 失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 作业文件插入 MoveJ 成功" << std::endl;

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

方法:Result job_insert_moveL(SOCKETFD socketFd, int line, MoveCmd moveCmd);

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

参数:

  • socketFd:已连接的句柄。
  • line:行号(从1开始)。
  • moveCmd:运动命令结构体,成员同 3.。

返回值:

  • 0:成功。
  • 非0:失败。

使用示例:

C++
    // 作业文件插入 MoveL(P 变量模式)
    int line = 2;
    tl::MoveCmd cmd;
    cmd.targetPosType = tl::PosType::PType;
    cmd.targetPosName = "P0002";
    cmd.coord         = tl::Coord::BASE;      // 基坐标系(直角)
    cmd.velocity      = 40;
    cmd.acc           = 10;
    cmd.dec           = 10;
    cmd.pl            = 0;
    cmd.targetPosValue = {280, 0.0, 380, 3.14, 0.0, 0.0};  // X, Y, Z, Rx, Ry, Rz

    auto ret = tl::job_insert_moveL(socket_fd, line, cmd);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 作业文件插入 MoveL 失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 作业文件插入 MoveL 成功" << std::endl;

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

方法:Result job_insert_moveC(SOCKETFD socketFd, int line, MoveCmd moveCmd);

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

参数:

  • socketFd:已连接的句柄。
  • line:行号(从1开始)。
  • moveCmd:运动命令结构体,成员同 3.。

返回值:

  • 0:成功。
  • 非0:失败。

使用示例:

C++
    // 作业文件插入 MoveC(圆弧中间点 + 终点,共两条)
    int line = 3;
    tl::MoveCmd cmd;
    cmd.targetPosType = tl::PosType::PType;
    cmd.targetPosName = "P0003";
    cmd.coord         = tl::Coord::TOOL;      // 工具坐标系
    cmd.velocity      = 40;
    cmd.acc           = 10;
    cmd.dec           = 10;
    cmd.pl            = 0;

    // 第一条:圆弧中间点
    cmd.targetPosValue = {270, 0.0, 380, 3.14, 0.0, 0.0};
    auto ret = tl::job_insert_moveC(socket_fd, line, cmd);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 作业文件插入 MoveC(中间点)失败,错误码: " << ret << std::endl;
        return -1;
    }

    // 第二条:圆弧终点
    cmd.targetPosValue = {240, 0.0, 380, 3.14, 0.0, 0.0};
    ret = tl::job_insert_moveC(socket_fd, line, cmd);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 作业文件插入 MoveC(终点)失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 作业文件插入 MoveC 成功" << std::endl;

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

方法:Result job_run(SOCKETFD socketFd, const std::string& jobName);

功能描述:启动运行已打开的作业文件(该功能需要在运行模式下使用,调用该接口时,控制器会自动进行伺服模式切换)。

参数:

  • socketFd:已连接的句柄。
  • jobName:作业文件名。

返回值:

  • 0:成功。
  • 非0:失败(文件未打开、未使能等)。

使用示例:

C++
    // 运行作业文件
    auto ret = tl::job_run(socket_fd, job_name);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 运行作业文件失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 运行作业文件成功" << std::endl;

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

方法:Result job_get_all_jobfile_name(SOCKETFD socketFd, std::vector<std::vector<std::string>>& robotsFile);

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

参数:

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

返回值:

  • 0:成功。
  • 非0:失败。

使用示例:

C++
    // 获取所有作业文件名
    std::vector<std::vector<std::string>> all_job_names;
    auto ret = tl::job_get_all_jobfile_name(socket_fd, all_job_names);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 获取作业文件名失败,错误码: " << ret << std::endl;
        return -1;
    }

    int i = 1;
    for (const auto& names : all_job_names) {
        for (const auto& name : names) {
            std::cout << "[信息] 作业文件 " << i++ << " 名称: " << name << std::endl;
        }
    }