Qt5-QModbus TCP:重新连接无法通过代码进行

时间:2018-10-19 07:19:29

标签: qt5 modbus-tcp

在我的应用程序中,我有两个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;否则为假。

因此,如果无法将设备连接到Modbus网络,则应返回false。我错了吗?

现在,我必须处理自动重新连接。这意味着如果设备已连接,但当我想重新连接它时再次无法使用时,就无法访​​问(即我将其关闭)。因此,我做了一些非常简单的事情:当阅读超时时,我将执行以下操作:

ui->actionDisconnect->trigger();
QTimer::singleShot(1000, ui->actionConnect, &QAction::trigger);

那些QAction将调用上面的两个函数。好吧,发生了一件奇怪的事情:使用此代码,_modbus->state()将永远保持ConnectingState。即使设备可用-我的意思是它根本无法连接。

相反,如果我用鼠标单击这些操作,它将立即连接! 执行的代码是完全相同的...为什么它不能以编程方式工作?有更好的重新连接方法吗?

0 个答案:

没有答案