模式与 IO 控制接口

头文件:include/tl_interface.h、include/tl_io.h
相关示例代码:examples\cpp\ex_digital_io.cpp、examples\cpp\ex_move_control.cpp

1. set_current_mode - 设置机器人模式(切换示教模式和运动模式)

方法:Result set_current_mode(SOCKETFD socketFd, RobotMode mode);

功能描述:切换控制器运行模式:示教模式(手动)、远程模式、运行模式(自动运行作业)。推荐使用 RobotMode 枚举重载版本,int 旧版已废弃。切换为运行模式后将自动进入伺服上电状态,无须额外上电。

参数:

  • socketFd:已连接的句柄。
  • mode:目标模式,RobotMode 枚举:
    • RobotMode::TEACH:示教模式
    • RobotMode::REMOTE:远程模式
    • RobotMode::RUN:运行模式

返回值:

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

使用示例:

C++
    // 切换为示教模式
    auto ret = tl::set_current_mode(socket_fd, tl::RobotMode::TEACH);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 切换示教模式失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 已切换为示教模式" << std::endl;

2. set_digital_output - 设置数字 IO 输出

方法:Result set_digital_output(SOCKETFD socketFd, int port, IoLevel value);

功能描述:设置指定数字输出端口的状态。推荐使用 IoLevel 枚举重载版本,int 旧版已废弃。

参数:

  • socketFd:已连接的句柄。
  • port:输出端口号,范围【1,最大端口数】。
  • value:输出电平,IoLevel 枚举:
    • IoLevel::OFF:输出关闭(低电平)
    • IoLevel::ON:输出打开(高电平)

返回值:

  • 0:成功。
  • 非0:失败(如端口号越界)。

使用示例:

C++
    // 设置数字 IO 输出(端口 1 输出高电平)
    int io_port = 1;
    auto ret = tl::set_digital_output(socket_fd, io_port, tl::IoLevel::ON);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 设置数字 IO 输出失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 设置数字 IO 输出成功" << std::endl;

3. get_digital_output - 查询数字 IO 输出

方法:Result get_digital_output(SOCKETFD socketFd, std::vector<int>& out);

功能描述:一次获取所有数字输出端口的电平状态(通常 64 路)。

参数:

  • socketFd:已连接的句柄。
  • out:输出,存储各端口状态(0 或 1)的数组,长度 64。

返回值:

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

使用示例:

C++
    // 查询所有数字输出
    std::vector<int> output_values;
    auto ret = tl::get_digital_output(socket_fd, output_values);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 查询数字 IO 输出失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 查询数字 IO 输出成功,状态为:";
    for (const auto& state : output_values) {
        std::cout << " " << state;
    }
    std::cout << std::endl;

4. get_digital_input - 获取所有 IO 输入状态

方法:Result get_digital_input(SOCKETFD socketFd, std::vector<int>& in);

功能描述:一次获取所有数字输入端口的电平状态(通常 64 路)。

参数:

  • socketFd:已连接的句柄。
  • in:输出,存储各输入端口状态的数组,长度 64。

返回值:

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

使用示例:

C++
    // 获取所有数字输入状态
    std::vector<int> input_values;
    auto ret = tl::get_digital_input(socket_fd, input_values);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 获取数字 IO 输入失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 获取数字 IO 输入成功,状态为:";
    for (const auto& state : input_values) {
        std::cout << " " << state;
    }
    std::cout << std::endl;

5. set_analog_output - 设置模拟量输出

方法:Result set_analog_output(SOCKETFD socketFd, int port, double value);

功能描述:设置指定模拟量输出端口的数值。

参数:

  • socketFd:已连接的句柄。
  • port:端口号。
  • value:数值,范围 0≤value≤10。

返回值:

  • 0:成功。
  • 非0:失败(如数值越界)。

使用示例:

C++
    // 设置模拟量输出(端口 1,输出 5.0V)
    int port = 1;
    auto ret = tl::set_analog_output(socket_fd, port, 5.0);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 设置模拟量输出失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 设置模拟量输出成功" << std::endl;

6. get_analog_input - 获取模拟量输入

方法:Result get_analog_input(SOCKETFD socketFd, std::vector<double>& ain);

功能描述:一次获取所有模拟量输入端口的数值。

参数:

  • socketFd:已连接的句柄。
  • ain:输出,模拟量输入数组,最大长度 64。

返回值:

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

使用示例:

C++
    // 获取所有模拟量输入
    std::vector<double> analog_input;
    auto ret = tl::get_analog_input(socket_fd, analog_input);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 获取模拟量输入失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 获取模拟量输入成功,共 " << analog_input.size() << " 路" << std::endl;

7. get_analog_output - 获取模拟量输出

方法:Result get_analog_output(SOCKETFD socketFd, std::vector<double>& aout);

功能描述:一次获取所有模拟量输出端口的数值。

参数:

  • socketFd:已连接的句柄。
  • aout:输出,模拟量输出数组,最大长度 64。

返回值:

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

使用示例:

C++
    // 获取所有模拟量输出
    std::vector<double> analog_output;
    auto ret = tl::get_analog_output(socket_fd, analog_output);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 获取模拟量输出失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 获取模拟量输出成功,共 " << analog_output.size() << " 路" << std::endl;

8. get_io_type - 获取 IO 类型

方法:Result get_io_type(SOCKETFD socketFd, IOtype& io_type);

功能描述:获取 IO 型号和端口数量信息。

参数:

  • socketFd:已连接的句柄。
  • io_type:输出,IOtype 结构体:
    • num:IO 板数量
    • type:IO 型号列表
    • io_port_sum:IO 端口数量,二维数组,每块 IO 板为 [数字输入端口数, 数字输出端口数, 模拟输入端口数, 模拟输出端口数]

返回值:

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

使用示例:

C++
    // 获取 IO 类型信息
    tl::IOtype io_type;
    auto ret = tl::get_io_type(socket_fd, io_type);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 获取 IO 类型失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] IO 板数量: " << io_type.num << std::endl;
    for (size_t i = 0; i < io_type.type.size(); ++i) {
        std::cout << "  IO 板 " << i << " 型号: " << io_type.type[i] << std::endl;
    }

9. get_IO_reset_function - 获取 IO 复位功能

方法:Result get_IO_reset_function(SOCKETFD socketFd, int robotNum, IoResetType type, std::vector<int>& enable, std::vector<int>& value);

功能描述:获取 IO 复位相关参数。推荐使用 IoResetType 枚举重载版本,int 旧版已废弃。

参数:

  • socketFd:已连接的句柄。
  • robotNum:机器人编号(1-4)。
  • type:复位类型,IoResetType 枚举:
    • IoResetType::REMOTE_IO:远程 IO 复位
    • IoResetType::MODE_STOP:切模式停止
    • IoResetType::PROGRAM_ERROR:程序报错
  • enable:输出,是否复位容器,大小为所有 IO 板输出端口数。
  • value:输出,复位值容器,大小为所有 IO 板输出端口数。

返回值:

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

使用示例:

C++
    // 获取远程 IO 复位参数
    std::vector<int> enable;
    std::vector<int> value;
    auto ret = tl::get_IO_reset_function(socket_fd, 1, tl::IoResetType::REMOTE_IO, enable, value);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 获取 IO 复位功能失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 获取 IO 复位功能成功,端口数: " << enable.size() << std::endl;