Qt5 - QModbus TCP: переподключение не работает по коду - PullRequest
0 голосов
/ 19 октября 2018

В моем приложении у меня есть две 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 навсегда.Даже когда устройство доступно - я имею в виду, что оно вообще не подключается.

Вместо этого, если я щелкну мышью по этим действиям, оно подключится немедленно! Выполненный код такой же... почему это не работает программно?Есть ли лучший способ восстановить соединение?

...