在我的应用程序中,我有两个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
。即使设备可用-我的意思是它根本无法连接。
相反,如果我用鼠标单击这些操作,它将立即连接! 执行的代码是完全相同的...为什么它不能以编程方式工作?有更好的重新连接方法吗?