C++ 使用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;
}

效果

在这里插入图片描述

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libmodbus 是一个用于Modbus通信协议的免费软件库,它提供了实现Modbus协议的通信功能。以下是使用libmodbus库的步骤: 1. 下载和安装libmodbus库。 在Linux系统上,可以使用以下命令安装libmodbus库: $sudo apt-get install libmodbus-dev 2. 创建一个新的C文件,并在文件中包含modbus.h头文件。 3. 初始化一个modbus_t结构体,用于存储Modbus连接的参数,如串口设备、IP地址、端口等。 4. 使用modbus_new函数创建一个modbus_t对象,并将初始化的modbus_t结构体作为参数传递。 5. 使用modbus_connect函数连接到Modbus设备。 6. 使用modbus_read_registers函数读取Modbus寄存器的值。 7. 使用modbus_write_registers函数写入Modbus寄存器的值。 8. 使用modbus_close函数关闭Modbus连接。 9. 使用modbus_free函数释放modbus_t对象。 以下是一个使用libmodbus库的示例程序: ``` #include <stdio.h> #include <modbus.h> int main() { modbus_t* ctx; uint16_t tab_reg[64]; int rc; // 初始化modbus_t结构体 ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1); if (ctx == NULL) { fprintf(stderr, "Unable to create the libmodbus context\n"); return -1; } // 连接到Modbus设备 if (modbus_connect(ctx) == -1) { fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); modbus_free(ctx); return -1; } // 读取Modbus寄存器的值 rc = modbus_read_registers(ctx, 0, 10, tab_reg); if (rc == -1) { fprintf(stderr, "Failed to read: %s\n", modbus_strerror(errno)); modbus_close(ctx); modbus_free(ctx); return -1; } // 输出读取到的值 int i; for (i=0; i<10; i++) { printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]); } // 关闭Modbus连接 modbus_close(ctx); modbus_free(ctx); return 0; } ``` 这是一个读取Modbus设备前10个寄存器值的示例程序。在该程序中,我们首先使用modbus_new_rtu函数创建一个modbus_t对象,并初始化了串口设备、波特率等参数。然后,使用modbus_connect函数连接到Modbus设备。接着,使用modbus_read_registers函数读取Modbus设备前10个寄存器的值,并输出这些值。最后,使用modbus_close函数关闭Modbus连接,并使用modbus_free函数释放modbus_t对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值