From 32ca136904be6106c9373eea5054b39d0fde2204 Mon Sep 17 00:00:00 2001 From: jfmartel Date: Wed, 18 Sep 2019 13:53:18 -0400 Subject: [PATCH] SEI Modbus Dev Contd --- Configuration/ZTSettings.ztc | Bin 41 -> 41 bytes sources/GlobalDefine.h | 3 +- sources/GuiElements/SEISettingsPage.cpp | 4 +- sources/Modbus/ModbusSEIMgr.cpp | 85 ++++++++++++++++++------ sources/Modbus/ModbusSEIMgr.h | 19 ++++-- sources/ZTSettings.cpp | 5 +- sources/Zonetest.cpp | 10 ++- sources/Zonetest.h | 2 +- 8 files changed, 96 insertions(+), 32 deletions(-) diff --git a/Configuration/ZTSettings.ztc b/Configuration/ZTSettings.ztc index 0c537a467efa9c3d654d28d1c06b5449b08aabb0..b814bee69922f3fea61c8665b7adf4e8b079a0a7 100644 GIT binary patch delta 16 XcmdPYoFK=|$iOx4fi%N`70l@XAZ-MK delta 16 VcmdPYoFK=|z`!-{fi#Ga0RSG`1XBP2 diff --git a/sources/GlobalDefine.h b/sources/GlobalDefine.h index 459db40..28d4748 100644 --- a/sources/GlobalDefine.h +++ b/sources/GlobalDefine.h @@ -62,7 +62,8 @@ #define EXT_ANALOG_INPUT_ACQUISITION_PERIOD 200000 //nanoseconds #define FILESYSTEM_FORCED_SYNC_TIMEOUT (qint64)2400000 //2.4 million milliseconds = 40 minutes #define MAX_ENGINEERING_LOG_FILESIZE (qint32)1000000 //~1Mb -//#define OUTPUT_EXTIO_SAMPLE_RATE +#define SEI_CLIENT_RECONNECT_TIMEOUT 200 //ms +#define SEI_CLIENT_CONNECTION_TIMEOUT 500 //ms #define USE_DAQNAVI_LIB diff --git a/sources/GuiElements/SEISettingsPage.cpp b/sources/GuiElements/SEISettingsPage.cpp index 74ef68f..fd35666 100644 --- a/sources/GuiElements/SEISettingsPage.cpp +++ b/sources/GuiElements/SEISettingsPage.cpp @@ -115,7 +115,7 @@ CSEISettingsPage::CSEISettingsPage(QGraphicsWidget *Parent) mSEIModbusLinkLED->setPos(IpSettingsPosx,IpSettingsPosy+5); IpSettingsPosy += 30; - mModbusSEIConnectionState = new QGraphicsTextItem("Connection HPC: DÉCONNECTÉE",this); + mModbusSEIConnectionState = new QGraphicsTextItem("Connection NetTrac: DÉCONNECTÉE",this); mModbusSEIConnectionState->setFont(font); mModbusSEIConnectionState->setPos(IpSettingsPosx+30,IpSettingsPosy); mSEIConnectionLED = new QGraphicsPixmapItem(QPixmap("./Images/red-led-on-md.png").scaled(25,25),this); @@ -157,7 +157,7 @@ void CSEISettingsPage::ButtonClicked(CTextButtonWidget *BtnPtr) QString LogEntry = QString("Changement des paramètres Modbus SEI -> Adresse IP %1").arg(IPAddress.toString().toAscii().data()); CZTLog::instance()->AddLogString(LogEntry,true); - mProgramHandle->ApplySEISettings();//TODO + mProgramHandle->ApplySEISettings(IPAddress);//TODO } } diff --git a/sources/Modbus/ModbusSEIMgr.cpp b/sources/Modbus/ModbusSEIMgr.cpp index 4402fb6..b3a9b4e 100644 --- a/sources/Modbus/ModbusSEIMgr.cpp +++ b/sources/Modbus/ModbusSEIMgr.cpp @@ -1,19 +1,27 @@ #include "ModbusSEIMgr.h" #include #include "ModbusCCDefs.h" +#include "GlobalDefine.h" -CModbusSEIMgr::CModbusSEIMgr(CModbusRepository *Repo, int ModbusPort, int DevID): +CModbusSEIMgr::CModbusSEIMgr(CModbusRepository *Repo, QHostAddress ServerIP, int ModbusPort, int DevID): CModbusBackend(Repo) { // connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady())); mModbusMode = MODBUS_MASTER_MODE; mModbusPort = ModbusPort; mDeviceID = DevID; + mSEIIPAddress = ServerIP; + + mConnectionTimer = new QTimer(); + mConnectionTimer->setInterval(SEI_CLIENT_RECONNECT_TIMEOUT); + mConnectionTimer->setSingleShot(false); + mConnectionTimer->stop(); mModbusTCPSocketHandle = new QTcpSocket(); connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady())); connect(mModbusTCPSocketHandle,SIGNAL(disconnected()),this,SLOT(SocketDisconnected())); connect(mModbusTCPSocketHandle,SIGNAL(connected()),this,SLOT(SocketConnected())); + connect(mConnectionTimer,SIGNAL(timeout()),this,SLOT(ConnectionTimerExpired())); } CModbusSEIMgr::~CModbusSEIMgr() @@ -24,9 +32,20 @@ CModbusSEIMgr::~CModbusSEIMgr() mModbusTCPSocketHandle->waitForDisconnected(1000); } delete mModbusTCPSocketHandle; + + if(mConnectionTimer) + delete mConnectionTimer; + if(mSEIWatchdogTimer) + delete mSEIWatchdogTimer; } -int CModbusSEIMgr::ConnectToSlave(QString SlaveIP, int SlavePort) +int CModbusSEIMgr::StartSEICommunication() +{ + mConnectionTimer->start(); + return RET_OK; +} + +int CModbusSEIMgr::ConnectToSlave(QHostAddress SlaveIP, int SlavePort) { if(mModbusTCPSocketHandle->state() != QAbstractSocket::UnconnectedState) { @@ -42,12 +61,12 @@ int CModbusSEIMgr::DisconnectFromSlave() { if(mModbusTCPSocketHandle->state() != QAbstractSocket::ConnectedState) { - qDebug("Trying to disconnect a non connected socket"); mModbusTCPSocketHandle->disconnectFromHost(); + mConnectionTimer->start(); return 0; } - qDebug("Requesting Disconnection..."); + qDebug("Requesting Disconnection from NetTrac..."); mModbusTCPSocketHandle->disconnectFromHost(); return 1; } @@ -55,13 +74,16 @@ int CModbusSEIMgr::DisconnectFromSlave() void CModbusSEIMgr::SocketConnected() { emit ModbusMasterConnected(this); - qDebug("Master: Connection established with slave"); + qDebug("Master: Connection established with NetTrac"); + mConnectionTimer->stop(); } void CModbusSEIMgr::SocketDisconnected() { ModbusLinkDisconnected(); emit ModbusMasterDisconnected(this); + mConnectionTimer->start(); + qDebug("Disconnected from NetTrac"); } int CModbusSEIMgr::ReadModbusRegisters() @@ -70,6 +92,44 @@ int CModbusSEIMgr::ReadModbusRegisters() return RET_OK; } +void CModbusSEIMgr::ConnectionTimerExpired() +{ + //Establish connection only if not connected + if(mModbusTCPSocketHandle->state() == QAbstractSocket::UnconnectedState) + { + ConnectToSlave(mSEIIPAddress,mModbusPort); + mConnectionTimeout.restart(); + } + else if(mModbusTCPSocketHandle->state() == QAbstractSocket::ConnectingState) + { + //Default connection timeout is 1s for sockets. We want this to be shorter. + //if connection timeout is reached, disconnect and retry. + if(mConnectionTimeout.hasExpired(SEI_CLIENT_CONNECTION_TIMEOUT)) + { + mModbusTCPSocketHandle->disconnectFromHost(); + qDebug("Connection timeout expired... disconnecting"); + } + } +} + +int CModbusSEIMgr::SEISettingsChanged(QHostAddress ServerIP, int ModbusPort, int DevID) +{ + if(DevID > 255) + { + return RET_ERROR; + } + + + mSEIIPAddress = ServerIP; + mModbusPort = ModbusPort; + mDeviceID = DevID; + + //Make shure we are disconnected. Connection timer will do the reconnection. + DisconnectFromSlave(); + + return RET_OK; + +} void CModbusSEIMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length) { @@ -77,24 +137,9 @@ void CModbusSEIMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Lengt Q_UNUSED(Length) emit ModbusMasterRepositoryUpdated(); - qDebug("Database updated with ZT data..."); } void CModbusSEIMgr::ModbusResponseException(quint8 ExceptionCode, quint8 FctCode) { qDebug("Modbus MASTER exception: code:%d Fct:%d",ExceptionCode,FctCode); } - -int CModbusSEIMgr::SendAN1ToZT() -{ - //return SendWriteHoldingRegistersRequest(CC_AN1_REGISTER_ADDRESS,1); - //return SendWriteSingleRegisterRequest(CC_AN1_REGISTER_ADDRESS); - return RET_OK; -} - -int CModbusSEIMgr::SendAN2ToZT() -{ - //return SendWriteHoldingRegistersRequest(CC_AN2_REGISTER_ADDRESS,1); - //return SendWriteSingleRegisterRequest(CC_AN2_REGISTER_ADDRESS); - return RET_OK; -} diff --git a/sources/Modbus/ModbusSEIMgr.h b/sources/Modbus/ModbusSEIMgr.h index 55631eb..4872b79 100644 --- a/sources/Modbus/ModbusSEIMgr.h +++ b/sources/Modbus/ModbusSEIMgr.h @@ -1,8 +1,12 @@ #ifndef CMODBUSSEIMGR_H #define CMODBUSSEIMGR_H + #include #include "ModbusBackend.h" +#include +#include +#include @@ -11,20 +15,26 @@ class CModbusSEIMgr : public CModbusBackend { Q_OBJECT public: - explicit CModbusSEIMgr(CModbusRepository *Repo, int ModbusPort, int DevID); + explicit CModbusSEIMgr(CModbusRepository *Repo, QHostAddress ServerIP, int ModbusPort, int DevID); ~CModbusSEIMgr(); - int ConnectToSlave(QString SlaveIP, int SlavePort); + int ConnectToSlave(QHostAddress SlaveIP, int SlavePort); int DisconnectFromSlave(); int ReadModbusRegisters(); - int SendAN1ToZT(); - int SendAN2ToZT(); + int StartSEICommunication(); + int SEISettingsChanged(QHostAddress ServerIP, int ModbusPort, int DevID); + virtual void RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length); virtual void ModbusResponseException(quint8 ExceptionCode, quint8 FctCode); + QTimer *mConnectionTimer; + QTimer *mSEIWatchdogTimer; + QElapsedTimer mConnectionTimeout; + private: int mModbusPort; + QHostAddress mSEIIPAddress; signals: void ModbusMasterConnected(CModbusSEIMgr *); @@ -34,6 +44,7 @@ signals: public slots: void SocketConnected(); void SocketDisconnected(); + void ConnectionTimerExpired(); }; #endif // CMODBUSSEIMGR_H diff --git a/sources/ZTSettings.cpp b/sources/ZTSettings.cpp index b07bccd..f913577 100644 --- a/sources/ZTSettings.cpp +++ b/sources/ZTSettings.cpp @@ -246,7 +246,10 @@ void CZTSettingsFileMgr::LogSettings(CZTSettingsData *SettingsData, bool LogStat stream << QString().fromUtf8(" Utilisation communication Modbus CC = ") << SettingsData->mUseModbusCC; CZTLog::instance()->AddLogString(temp,true); temp.clear(); - stream << QString().fromUtf8(" Adresse IP réseau TLT = ") << SettingsData->mModbusCCHostAddress.toString(); + stream << QString().fromUtf8(" Adresse IP CC = ") << SettingsData->mModbusCCHostAddress.toString(); + CZTLog::instance()->AddLogString(temp,true); + temp.clear(); + stream << QString().fromUtf8(" Adresse IP SEI = ") << SettingsData->mSEIModbusHostAddress.toString(); CZTLog::instance()->AddLogString(temp,true); temp.clear(); diff --git a/sources/Zonetest.cpp b/sources/Zonetest.cpp index 5311e16..c02b76e 100644 --- a/sources/Zonetest.cpp +++ b/sources/Zonetest.cpp @@ -599,7 +599,6 @@ unsigned int CZoneTest::InitZT() connect(mModbusCCMgr,SIGNAL(RepoHasChanged()),TransportInterface,SLOT(ModbusCCUpdated())); mZTStateMachine->BindModbusCCMgrPtr(mModbusCCMgr); - // connect(mModbusCCMgr,SIGNAL(RepoHasChanged()),mZTStateMachine,SLOT(ModbusCCANUpdate())); connect(mModbusCCMgr,SIGNAL(ModbusCCLinkRecovered()),panel.mZTMainPage,SLOT(ModbusCCConnected())); connect(mModbusCCMgr,SIGNAL(ModbusCCLinkLost()),panel.mZTMainPage,SLOT(ModbusCCDisconnected())); connect(mModbusCCMgr,SIGNAL(ModbusDateTimeReceived(QDateTime*)),this,SLOT(ModbusDateTimeUpdate(QDateTime*))); @@ -617,8 +616,9 @@ unsigned int CZoneTest::InitZT() mSEIModbusRepository->AddHRDataMap(SEI_MODBUS_SEI_DATA_BASE_REG,SEI_MODBUS_SEI_TABLE_DATA_SIZE); //Add the SEI data map if(mModbusSEIMgr == 0) { - mModbusSEIMgr = new CModbusSEIMgr(mSEIModbusRepository,ModbusSEIPort,SEIDevID); + mModbusSEIMgr = new CModbusSEIMgr(mSEIModbusRepository,mZTSettings->mSEIModbusHostAddress,ModbusSEIPort,SEIDevID); } + mModbusSEIMgr->StartSEICommunication(); } @@ -1195,6 +1195,7 @@ void CZoneTest::ModbusSettingsChangedReboot(bool UseModbus, QHostAddress CCHostA //Messages from SEI settings page void CZoneTest::OpenSEISettingsPage() { + panel.mSEISettingsPage->SetActualSettings(mZTSettings->mSEIModbusHostAddress); panel.mSEISettingsPage->show(); panel.mOptionsPage->hide(); } @@ -1204,9 +1205,12 @@ void CZoneTest::CloseSEISettingsPage() panel.mSEISettingsPage->hide(); } -void CZoneTest::ApplySEISettings() +void CZoneTest::ApplySEISettings(QHostAddress SEIHostAdd) { + mZTSettings->mSEIModbusHostAddress = SEIHostAdd; + mZTSettingsFileMgr.SaveSettings(mZTSettings); + //TODO: apply changes and reconnect. } ///Messages from ZTLog viewer page diff --git a/sources/Zonetest.h b/sources/Zonetest.h index 0d43549..1686ce3 100644 --- a/sources/Zonetest.h +++ b/sources/Zonetest.h @@ -132,7 +132,7 @@ public: void OpenSEISettingsPage(); void CloseSEISettingsPage(); - void ApplySEISettings(); + void ApplySEISettings(QHostAddress SEIHostAdd); void ShowZTLogViewerPage(); void HideZTLogViewerPage();