Modbus dev. Pas mal fini!

This commit is contained in:
jfmartel 2019-10-03 13:29:14 -04:00
parent 8f046e4223
commit c855edfdca
7 changed files with 58 additions and 19 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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();

View File

@ -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;
}

View File

@ -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

View File

@ -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()));