【实用】libmodbus周期性读写线圈Coils实例

【实用】libmodbus周期性读写线圈Coils实例

安装libmodbus

Ubuntu20.04

apt install libmodbus-dev libmodbus5

源码

#include <stdio.h>
#include <modbus.h>
#include <unistd.h>  // 用于 sleep 函数
#include <errno.h>
#define IO_MAX_PER_SLAVE (16)

int main() {
    modbus_t *ctx;
    uint8_t tab_reg[IO_MAX_PER_SLAVE];  // 用于存储读取的寄存器

    // 创建 Modbus TCP 上下文
    //ctx = modbus_new_tcp("192.168.1.12", 502);  // 替换为你的从站 IP 地址和端口
    ctx = modbus_new_tcp("192.168.3.239", 502);
    if (ctx == NULL) {
        fprintf(stderr, "Unable to create the libmodbus context\n");
        return -1;
    }

    modbus_set_debug(ctx,0);
    // 启用 TCP Keepalive
    //modbus_set_tcp_keepalive(ctx, 1);  // 1 表示启用,0 表示禁用

    // 设置从站 ID
    modbus_set_slave(ctx, 1);  // 替换为你的从站 ID

    // 连接到从站
    if (modbus_connect(ctx) == -1) {
        fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }

    // 主循环:定期发送请求
    uint8_t loop = 0;
    while (1) {
	printf("Write Coils value: ");
	for(int i=0;i<IO_MAX_PER_SLAVE;i++) {
		tab_reg[i] = 0;
		if(i<=loop)
			tab_reg[i] = 1;
		printf(" %02X ", tab_reg[i]);
	}
	printf("\n");

        int rc1 = modbus_write_bits(ctx, 0, IO_MAX_PER_SLAVE, tab_reg);
        if (rc1 == -1) {
            fprintf(stderr, "Failed to write coils: %s\n", modbus_strerror(errno));

            // 尝试重新连接
            modbus_close(ctx);
            //ctx = modbus_new_tcp("192.168.1.12", 502);
            ctx = modbus_new_tcp("192.168.1.13", 502);
            if (modbus_connect(ctx) == -1) {
                fprintf(stderr, "Reconnection failed: %s\n", modbus_strerror(errno));
                break;
            }
        } else {
            printf("Write Coils value: OK! \n");
        }

	    // 读取一个寄存器
        int rc = modbus_read_bits(ctx, 0, IO_MAX_PER_SLAVE, tab_reg);  // 从地址 0 开始读取 16 个coils 
        if (rc == -1) {
            fprintf(stderr, "Failed to read coils: %s\n", modbus_strerror(errno));

            // 尝试重新连接
            modbus_close(ctx);
            //ctx = modbus_new_tcp("192.168.1.12", 502);
            ctx = modbus_new_tcp("192.168.3.239", 502);
            if (modbus_connect(ctx) == -1) {
                fprintf(stderr, "Reconnection failed: %s\n", modbus_strerror(errno));
                break;
            }
        } else {
	    printf("Read Coils value: ");
	    for(int i=0;i<IO_MAX_PER_SLAVE;i++)
                printf(" %02X ", tab_reg[i]);
	    printf("\n");
        }

        // 每隔 2 秒发送一次请求
        loop++;
	    loop = loop%16;
        sleep(2);
    }

    // 关闭连接并释放资源
    modbus_close(ctx);
    modbus_free(ctx);

    return 0;
}

makefile

#CROSS_COMPILE := aarch64-linux-gnu-
CC := $(CROSS_COMPILE)gcc

PROG := modbus
SRC := $(PROG).c

all:
	$(CC) $(SRC) -I/usr/include/modbus -lmodbus  -o $(PROG)
clean:
	rm -fr *.o modbus
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值