From 6f596a9f1ef234148389e627caaf26ae595616ab Mon Sep 17 00:00:00 2001 From: jfmartel Date: Fri, 20 Sep 2019 14:59:46 -0400 Subject: [PATCH] Modbus SEI Dev again... --- sources/Modbus/ModbusBackend.cpp | 5 ++ sources/Modbus/ModbusSEIMgr.cpp | 76 ++++++++++++++++++++++------ sources/Modbus/ModbusSEIMgr.h | 10 ++-- sources/Modbus/ModbusTKTransport.cpp | 10 +++- sources/Modbus/ModbusTKTransport.h | 8 ++- sources/Zonetest.cpp | 33 +++++++----- 6 files changed, 107 insertions(+), 35 deletions(-) diff --git a/sources/Modbus/ModbusBackend.cpp b/sources/Modbus/ModbusBackend.cpp index a01a747..0b2eaeb 100644 --- a/sources/Modbus/ModbusBackend.cpp +++ b/sources/Modbus/ModbusBackend.cpp @@ -554,17 +554,22 @@ int CModbusBackend::SendWriteHoldingRegistersRequest(quint16 StartAddress, quint NewRequest->mPDU.mData.clear(); NewRequest->mPDU.mFunctionCode = MODBUS_FCT_WRITE_MULTIPLE_REGISTERS; + //Start address quint8 HighByte, LowByte; LowByte = StartAddress & 0x00FF; HighByte = (StartAddress >> 8) & 0x00FF; NewRequest->mPDU.mData.append(HighByte); NewRequest->mPDU.mData.append(LowByte); + //Nb Registers LowByte = RegisterCount & 0x00FF; HighByte = (RegisterCount >> 8) & 0x00FF; NewRequest->mPDU.mData.append(HighByte); NewRequest->mPDU.mData.append(LowByte); + //Byte Count + NewRequest->mPDU.mData.append(RegData.size()); + NewRequest->mPDU.mData.append(RegData); NewRequest->mHeader.mMessageLength = NewRequest->mPDU.mData.size() + 2; diff --git a/sources/Modbus/ModbusSEIMgr.cpp b/sources/Modbus/ModbusSEIMgr.cpp index 91aee85..0a2809c 100644 --- a/sources/Modbus/ModbusSEIMgr.cpp +++ b/sources/Modbus/ModbusSEIMgr.cpp @@ -1,10 +1,11 @@ #include "ModbusSEIMgr.h" #include #include "ModbusCCDefs.h" +#include "ModbusSEIDefs.h" #include "GlobalDefine.h" -CModbusSEIMgr::CModbusSEIMgr(CModbusRepository *Repo, QHostAddress ServerIP, int ModbusPort, int DevID): - CModbusBackend(Repo) +CModbusSEIMgr::CModbusSEIMgr(CModbusRepository *SEIRepo, CModbusRepository *CCRepo, QHostAddress ServerIP, int ModbusPort, int DevID): + CModbusBackend(SEIRepo) { // connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady())); mModbusMode = MODBUS_MASTER_MODE; @@ -12,16 +13,27 @@ CModbusSEIMgr::CModbusSEIMgr(CModbusRepository *Repo, QHostAddress ServerIP, int mDeviceID = DevID; mSEIIPAddress = ServerIP; + mCCRepoHandle = CCRepo; + + mZTWatchdog = false; + mConnectionTimer = new QTimer(); mConnectionTimer->setInterval(SEI_CLIENT_RECONNECT_TIMEOUT); mConnectionTimer->setSingleShot(false); mConnectionTimer->stop(); + mSEIModbusUpdateTimer = new QTimer(); + mSEIModbusUpdateTimer->setInterval(1000); + mSEIModbusUpdateTimer->setSingleShot(false); + mSEIModbusUpdateTimer->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())); + connect(mSEIModbusUpdateTimer,SIGNAL(timeout()),this,SLOT(SEIModbusUpdateTimerExpired())); } CModbusSEIMgr::~CModbusSEIMgr() @@ -35,8 +47,8 @@ CModbusSEIMgr::~CModbusSEIMgr() if(mConnectionTimer) delete mConnectionTimer; - if(mSEIWatchdogTimer) - delete mSEIWatchdogTimer; + if(mSEIModbusUpdateTimer) + delete mSEIModbusUpdateTimer; } int CModbusSEIMgr::StartSEICommunication() @@ -76,6 +88,7 @@ void CModbusSEIMgr::SocketConnected() emit ModbusMasterConnected(mModbusTCPSocketHandle->localAddress().toIPv4Address(),mModbusTCPSocketHandle->peerAddress().toIPv4Address()); qDebug("Master: Connection established with NetTrac"); mConnectionTimer->stop(); + mSEIModbusUpdateTimer->start(); } void CModbusSEIMgr::SocketDisconnected() @@ -83,6 +96,7 @@ void CModbusSEIMgr::SocketDisconnected() ModbusLinkDisconnected(); emit ModbusMasterDisconnected(); mConnectionTimer->start(); + mSEIModbusUpdateTimer->stop(); qDebug("Disconnected from NetTrac"); } @@ -98,18 +112,7 @@ void CModbusSEIMgr::ConnectionTimerExpired() 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) @@ -131,6 +134,49 @@ int CModbusSEIMgr::SEISettingsChanged(QHostAddress ServerIP, int ModbusPort, int } +void CModbusSEIMgr::SEIModbusUpdateTimerExpired() +{ + //The SEI Modbus table is updated on event, triggered by the TKTransport object (see ZTTKUpdated()). + //Just update the watchdog and send the current table. + mZTWatchdog = !mZTWatchdog; + + if(mZTWatchdog) + { + mModbusRepo->WriteSingleReg(SEI_MODBUS_ZT_WATCHDOG_REG,0x01); + } + else + { + mModbusRepo->WriteSingleReg(SEI_MODBUS_ZT_WATCHDOG_REG,0); + } + + SendWriteHoldingRegistersRequest(SEI_MODBUS_ZT_DATA_BASE_REG,SEI_MODBUS_ZT_TABLE_DATA_SIZE); + +} + + +//This signal is emitted by TKTransport when a changed happened in the TK after the CC modbus table has been updated. +//We just need to copy the relevant info from the CC repo... +//As per specification, we must also send an update on change to the SEI +void CModbusSEIMgr::ZTTKUpdated() +{ + //Copy data from CC modbus table to SEI modbus table. + mModbusRepo->WriteHRData(SEI_MODBUS_ZT_DATA_BASE_REG,SEI_MODBUS_ZT_TABLE_DATA_SIZE,mCCRepoHandle->GetHRData(MODBUS_ZT_DATA_BASE_REG,SEI_MODBUS_ZT_TABLE_DATA_SIZE)); + + //Keep our actual watchdog value.. + if(mZTWatchdog) + { + mModbusRepo->WriteSingleReg(SEI_MODBUS_ZT_WATCHDOG_REG,0x01); + } + else + { + mModbusRepo->WriteSingleReg(SEI_MODBUS_ZT_WATCHDOG_REG,0); + } + + //Send the data now to NetTrac + SendWriteHoldingRegistersRequest(SEI_MODBUS_ZT_WATCHDOG_REG,SEI_MODBUS_ZT_TABLE_DATA_SIZE); + +} + void CModbusSEIMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length) { Q_UNUSED(StartAddress) diff --git a/sources/Modbus/ModbusSEIMgr.h b/sources/Modbus/ModbusSEIMgr.h index e2d175b..fc8a3c7 100644 --- a/sources/Modbus/ModbusSEIMgr.h +++ b/sources/Modbus/ModbusSEIMgr.h @@ -15,7 +15,7 @@ class CModbusSEIMgr : public CModbusBackend { Q_OBJECT public: - explicit CModbusSEIMgr(CModbusRepository *Repo, QHostAddress ServerIP, int ModbusPort, int DevID); + explicit CModbusSEIMgr(CModbusRepository *SEIRepo,CModbusRepository *CCRepo, QHostAddress ServerIP, int ModbusPort, int DevID); ~CModbusSEIMgr(); int ConnectToSlave(QHostAddress SlaveIP, int SlavePort); @@ -29,12 +29,14 @@ public: virtual void ModbusResponseException(quint8 ExceptionCode, quint8 FctCode); QTimer *mConnectionTimer; - QTimer *mSEIWatchdogTimer; - QElapsedTimer mConnectionTimeout; +// QTimer *mSEIWatchdogTimer; + QTimer *mSEIModbusUpdateTimer; private: int mModbusPort; QHostAddress mSEIIPAddress; + CModbusRepository *mCCRepoHandle; + bool mZTWatchdog; signals: void ModbusMasterConnected(qint32 LocalIP, qint32 RemoteIP); @@ -45,6 +47,8 @@ public slots: void SocketConnected(); void SocketDisconnected(); void ConnectionTimerExpired(); + void SEIModbusUpdateTimerExpired(); + void ZTTKUpdated(); }; #endif // CMODBUSSEIMGR_H diff --git a/sources/Modbus/ModbusTKTransport.cpp b/sources/Modbus/ModbusTKTransport.cpp index 82ae9fd..dd7096b 100644 --- a/sources/Modbus/ModbusTKTransport.cpp +++ b/sources/Modbus/ModbusTKTransport.cpp @@ -4,9 +4,10 @@ #include "EngLog.h" -CModbusTKTransport::CModbusTKTransport(CModbusRepository *Repo) +CModbusTKTransport::CModbusTKTransport(CModbusRepository *CCRepo, CModbusRepository *SEIRepo) { - mMCCodbusRepo = Repo; + mMCCodbusRepo = CCRepo; + mSEIModbusRepo = SEIRepo; mZT1CDVState = mZT2CDVState = false; mMaintenanceMode = mForceZT1Clear = mForceZT2Clear = false; mZT1TKDataList.clear(); @@ -68,6 +69,8 @@ int CModbusTKTransport::ClearTK(int ZT) mMCCodbusRepo->WriteMultipleRegs(MODBUS_ZT1_ALARM_DATA_BASE_REG_ADD,Data); mMCCodbusRepo->WriteSingleReg(MODBUS_MISC_DATA_BASE_REG_ADD,PannesReg); + emit TKUpdated(); + } else if(ZT == ZT2_TYPE_ID) @@ -94,6 +97,7 @@ int CModbusTKTransport::ClearTK(int ZT) //Clear repo now... mMCCodbusRepo->WriteMultipleRegs(MODBUS_ZT2_ALARM_DATA_BASE_REG_ADD,Data); mMCCodbusRepo->WriteSingleReg(MODBUS_MISC_DATA_BASE_REG_ADD,PannesReg); + emit TKUpdated(); } else { @@ -263,6 +267,7 @@ int CModbusTKTransport::SendTKToCC(int ZT) DataBuf[RegOffset(MODBUS_ZT1_ALARM_DATA_BASE_REG_ADD)] = FlagsReg; DataBuf[RegOffset(MODBUS_MISC_DATA_BASE_REG_ADD)] = PannesReg; mMCCodbusRepo->WriteMultipleRegs(MODBUS_ZT_DATA_BASE_REG,DataBuf); + emit TKUpdated(); } else if(ZT == ZT2_TYPE_ID) @@ -365,6 +370,7 @@ int CModbusTKTransport::SendTKToCC(int ZT) DataBuf[RegOffset(MODBUS_ZT2_ALARM_DATA_BASE_REG_ADD)] = FlagsReg; DataBuf[RegOffset(MODBUS_MISC_DATA_BASE_REG_ADD)] = PannesReg; mMCCodbusRepo->WriteMultipleRegs(MODBUS_ZT_DATA_BASE_REG,DataBuf); + emit TKUpdated(); } else diff --git a/sources/Modbus/ModbusTKTransport.h b/sources/Modbus/ModbusTKTransport.h index 45f591e..c6e932e 100644 --- a/sources/Modbus/ModbusTKTransport.h +++ b/sources/Modbus/ModbusTKTransport.h @@ -24,6 +24,7 @@ #include "ModbusRepository.h" #include #include "ModbusCCDefs.h" +#include "ModbusSEIDefs.h" class CModbusTKTransport : public CTKTransportInterface @@ -43,7 +44,7 @@ public: - CModbusTKTransport(CModbusRepository *Repo); + CModbusTKTransport(CModbusRepository *CCRepo, CModbusRepository *SEIRepo); ~CModbusTKTransport(); @@ -67,7 +68,7 @@ public: virtual unsigned int EnterMaintenance(); private: - CModbusRepository *mMCCodbusRepo; + CModbusRepository *mMCCodbusRepo,*mSEIModbusRepo; QList mZT1TKDataList,mZT2TKDataList; bool mZT1CDVState, mZT2CDVState; bool mMaintenanceMode, mForceZT1Clear, mForceZT2Clear; @@ -78,6 +79,9 @@ private: int RegOffset(qint16 Reg){return (int)Reg-MODBUS_ZT_DATA_BASE_REG;} +signals: + void TKUpdated(); + public slots: void ExecZT1SM(); void ExecZT2SM(); diff --git a/sources/Zonetest.cpp b/sources/Zonetest.cpp index ac0cd53..976ead8 100644 --- a/sources/Zonetest.cpp +++ b/sources/Zonetest.cpp @@ -594,7 +594,23 @@ unsigned int CZoneTest::InitZT() } mModbusCCMgr->StartModbusCCServer(); - CModbusTKTransport *TransportInterface = new CModbusTKTransport(mCCModbusRepository); + + mSEIModbusRepository = new CModbusRepository; + mSEIModbusRepository->AddHRDataMap(SEI_MODBUS_ZT_DATA_BASE_REG,SEI_MODBUS_ZT_TABLE_DATA_SIZE); //Add the ZT data map + 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,mCCModbusRepository,mZTSettings->mSEIModbusHostAddress,ModbusSEIPort,SEIDevID); + } + mModbusSEIMgr->StartSEICommunication(); + + connect(mModbusSEIMgr,SIGNAL(ModbusMasterConnected(qint32,qint32)),panel.mSEISettingsPage,SLOT(ModbusSEIConnected(qint32,qint32))); + connect(mModbusSEIMgr,SIGNAL(ModbusMasterDisconnected()),panel.mSEISettingsPage,SLOT(ModbusSEIDisconnected())); + + panel.mZTMainPage->ModbusSEIDisconnected(); + + + CModbusTKTransport *TransportInterface = new CModbusTKTransport(mCCModbusRepository,mSEIModbusRepository); mTKTransportInterface = (CTKTransportInterface*)TransportInterface; connect(mModbusCCMgr,SIGNAL(RepoHasChanged()),TransportInterface,SLOT(ModbusCCUpdated())); @@ -606,24 +622,15 @@ unsigned int CZoneTest::InitZT() connect(mModbusCCMgr,SIGNAL(ModbusCCDisconnected()),panel.mModbusSettingsPage,SLOT(ModbusCCDisconnected())); connect(mModbusCCMgr,SIGNAL(ModbusCCLinkLost()),panel.mModbusSettingsPage,SLOT(ModbusCCLinkDown())); connect(mModbusCCMgr,SIGNAL(ModbusCCLinkRecovered()),panel.mModbusSettingsPage,SLOT(ModbusCCLinkUP())); + + connect(TransportInterface,SIGNAL(TKUpdated()),mModbusSEIMgr,SLOT(ZTTKUpdated())); + panel.mZTMainPage->ModbusCCDisconnected(); panel.mZTMainPage->mZT1Stats->Init(true); panel.mZTMainPage->mZT2Stats->Init(true); - mSEIModbusRepository = new CModbusRepository; - mSEIModbusRepository->AddHRDataMap(SEI_MODBUS_ZT_DATA_BASE_REG,SEI_MODBUS_ZT_TABLE_DATA_SIZE); //Add the ZT data map - 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,mZTSettings->mSEIModbusHostAddress,ModbusSEIPort,SEIDevID); - } - mModbusSEIMgr->StartSEICommunication(); - connect(mModbusSEIMgr,SIGNAL(ModbusMasterConnected(qint32,qint32)),panel.mSEISettingsPage,SLOT(ModbusSEIConnected(qint32,qint32))); - connect(mModbusSEIMgr,SIGNAL(ModbusMasterDisconnected()),panel.mSEISettingsPage,SLOT(ModbusSEIDisconnected())); - - panel.mZTMainPage->ModbusSEIDisconnected();