modbus通信接口

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

1. modbus_set_master_parameter - 设置 Modbus RTU 主站参数

方法:Result modbus_set_master_parameter(SOCKETFD socketFd, int id, const ModbusMasterParameter& param);

功能描述:配置 Modbus RTU 或 TCP 主站参数。

参数:

  • socketFd:已连接的句柄。
  • id:配方 id 参数,最多保存 9 个 id。
  • param:主站参数结构体(ModbusMasterParameter):
    • type:主站类型,支持 "TCP" / "RTU"
    • startAddress:false 起始地址为 1;true 起始地址为 0
    • TCP:Modbus TCP 参数(type="TCP" 时使用,含 IP、port、endian_type)
    • RTU:Modbus RTU 参数(type="RTU" 时使用):
      • slaveId:从站号
      • port:端口
      • baudrate:波特率
      • checkBit:奇偶校验位,"None" / "Even" / "Odd"
      • dataBit:数据位,5/6/7/8
      • stopBit:停止位,1/2

返回值:

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

使用示例:

C++
    // 配置 RTU 主站(配方 id=1)
    int id = 1;
    tl::ModbusMasterParameter param;
    param.type          = "RTU";
    param.startAddress  = true;   // 起始地址 0
    param.RTU.slaveId   = 1;      // 从站号
    param.RTU.port      = 1;      // 端口
    param.RTU.baudrate  = 115200; // 波特率
    param.RTU.checkBit  = "None"; // 奇偶校验位
    param.RTU.dataBit   = 8;      // 数据位
    param.RTU.stopBit   = 1;      // 停止位

    auto ret = tl::modbus_set_master_parameter(socket_fd, id, param);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 设置 Modbus 主站参数失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 设置 Modbus 主站参数成功" << std::endl;

2. modbus_open_master - 打开 Modbus 主站

方法:Result modbus_open_master(SOCKETFD socketFd, int id);

功能描述:打开 Modbus 主站(需与 modbus_set_master_parameter 设置的 id 对应)。

参数:

  • socketFd:已连接的句柄。
  • id:配方 id 参数,最多保存 9 个 id,需与 modbus_set_master_parameter 设置的 id 对应。

返回值:

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

使用示例:

C++
    // 打开 Modbus 主站(配方 id=1)
    int id = 1;
    auto ret = tl::modbus_open_master(socket_fd, id);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 打开 Modbus 主站失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 打开 Modbus 主站成功" << std::endl;

3. modbus_write_multiple_holding_registers - 写多个保持寄存器

方法:Result modbus_write_multiple_holding_registers(SOCKETFD socketFd, int id, int address, const std::vector<int>& data);

功能描述:写多个保持寄存器(功能码 10H)。

参数:

  • socketFd:已连接的句柄。
  • id:配方 id 参数,最多保存 9 个 id。
  • address:起始寄存器地址。
  • data:写入的寄存器数据。

返回值:

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

使用示例:

C++
    // 写多个保持寄存器(从地址 0 开始写 3 个寄存器)
    int id = 1;
    std::vector<int> data = {100, 200, 300};
    auto ret = tl::modbus_write_multiple_holding_registers(socket_fd, id, 0, data);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 写多个保持寄存器失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 写多个保持寄存器成功" << std::endl;

4. modbus_read_holding_registers - Modbus RTU 读取多个保持寄存器

方法:Result modbus_read_holding_registers(SOCKETFD socketFd, int id, int address, int quantity, std::vector<int>& data);

功能描述:读取多个保持寄存器(功能码 03H)。

参数:

  • socketFd:已连接的句柄。
  • id:配方 id 参数,最多保存 9 个 id。
  • address:起始地址。
  • quantity:读取数量。
  • data:输出,读取数据(失败时输出向量被清空)。

返回值:

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

使用示例:

C++
    // 读取保持寄存器(从地址 0 读 3 个)
    int id = 1;
    std::vector<int> data;
    auto ret = tl::modbus_read_holding_registers(socket_fd, id, 0, 3, data);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 读取保持寄存器失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 读取保持寄存器成功:";
    for (const auto& v : data) {
        std::cout << " " << v;
    }
    std::cout << std::endl;

5. modbus_write_signal_coil_status - Modbus RTU协议写线圈

方法:Result modbus_write_signal_coil_status(SOCKETFD socketFd, int id, int address, int data);

功能描述:写单个线圈状态(功能码 05H)。

参数:

  • socketFd:已连接的句柄。
  • id:配方 id 参数,最多保存 9 个 id。
  • address:线圈地址。
  • data:写入的线圈状态值。

返回值:

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

使用示例:

C++
    // 写单个线圈(地址 0,置 1)
    int id = 1;
    auto ret = tl::modbus_write_signal_coil_status(socket_fd, id, 0, 1);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 写线圈状态失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 写线圈状态成功" << std::endl;

6. modbus_write_signal_holding_registers - Modbus RTU协议写保持寄存器

方法:Result modbus_write_signal_holding_registers(SOCKETFD socketFd, int id, int address, int data);

功能描述:写单个保持寄存器(功能码 06H)。

参数:

  • socketFd:已连接的句柄。
  • id:配方 id 参数,最多保存 9 个 id。
  • address:寄存器地址。
  • data:写入的寄存器数据。

返回值:

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

使用示例:

C++
    // 写单个保持寄存器(地址 10,写入 1000)
    int id = 1;
    auto ret = tl::modbus_write_signal_holding_registers(socket_fd, id, 10, 1000);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 写保持寄存器失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 写保持寄存器成功" << std::endl;

7. modbus_read_coil_status - Modbus读线圈状态

方法:Result modbus_read_coil_status(SOCKETFD socketFd, int id, int address, int quantity, std::vector<int>& data);

功能描述:读取线圈状态(功能码 01H)。

参数:

  • socketFd:已连接的句柄。
  • id:配方 id 参数,最多保存 9 个 id。
  • address:起始地址。
  • quantity:读取数量。
  • data:输出,读取数据(失败时输出向量被清空)。

返回值:

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

使用示例:

C++
    // 读取线圈状态(从地址 0 读 8 个)
    int id = 1;
    std::vector<int> data;
    auto ret = tl::modbus_read_coil_status(socket_fd, id, 0, 8, data);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 读取线圈状态失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 读取线圈状态成功:";
    for (const auto& v : data) {
        std::cout << " " << v;
    }
    std::cout << std::endl;

8. modbus_read_input_status - Modbus读取输入状态

方法:Result modbus_read_input_status(SOCKETFD socketFd, int id, int address, int quantity, std::vector<int>& data);

功能描述:读取输入状态(功能码 02H)。

参数:

  • socketFd:已连接的句柄。
  • id:配方 id 参数,最多保存 9 个 id。
  • address:起始地址。
  • quantity:读取数量。
  • data:输出,读取数据(失败时输出向量被清空)。

返回值:

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

使用示例:

C++
    // 读取输入状态(从地址 0 读 8 个)
    int id = 1;
    std::vector<int> data;
    auto ret = tl::modbus_read_input_status(socket_fd, id, 0, 8, data);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 读取输入状态失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 读取输入状态成功:";
    for (const auto& v : data) {
        std::cout << " " << v;
    }
    std::cout << std::endl;

9. modbus_read_input_registers - Modbus 读输入寄存器

方法:Result modbus_read_input_registers(SOCKETFD socketFd, int id, int address, int quantity, std::vector<int>& data);

功能描述:读取输入寄存器(功能码 04H)。

参数:

  • socketFd:已连接的句柄。
  • id:配方 id 参数,最多保存 9 个 id。
  • address:起始地址。
  • quantity:读取数量。
  • data:输出,读取数据(失败时输出向量被清空)。

返回值:

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

使用示例:

C++
    // 读取输入寄存器(从地址 0 读 3 个)
    int id = 1;
    std::vector<int> data;
    auto ret = tl::modbus_read_input_registers(socket_fd, id, 0, 3, data);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 读取输入寄存器失败,错误码: " << ret << std::endl;
        return -1;
    }
    std::cout << "[信息] 读取输入寄存器成功:";
    for (const auto& v : data) {
        std::cout << " " << v;
    }
    std::cout << std::endl;