我正在编写一个C++应用程序,它需要通过modbus连接到各种PLC,这些PLC的I是由用户输入的。目前,当用户输入一个无法连接到的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, ¤tTimeout);
PRINT_TIMEVAL(currentTimeout);
modbus_set_response_timeout(mb, &responseTimeout);
modbus_get_response_timeout(mb, ¤tTimeout);
PRINT_TIMEVAL(currentTimeout);
modbus_get_byte_timeout(mb, ¤tTimeout);
PRINT_TIMEVAL(currentTimeout);
modbus_set_byte_timeout(mb, &byteTimeout);
modbus_get_byte_timeout(mb, ¤tTimeout);
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微秒)。当我读取超时值时,它们已被正确设置,因此我假设它们与初始连接尝试没有任何关系。我还尝试显式地将错误恢复模式设置为none,以防它试图自行重新连接。
我想要的东西要么是在x时间之后停止modbus_connect,要么是另一个命令,允许我在尝试通过modbus连接之前检查IP是否有效,这也需要在短时间之后超时。
我使用的是libmodbus 3.0.1-2版本
发布于 2014-08-14 12:17:51
问题在于我的libmodbus (3.0.1)版本,这是当前的发行版。在该版本中,他们使用的是linux connect命令,但没有传递NONBLOCKING标志,因此connect将被阻塞2m7s。我们通过升级到libmodbus v3.1.1解决了这个问题,它被标记为不稳定,但未处于活动开发阶段(他们正在开发v3.1.2)。不幸的是,该版本的libmodbus不适用于windows。
发布于 2014-08-07 16:49:44
使用线程侦听每个设备,并将这些消息推入可以处理的队列中,而无需阻塞其他线程。
https://stackoverflow.com/questions/25187694
复制相似问题