diff --git a/sources/Modbus/ModbusBackend.h b/sources/Modbus/ModbusBackend.h index 42c8362..6a4bbe9 100644 --- a/sources/Modbus/ModbusBackend.h +++ b/sources/Modbus/ModbusBackend.h @@ -140,18 +140,18 @@ public: virtual void RegistersDatabaseUpdated(quint16 StartAdderss, quint16 Length) = 0; //Fonction virtuelle à être implémentée par la classe dérivée //Appelée lorsque de nouvelles données ont été reçues du réseau Modbus et écrites dans le registre + + + //Master virtual functions + virtual void ModbusResponseException(quint8 ExceptionCode, quint8 FctCode); //Fonction virtuelle à être implémentée par la classe dérivée virtual void ModbusWriteMultipleRegsSuccess(); //Fonction virtuelle à être implémentée par la classe dérivée (Modbus Master seulement). Appelée suite à la réception d'une réponse à une requête d'écriture multiple. virtual void ModbusWriteSingleRegsSuccess(); //Fonction virtuelle à être implémentée par la classe dérivée (Modbus Master seulement). Appelée suite à la réception d'une réponse à une requête d'écriture simple. virtual void ModbusRequestMaxRetryReached(); //Fonction virtuelle à être implémentée par la classe dérivée (Modbus Master seulement). Appelée lors de l'atteinte du nombre maximal d'essai de transmission d'une requête. - - - //Master Exception - virtual void ModbusResponseException(quint8 ExceptionCode, quint8 FctCode) = 0; //Fonction virtuelle à être implémentée par la classe dérivée //Sert à informer la classe dérivée lorsqu'une exception se produit dans la communication Modbus (réponse) - //Slave Exception - virtual void ModbusRequestException(quint8 ExceptionCode, quint8 FctCode) = 0; //Fonction virtuelle à être implémentée par la classe dérivée + //Slave virtual function + virtual void ModbusRequestException(quint8 ExceptionCode, quint8 FctCode); //Fonction virtuelle à être implémentée par la classe dérivée //Sert à informer le parent lorsqu'une exception se produit dans la communication Modbus (requête) diff --git a/sources/Modbus/ModbusCCMgr.cpp b/sources/Modbus/ModbusCCMgr.cpp index a7e6215..9dbd40d 100644 --- a/sources/Modbus/ModbusCCMgr.cpp +++ b/sources/Modbus/ModbusCCMgr.cpp @@ -206,6 +206,11 @@ void CModbusCCMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length } } + + + emit RepoHasChanged(); + + #ifdef COMPILE_MODBUS_TEST_MODE static quint16 VehTypeZT1 = 1024, VehTypeZT2 = 1024; qint16 Reg = mModbusRepo->GetSingleReg(MODBUS_CC_ZT1_TRAIN_TYPE_REG_ADD); @@ -225,7 +230,7 @@ void CModbusCCMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length } - emit RepoHasChanged(); + } quint8 CModbusCCMgr::BCDToDecByte(const quint8 byte) diff --git a/sources/Modbus/ModbusSEIMgr.cpp b/sources/Modbus/ModbusSEIMgr.cpp index 49004d1..1c4c76e 100644 --- a/sources/Modbus/ModbusSEIMgr.cpp +++ b/sources/Modbus/ModbusSEIMgr.cpp @@ -94,7 +94,8 @@ void CModbusSEIMgr::SocketConnected() { emit ModbusMasterConnected(mModbusTCPSocketHandle->localAddress().toIPv4Address(),mModbusTCPSocketHandle->peerAddress().toIPv4Address()); // qDebug("Master: Connection established with NetTrac"); - CZTLog::instance()->AddLogString("Connection Modbus (Ethernet) avec NetTrac établi",true); + // CZTLog::instance()->AddLogString("Connection Modbus (Ethernet) avec NetTrac établi",true); + CZTLog::instance()->AddLogString(QString("Connection Modbus (Ethernet) avec la NetTrac établie. IP locale [%1] - IP NetTrac [%2]").arg(mModbusTCPSocketHandle->localAddress().toString()).arg(mModbusTCPSocketHandle->peerAddress().toString()),true); mConnectionTimer->stop(); mSEIModbusUpdateTimer->start(); mSEIWatchdogTimer->start(SEI_MODBUS_WATCHDOG_TIMEOUT*2); //allow twice the time for the first watchdog to come in @@ -210,11 +211,17 @@ void CModbusSEIMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Lengt { Q_UNUSED(StartAddress) Q_UNUSED(Length) + static bool FirstUpdate = true; + qint16 WD = mModbusRepo->GetSingleReg(SEI_MODBUS_SEI_WATCHDOG_REG); WD = (WD & SEI_MODBUS_SEI_WATCHDOG_MASK); -// qDebug("WD = %d",WD); - if(WD != mSEIWatchdogState) + if(FirstUpdate) + { + mSEIWatchdogState = WD; + FirstUpdate = false; + } + else if(WD != mSEIWatchdogState) { mSEIWatchdogTimer->start(SEI_MODBUS_WATCHDOG_TIMEOUT); //The watchdog has toggled. Kick the timer. mSEIWatchdogState = WD; @@ -224,16 +231,31 @@ void CModbusSEIMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Lengt emit SEIModbusLinkRecovered(); CZTLog::instance()->AddLogString("Lien de communication (Watchdog) avec NetTrac rétabli",true); } - } + } if(mSEILinkState == true) //only consider data when link is healthy { + bool OK; + qint16 AlarmsReg = mModbusRepo->GetSingleReg(SEI_MODBUS_SEI_ALARMS_RESET_REG,&OK); + bool ZT1Clear, ZT2Clear; + if(OK) + { + ZT1Clear = (AlarmsReg & SEI_MODBUS_SEI_ZT1_ALARM_RESET_MASK) != 0; + + ZT2Clear = (AlarmsReg & SEI_MODBUS_SEI_ZT2_ALARM_RESET_MASK) != 0; + + emit SEIAlarmClearUpdate(ZT1Clear,ZT2Clear); + } + else + { + CEngLog::instance()->AddLogString(qPrintable(QString("Erreur de logique dans ModbusSEIMgr::RegistersDatabaseUpdated, impossible de lire la table modbus à l'adresse %1").arg(SEI_MODBUS_SEI_ALARMS_RESET_REG))); + } } SendZTRegistersToSEI(); - emit ModbusMasterRepositoryUpdated(); + } void CModbusSEIMgr::ModbusResponseException(quint8 ExceptionCode, quint8 FctCode) diff --git a/sources/Modbus/ModbusSEIMgr.h b/sources/Modbus/ModbusSEIMgr.h index 768ceb0..710b227 100644 --- a/sources/Modbus/ModbusSEIMgr.h +++ b/sources/Modbus/ModbusSEIMgr.h @@ -51,7 +51,7 @@ private: signals: void ModbusMasterConnected(qint32 LocalIP, qint32 RemoteIP); void ModbusMasterDisconnected(); - void ModbusMasterRepositoryUpdated(); + void SEIAlarmClearUpdate(bool ZT1Clear, bool ZT2Clear); void SEIModbusLinkLost(); void SEIModbusLinkRecovered(); diff --git a/sources/Modbus/ModbusTKTransport.cpp b/sources/Modbus/ModbusTKTransport.cpp index dd7096b..94eed9f 100644 --- a/sources/Modbus/ModbusTKTransport.cpp +++ b/sources/Modbus/ModbusTKTransport.cpp @@ -12,7 +12,7 @@ CModbusTKTransport::CModbusTKTransport(CModbusRepository *CCRepo, CModbusReposit mMaintenanceMode = mForceZT1Clear = mForceZT2Clear = false; mZT1TKDataList.clear(); mZT2TKDataList.clear(); - mZT1Clear = mZT2Clear = false; + mZT1CCClear = mZT2CCClear = mZT1SEIClear = mZT2SEIClear = false; mNewTrainIncoming = false; mModbusTKZT1SMState = MODBUS_ZT1_TK_STANDBY_STATE; @@ -582,7 +582,7 @@ void CModbusTKTransport::ExecZT1SM() } case MODBUS_ZT1_TK_WAIT_FOR_CLEAR_STATE: { - if(mZT1Clear == true || (mMaintenanceMode == true && mForceZT1Clear == true)) + if(mZT1CCClear == true || mZT1SEIClear == true || (mMaintenanceMode == true && mForceZT1Clear == true)) { ClearTK(ZT1_TYPE_ID); //Remise à zéro des données d'alarmes dans la table modbus. @@ -673,7 +673,7 @@ void CModbusTKTransport::ExecZT2SM() } case MODBUS_ZT2_TK_WAIT_FOR_CLEAR_STATE: { - if(mZT2Clear == true || (mMaintenanceMode == true && mForceZT2Clear == true)) + if(mZT2CCClear == true || mZT2SEIClear == true || (mMaintenanceMode == true && mForceZT2Clear == true)) { ClearTK(ZT2_TYPE_ID); //Remise à zéro des données d'alarmes dans la table modbus. @@ -733,7 +733,14 @@ void CModbusTKTransport::ExecZT2SM() void CModbusTKTransport::ModbusCCUpdated() { qint16 ClearReg = mMCCodbusRepo->GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD); - mZT1Clear = (ClearReg & (MODBUS_CC_FCYCLE_ZT1_FLAG_MASK)) != 0; - mZT2Clear = (ClearReg & (MODBUS_CC_FCYCLE_ZT2_FLAG_MASK)) != 0; + mZT1CCClear = (ClearReg & (MODBUS_CC_FCYCLE_ZT1_FLAG_MASK)) != 0; + mZT2CCClear = (ClearReg & (MODBUS_CC_FCYCLE_ZT2_FLAG_MASK)) != 0; // qDebug("ZT1Clr = %d",mZT1Clear); } + + +void CModbusTKTransport::ModbusSEIClearUpdate(bool ZT1Clear, bool ZT2Clear) +{ + mZT1SEIClear = ZT1Clear; + mZT2SEIClear = ZT2Clear; +} diff --git a/sources/Modbus/ModbusTKTransport.h b/sources/Modbus/ModbusTKTransport.h index c6e932e..cd6be12 100644 --- a/sources/Modbus/ModbusTKTransport.h +++ b/sources/Modbus/ModbusTKTransport.h @@ -74,7 +74,7 @@ private: bool mMaintenanceMode, mForceZT1Clear, mForceZT2Clear; int mModbusTKZT1SMState,mModbusTKZT2SMState; QTimer *mZT1TKStateMachineTimer, *mZT2TKStateMachineTimer; - bool mZT1Clear, mZT2Clear; + bool mZT1CCClear, mZT2CCClear,mZT1SEIClear, mZT2SEIClear; bool mNewTrainIncoming; int RegOffset(qint16 Reg){return (int)Reg-MODBUS_ZT_DATA_BASE_REG;} @@ -86,6 +86,7 @@ public slots: void ExecZT1SM(); void ExecZT2SM(); void ModbusCCUpdated(); + void ModbusSEIClearUpdate(bool ZT1Clear, bool ZT2Clear); }; #endif // MODBUSTKTRANSPORT_H diff --git a/sources/Zonetest.cpp b/sources/Zonetest.cpp index e17cd8f..99411cb 100644 --- a/sources/Zonetest.cpp +++ b/sources/Zonetest.cpp @@ -608,6 +608,9 @@ unsigned int CZoneTest::InitZT() connect(mModbusSEIMgr,SIGNAL(ModbusMasterDisconnected()),panel.mSEISettingsPage,SLOT(ModbusSEIDisconnected())); connect(mModbusSEIMgr,SIGNAL(SEIModbusLinkLost()),panel.mSEISettingsPage,SLOT(ModbusSEILinkDown())); connect(mModbusSEIMgr,SIGNAL(SEIModbusLinkRecovered()),panel.mSEISettingsPage,SLOT(ModbusSEILinkUP())); + connect(mModbusSEIMgr,SIGNAL(SEIModbusLinkRecovered()),panel.mZTMainPage,SLOT(ModbusSEIConnected())); + connect(mModbusSEIMgr,SIGNAL(SEIModbusLinkLost()),panel.mZTMainPage,SLOT(ModbusSEIDisconnected())); + panel.mZTMainPage->ModbusSEIDisconnected(); @@ -615,6 +618,7 @@ unsigned int CZoneTest::InitZT() CModbusTKTransport *TransportInterface = new CModbusTKTransport(mCCModbusRepository,mSEIModbusRepository); mTKTransportInterface = (CTKTransportInterface*)TransportInterface; connect(mModbusCCMgr,SIGNAL(RepoHasChanged()),TransportInterface,SLOT(ModbusCCUpdated())); + connect(mModbusSEIMgr,SIGNAL(SEIAlarmClearUpdate(bool,bool)),TransportInterface,SLOT(ModbusSEIClearUpdate(bool,bool))); mZTStateMachine->BindModbusCCMgrPtr(mModbusCCMgr); connect(mModbusCCMgr,SIGNAL(ModbusCCLinkRecovered()),panel.mZTMainPage,SLOT(ModbusCCConnected()));