C++ 使用libmodbus通信示例
libmodbus
libmodbus: libmodbus 是一个自由软件库,用于使用 Modbus 协议发送和接收数据,支持串行端口或以太网连接。
项目地址:https://gitcode.com/gh_mirrors/li/libmodbus
免费下载资源
·
代码示例
#include <future>
#include <iostream>
#include <thread>
#include <modbus.h>
// 寄存器数量
#define TEST_MAX_REGISTERS 100
// 读取寄存器数量
#define TEST_MAX_READ 5
int main()
{
// C++ 异步
auto&& f1 = std::async(std::launch::async, []() {
std::this_thread::sleep_for(std::chrono::seconds(1));
uint16_t tab_reg[TEST_MAX_REGISTERS] = { 0 };
// 创建Modbus上下文
modbus_t* ctx = modbus_new_rtu("COM2", 9600, 'N', 8, 1);
modbus_set_slave(ctx, 1);
modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS232);
modbus_rtu_set_rts(ctx, MODBUS_RTU_RTS_UP);
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return;
}
modbus_set_response_timeout(ctx, 0, 1000000);
while (true) {
// 读取保持寄存器的值
int rc = modbus_read_registers(ctx, 0, TEST_MAX_READ, tab_reg);
if (rc == -1) {
fprintf(stderr, "%s\n", modbus_strerror(errno));
continue;
}
for (int i = 0; i < TEST_MAX_READ; ++i) {
printf("<%#x>", tab_reg[i]);
}
printf("\n");
std::this_thread::sleep_for(std::chrono::seconds(1));
}
});
auto&& f2 = std::async(std::launch::async, []() {
modbus_t* ctx = modbus_new_rtu("COM3", 9600, 'N', 8, 1);
modbus_set_slave(ctx, 1);
modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS232);
modbus_rtu_set_rts(ctx, MODBUS_RTU_RTS_UP);
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return;
}
// 创建寄存器映射
modbus_mapping_t* mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0, MODBUS_MAX_READ_REGISTERS, 0);
if (mb_mapping == NULL) {
fprintf(stderr, "Failed to allocate the mapping: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return;
}
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
while (true) {
// 初始化寄存器
for (size_t i = 0; i < TEST_MAX_REGISTERS; i++) {
mb_mapping->tab_registers[i] = rand() % 100;
}
memset(query, 0, sizeof(query));
// 读取寄存器值
int rc = modbus_receive(ctx, query);
if (rc == -1) {
continue;
}
// 响应请求
modbus_reply(ctx, query, rc, mb_mapping);
}
});
while (true) {
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
效果
GitHub 加速计划 / li / libmodbus
3.36 K
1.72 K
下载
libmodbus: libmodbus 是一个自由软件库,用于使用 Modbus 协议发送和接收数据,支持串行端口或以太网连接。
最近提交(Master分支:2 个月前 )
5c14f139 - 8 个月前
3f9f17e2 - 9 个月前
更多推荐
已为社区贡献3条内容
所有评论(0)