c++ - Modbus 通讯减少超时等待时间

标签 c++ connection-timeout modbus

我正在编写一个 C++ 应用程序,需要通过 modbus 连接到各种 PLC,这些 PLC 的 IP 由用户输入给出。目前,当用户输入无法连接的 IP 时,我的程序会在尝试连接时挂起大约 2 分钟,而让我的应用程序挂起 2 分钟是不可能的。

示例程序说明了该问题和我尝试的修复:

#include <modbus/modbus.h>
#include <string>
#include <errno.h>

#include <iostream>

#define PRINT_TIMEVAL(timeval) std::cout << "timeval sec: " << timeval.tv_sec << " usec: " << timeval.tv_usec << std::endl;

int main()
{
    std::string ip = "192.168.2.5";
    int port = 502;
    int slaveNum = 1;
    int address = 1;
    int nb = 1;

    struct timeval currentTimeout;

    struct timeval responseTimeout;
    responseTimeout.tv_sec = 1;
    responseTimeout.tv_usec = 0;

    struct timeval byteTimeout;
    byteTimeout.tv_sec = 1;
    byteTimeout.tv_usec = 0;

    modbus_t *mb = modbus_new_tcp(ip.c_str(), port);
    modbus_set_debug(mb, true);
    modbus_set_error_recovery(mb, MODBUS_ERROR_RECOVERY_NONE);
    modbus_flush(mb);
    modbus_set_slave(mb, slaveNum);

    modbus_get_response_timeout(mb, &currentTimeout);
    PRINT_TIMEVAL(currentTimeout);

    modbus_set_response_timeout(mb, &responseTimeout);

    modbus_get_response_timeout(mb, &currentTimeout);
    PRINT_TIMEVAL(currentTimeout);

    modbus_get_byte_timeout(mb, &currentTimeout);
    PRINT_TIMEVAL(currentTimeout);

    modbus_set_byte_timeout(mb, &byteTimeout);

    modbus_get_byte_timeout(mb, &currentTimeout);
    PRINT_TIMEVAL(currentTimeout);

    std::cout << "About to connect to " << ip << std::endl;
    int errno;
    if((errno = modbus_connect(mb)))
    {
        std::cout << "Error when connecting: " << modbus_strerror(errno) << std::endl;
    }
    std::cout << "Done connecting to " << ip << std::endl;

    modbus_close(mb);
    modbus_free(mb);

    return 0;
}
正如你所看到的,我尝试将响应和字节超时变量设置为 1 秒(我也尝试过 500 和 5000 微秒)。当我读取超时值时,它们已正确设置,因此我假设它们与初始连接尝试没有任何关系。我还尝试将错误恢复模式显式设置为无,以防它尝试自行重新连接。

我想要一些可以在 x 时间后停止 modbus_connect 的命令,或者另一个命令,该命令允许我在尝试通过 modbus 连接之前检查 IP 是否有效,这也需要在短时间内超时时间。

我使用的是 libmodbus 版本 3.0.1-2

最佳答案

问题出在我的 libmodbus 版本 (3.0.1) 上,这是当前的发行版本。在该版本中,他们使用 linux connect 命令,但没有传递 NONBLOCKING 标志,因此 connect 将被阻塞 2 分 7 秒。我们通过升级到 libmodbus v3.1.1 解决了这个问题,该版本被标记为不稳定,但并未处于积极开发状态(他们正在 v3.1.2 上开发)。不幸的是,该版本的 libmodbus 不适用于 Windows。

关于c++ - Modbus 通讯减少超时等待时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25187694/

相关文章:

c++ - 基于二维数组初始化 vector

c++ - gdb 使用 All-Stop 模式单步执行单个线程

.net - sqlclient - 连接超时或命令超时

angularjs - AngularJS $http 服务请求的默认超时是多少?

c++ - 计算 Modbus RTU CRC 16

c++ - 错误 : operand of '*' must be a pointer

c++ - Direct3d 中的 vector 文本渲染系统

android-bluetooth - 为 Android Nexus 5 调用 getBluetoothService() 时没有 BluetoothManagerCallback

python - python软件可以通过modbus代替PLC中的逻辑梯形图程序吗?

python - 多个服务器 pymodbus 连接问题 Modbus TCP