- 选型指南
- 概述
- 入门指南
- 机械臂参数
- 示教器使用
-
二次开发
-
API(C++)
- 快速开始
- 接口说明
- 7000端口接口说明
- 使用示例
- 返回值说明
-
API(Python)
- 快速开始
- 接口说明
- 7000端口接口说明
- 使用示例
- 返回值说明
- ROS2开发
-
API(C++)
- 相关下载
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:失败。
使用示例:
// 配置 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:失败。
使用示例:
// 打开 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:失败。
使用示例:
// 写多个保持寄存器(从地址 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:失败。
使用示例:
// 读取保持寄存器(从地址 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:失败。
使用示例:
// 写单个线圈(地址 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:失败。
使用示例:
// 写单个保持寄存器(地址 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:失败。
使用示例:
// 读取线圈状态(从地址 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:失败。
使用示例:
// 读取输入状态(从地址 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:失败。
使用示例:
// 读取输入寄存器(从地址 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;
