Merge PR #25: Improve modbus TCP class and reconnect mechanism

pull/30/head
Jenkins nymea 2021-06-30 12:44:11 +02:00
commit d50e760650
1 changed files with 45 additions and 29 deletions

View File

@ -57,6 +57,14 @@ ModbusTCPMaster::~ModbusTCPMaster()
{
if (m_reconnectTimer) {
m_reconnectTimer->stop();
delete m_reconnectTimer;
m_reconnectTimer = nullptr;
}
if (m_modbusTcpClient) {
m_modbusTcpClient->disconnectDevice();
delete m_modbusTcpClient;
m_modbusTcpClient = nullptr;
}
if (m_modbusTcpClient) {
@ -84,27 +92,40 @@ void ModbusTCPMaster::setHostAddress(const QHostAddress &hostAddress)
m_hostAddress = hostAddress;
}
QHostAddress ModbusTCPMaster::hostAddress() const
{
return m_hostAddress;
}
uint ModbusTCPMaster::port() const
{
return m_port;
}
bool ModbusTCPMaster::setPort(uint port)
{
m_port = port;
return connectDevice();
}
bool ModbusTCPMaster::setHostAddress(const QHostAddress &hostAddress)
{
m_hostAddress = hostAddress;
return connectDevice();
}
bool ModbusTCPMaster::connectDevice() {
// TCP connection to target device
qCDebug(dcModbusTCP()) << "Setting up TCP connecion" << QString("%1:%2").arg(m_hostAddress.toString()).arg(m_port);
if (!m_modbusTcpClient)
return false;
// Only connect if we are in the unconnected state
if (m_modbusTcpClient->state() == QModbusDevice::UnconnectedState) {
qCDebug(dcModbusTCP()) << "Connecting modbus TCP client to" << QString("%1:%2").arg(m_hostAddress.toString()).arg(m_port);
m_modbusTcpClient->setConnectionParameter(QModbusDevice::NetworkPortParameter, m_port);
m_modbusTcpClient->setConnectionParameter(QModbusDevice::NetworkAddressParameter, m_hostAddress.toString());
m_modbusTcpClient->setTimeout(m_timeout);
m_modbusTcpClient->setNumberOfRetries(m_numberOfRetries);
return m_modbusTcpClient->connectDevice();
} else if (m_modbusTcpClient->state() != QModbusDevice::ConnectedState) {
// Restart the timer in case of connecting not finished yet or closing
m_reconnectTimer->start();
} else {
qCWarning(dcModbusTCP()) << "Connect modbus TCP device" << QString("%1:%2").arg(m_hostAddress.toString()).arg(m_port) << "called, but the socket is currently in the" << m_modbusTcpClient->state();
}
m_modbusTcpClient->setConnectionParameter(QModbusDevice::NetworkPortParameter, m_port);
m_modbusTcpClient->setConnectionParameter(QModbusDevice::NetworkAddressParameter, m_hostAddress.toString());
m_modbusTcpClient->setTimeout(m_timeout);
m_modbusTcpClient->setNumberOfRetries(m_numberOfRetries);
return false;
return m_modbusTcpClient->connectDevice();
}
void ModbusTCPMaster::disconnectDevice()
@ -112,21 +133,9 @@ void ModbusTCPMaster::disconnectDevice()
if (!m_modbusTcpClient)
return;
// Stop the reconnect timer since disconnect was explicitly called
m_reconnectTimer->stop();
m_modbusTcpClient->disconnectDevice();
}
bool ModbusTCPMaster::reconnectDevice()
{
qCWarning(dcModbusTCP()) << "Reconnecting modbus TCP device" << QString("%1:%2").arg(m_hostAddress.toString()).arg(m_port);
if (!m_modbusTcpClient)
return false;
disconnectDevice();
return connectDevice();
}
bool ModbusTCPMaster::connected() const
{
return m_connected;
@ -154,9 +163,14 @@ void ModbusTCPMaster::setTimeout(int timeout)
m_modbusTcpClient->setTimeout(timeout);
}
int ModbusTCPMaster::timeout()
QString ModbusTCPMaster::errorString() const
{
return m_modbusTcpClient->timeout();
return m_modbusTcpClient->errorString();
}
QModbusDevice::Error ModbusTCPMaster::error() const
{
return m_modbusTcpClient->error();
}
QString ModbusTCPMaster::errorString() const
@ -485,4 +499,6 @@ void ModbusTCPMaster::onModbusStateChanged(QModbusDevice::State state)
} else if (state == QModbusDevice::UnconnectedState) {
m_reconnectTimer->start();
}
emit connectionStateChanged(connected);
}