代码示例

#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 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐