gpt4 book ai didi

c++ - modbus 通信减少等待超时时间

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:44 26 4
gpt4 key购买 nike

我正在编写一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com