modbus通信减少超时等待时间 我正在编写一个C++应用程序,需要通过Modbus连接到各种PLC,这些PLCs的IPS是由用户输入提供的。目前,当用户插入一个无法连接的IP时,我的程序会挂起2分钟左右以尝试连接,而我的应用程序挂起2分钟是不可取的

modbus通信减少超时等待时间 我正在编写一个C++应用程序,需要通过Modbus连接到各种PLC,这些PLCs的IPS是由用户输入提供的。目前,当用户插入一个无法连接的IP时,我的程序会挂起2分钟左右以尝试连接,而我的应用程序挂起2分钟是不可取的,c++,connection-timeout,modbus,C++,Connection Timeout,Modbus,示例程序说明了问题和我尝试的修复: #include <modbus/modbus.h> #include <string> #include <errno.h> #include <iostream> #define PRINT_TIMEVAL(timeval) std::cout << "timeval sec: " << timeval.tv_sec << " usec: " << time

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

#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;
}
#包括
#包括
#包括
#包括

#定义PRINT_TIMEVAL(TIMEVAL)std::cout使用线程侦听每个设备,并将这些消息推送到一个队列中,该队列可以在不中断其他线程的情况下进行处理。

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