libmodbus从linux访问window上的服务超时问题

window:

使用EasyModbusTCP Server Simulator 作为服务。

linux:

程序:

#include <stdio.h>
#include <modbus/modbus.h>

int main()
{
    modbus_t *ctx;
    uint16_t holding_registers[1];

    // Create a new Modbus TCP context
    ctx = modbus_new_tcp("192.168.2.3", 502);
    if (ctx == NULL) {
        fprintf(stderr, "Error creating Modbus TCP context\n");
        return 1;
    }

    // Connect to the Modbus server
    if (modbus_connect(ctx) == -1) {
        fprintf(stderr, "Error connecting to Modbus server: %s\n", modbus_strerror(errno));
        modbus_free(ctx);
        return 1;
    }

    // Read the value of holding register 0
    int rc = modbus_read_registers(ctx, 0, 1, holding_registers);
    if (rc == -1) {
        fprintf(stderr, "Error reading holding register: %s\n", modbus_strerror(errno));
        modbus_free(ctx);
        return 1;
    }

    // Print the value of the holding register
    printf("Value of holding register 0: %d\n", holding_registers[0]);

    // Disconnect from the Modbus server and free the context
    modbus_close(ctx);
    modbus_free(ctx);

    return 0;
}

反馈:

Error reading holding register: Connection timed out

后面添加了延时:

modbus_set_response_timeout(ctx, 1,0);

没有效果,然后再次添加了设置设备ID:

modbus_set_slave(ctx, 1);

这时的结果就是正确的:

Value of holding register 0: 23

原因分析:

modbus-TCP的设备ID的作用:

在 Modbus-TCP 中,设备 ID(Device ID)通常用于标识 Modbus 服务器或从设备。Modbus-TCP 是一种基于 TCP/IP 协议的 Modbus 通信协议,其中 TCP/IP 用于传输 Modbus 数据和命令。与传统的串行 Modbus 不同,Modbus-TCP 中的设备 ID 并不是必需的,因为网络地址可以唯一地标识 Modbus 服务器或从设备。

然而,设备 ID 仍然可以用于一些特殊的应用场景,例如在一个网络中存在多个 Modbus 服务器或从设备时,可以使用设备 ID 来区分它们。在这种情况下,设备 ID 可以被视为一个设备的逻辑地址,而网络地址则是物理地址。此外,设备 ID 还可以用于 Modbus-TCP 与其他 Modbus 协议之间进行转换时,例如将 Modbus-TCP 转换为 Modbus RTU,设备 ID 可以用于保持通信一致性和兼容性。(by chatGPT)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值