В моем приложении у меня есть две QAction
, которые вызывают следующие функции для подключения и отключения от Modbus TCP:
QModbusClient *_modbus;
void modbusConnect(QString host, int port)
{
if (_modbus)
{
_modbus->disconnectDevice();
delete _modbus;
}
_modbus = new QModbusTcpClient(this);
_modbus->setConnectionParameter(QModbusDevice::NetworkPortParameter, port);
_modbus->setConnectionParameter(QModbusDevice::NetworkAddressParameter, host);
_modbus->setTimeout(250);
_modbus->setNumberOfRetries(1);
qDebug() << _modbus->connectDevice();
_timerConnectionTimeout.start();
}
void modbusDisconnect()
{
if (_modbus) _modbus->disconnectDevice();
}
void timerConnection_timeout()
{
_modbus->disconnectDevice();
emit timeoutConnection();
}
Первый вопрос : даже если удаленное устройство недоступно connectDevice()
функция всегда возвращает true.Но в документации сказано:
Подключает устройство к сети Modbus.Возвращает true в случае успеха;в противном случае false.
Следовательно, если оно не может подключить устройство к сети Modbus, оно должно вернуть false.Я не прав?
Теперь я должен обработать автоматическое переподключение.Это означает, что если устройство подключено, и оно больше недоступно (т.е. я его отключаю), когда оно снова станет доступным, я хочу подключиться к нему.Следовательно, я сделал что-то очень простое: при чтении таймаутов я делаю следующее:
ui->actionDisconnect->trigger();
QTimer::singleShot(1000, ui->actionConnect, &QAction::trigger);
Эти QAction
вызовут две функции выше.Что-то странное происходит: с этим кодом _modbus->state()
останется ConnectingState
навсегда.Даже когда устройство доступно - я имею в виду, что оно вообще не подключается.
Вместо этого, если я щелкну мышью по этим действиям, оно подключится немедленно! Выполненный код такой же... почему это не работает программно?Есть ли лучший способ восстановить соединение?