伺服状态设置接口

头文件: cpp/interface/nrc_interface.h

1. set_servo_state - 设置伺服就绪状态

方法: int set_servo_state(SOCKETFD socket_fd, int state);

功能描述: 控制电机抱闸与使能。state=1=使能(解锁抱闸),state=0=去使能(抱闸锁死)。

参数:

  • socket_fd:已连接的句柄
  • state:1使能,0去使能

返回值:

  • int
    • 0:成功
    • -4:操作不允许(如未清除报警)
    • 其他负值:失败

使用示例:

C++
bool test_set_servo_state(int state) {
    if (socket_fd_6001_ <= 0) return false;
    int ret = set_servo_state(socket_fd_6001_, state);
    std::string state_msg = (state == 1) ? "使能/上电" : "去使能/断电";
    CHECK_RET(ret, "设置伺服状态为:" + state_msg);
    return ret == SUCCESS;
}

2. set_servo_poweron - 设置伺服上电状态

方法: int set_servo_poweron(SOCKETFD socket_fd);

功能描述: 闭合强电接触器,为电机供电。需先调用set_servo_state(1)。

参数:

  • socket_fd:已连接的句柄

返回值:

  • int
    • 0:成功
    • -4:操作不允许(如未清除报警)
    • 其他负值:失败

使用示例:

C++
bool test_power_on() {
    if (socket_fd_6001_ <= 0) return false;
    // 步骤1:开启伺服状态
    int ret = set_servo_state(socket_fd_6001_, 1);
    if (ret == SUCCESS) {
        // 状态设置成功后,硬延时500ms等待硬件响应
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
        // 步骤2:执行上电使能,并延时1秒等待状态稳定
        ret = set_servo_poweron(socket_fd_6001_);
        std::this_thread::sleep_for(std::chrono::seconds(1));
        CHECK_RET(ret, "上电使能");
        return ret == SUCCESS;
    }
    // 若返回错误码-4,说明机械臂已经是上电状态,直接返回true
    if (ret == -4) {
        std::cout << "提示: 机械臂已处于上电状态" << std::endl;
        return true;
    }
    CHECK_RET(ret, "设置伺服状态(上电)");
    return false;
}

3. set_servo_poweroff - 设置伺服下电状态

方法: int set_servo_poweroff(SOCKETFD socket_fd);

功能描述: 切断强电,电机抱闸锁死。

参数:

  • socket_fd:已连接的句柄

返回值:

  • int
    • 0:成功
    • -4:操作不允许(如未清除报警)
    • 其他负值:失败

使用示例:

C++
bool test_power_off() {
    if (socket_fd_6001_ <= 0) return false;
    // 调用底层接口执行下电操作
    int ret = set_servo_poweroff(socket_fd_6001_);
    // 返回SUCCESS或-1(网络因下电主动断连)均视为下电成功,并重置所有端口句柄
    if (ret == SUCCESS || ret == -1) {
        std::cout << "[成功] 机械臂已成功下电" << std::endl;
        socket_fd_6001_ = -1;
        socket_fd_7000_ = -1;
        return true;
    }
    // 若返回错误码-4,说明机械臂本身已处于下电状态
    if (ret == -4) {
        std::cout << "提示: 机械臂已处于下电状态" << std::endl;
        return true;
    }
    CHECK_RET(ret, "下电操作");
    return false;
}

4. set_speed - 设置速度

方法: int set_speed(SOCKETFD socket_fd, int speed);

功能描述: 设置全局自动运行速度百分比(1~100)。

参数:

  • socket_fd:已连接的句柄
  • speed:速度百分比

返回值:

  • int
    • 0:成功
    • 负值:失败

使用示例:

C++
bool test_set_speed(int speed) {
    if (socket_fd_6001_ <= 0) return false;
    // 调用底层接口,设置机器人的全局运行速度
    int ret = set_speed(socket_fd_6001_, speed);
    CHECK_RET(ret, "设置速度 " + std::to_string(speed));
    return ret == SUCCESS;
}

5. get_speed - 获取速度

方法: int get_speed(SOCKETFD socket_fd, int& speed);

功能描述: 获取当前全局速度倍率。

参数:

  • socket_fd:已连接的句柄
  • speed:输出参数,当前速度百分比

返回值:

  • int
    • 0:成功
    • 负值:失败

使用示例:

C++
int test_get_speed() {
    if (socket_fd_6001_ <= 0) return -1;
    // 传入控制端口句柄,调用底层接口获取当前机器人的速度倍率
    int speed = 0;
    int ret = get_speed(socket_fd_6001_, speed);
    if (ret == SUCCESS) {
        std::cout << "当前速度倍率: " << speed << "%" << std::endl;
        return speed;
    }
    std::cout << "获取速度失败, 错误码=" << ret << std::endl;
    return -1;
}

完整Modbus Rtu使用示例见使用示例1所示。