Modbus dev. Pas mal fini!
This commit is contained in:
parent
8f046e4223
commit
c855edfdca
@ -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)
|
||||
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user