Développement Modbus CC (suite)
- Implémentation des stats de ZT1 et ZT2 (compo et type de train) provenant de Modbus CC. - Implémentation de l'inhibition ZT1 et ZT2 par la CC via Modbus. - Dégradation des données Modbus lors de la perte du Watchdog SACL.
This commit is contained in:
@@ -70,6 +70,7 @@ void CModbusCCMgr::ConnectionLost()
|
||||
mZTWatchdogTimer->stop();
|
||||
mCCWatchdogTimer->stop();
|
||||
emit ModbusCCDisconnected();
|
||||
ResetCCRepository();
|
||||
CZTLog::instance()->AddLogString(QString("Connection Modbus (Ethernet) avec la CC rompue."),true);
|
||||
}
|
||||
|
||||
@@ -97,39 +98,42 @@ void CModbusCCMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length
|
||||
}
|
||||
}
|
||||
|
||||
qint16 NTPWrite = mModbusRepo->GetSingleReg(MODBUS_CC_CLK_UPDATE_BASE_REG_ADD);
|
||||
if(NTPWrite == 1)
|
||||
if(mCCLinkState == true) //Ignore incoming data if the link is not healty (Watchdog).
|
||||
{
|
||||
//Update date & time...
|
||||
bool OK;
|
||||
QList<qint16> DateTime = mModbusRepo->GetRegs(MODUBS_CC_CLK_SEC_BASE_REG_ADD,4,&OK);
|
||||
if(OK)
|
||||
qint16 NTPWrite = mModbusRepo->GetSingleReg(MODBUS_CC_CLK_UPDATE_BASE_REG_ADD);
|
||||
if(NTPWrite == 1)
|
||||
{
|
||||
qint8 Secs, Minutes, Hours, Month, Day;
|
||||
Secs = (qint8)(DateTime.at(0) >> 8);
|
||||
Minutes = (qint8)(DateTime.at(1) & 0x00FF);
|
||||
Hours = (qint8)(DateTime.at(1) >> 8);
|
||||
Day = (qint8)(DateTime.at(2) & 0x00FF);
|
||||
Month = (qint8)(DateTime.at(2) >> 8);
|
||||
qint16 Year = DateTime.at(3);
|
||||
|
||||
QDateTime NetworkTime;
|
||||
NetworkTime.setTimeSpec(Qt::UTC);
|
||||
NetworkTime.setDate(QDate(Year,Month,Day));
|
||||
NetworkTime.setTime(QTime(Hours,Minutes,Secs));
|
||||
// QDateTime MyTime = NetworkTime.toLocalTime();
|
||||
|
||||
if(mLastDateTime != 0)
|
||||
//Update date & time...
|
||||
bool OK;
|
||||
QList<qint16> DateTime = mModbusRepo->GetRegs(MODUBS_CC_CLK_SEC_BASE_REG_ADD,4,&OK);
|
||||
if(OK)
|
||||
{
|
||||
delete mLastDateTime;
|
||||
qint8 Secs, Minutes, Hours, Month, Day;
|
||||
Secs = (qint8)(DateTime.at(0) >> 8);
|
||||
Minutes = (qint8)(DateTime.at(1) & 0x00FF);
|
||||
Hours = (qint8)(DateTime.at(1) >> 8);
|
||||
Day = (qint8)(DateTime.at(2) & 0x00FF);
|
||||
Month = (qint8)(DateTime.at(2) >> 8);
|
||||
qint16 Year = DateTime.at(3);
|
||||
|
||||
QDateTime NetworkTime;
|
||||
NetworkTime.setTimeSpec(Qt::UTC);
|
||||
NetworkTime.setDate(QDate(Year,Month,Day));
|
||||
NetworkTime.setTime(QTime(Hours,Minutes,Secs));
|
||||
// QDateTime MyTime = NetworkTime.toLocalTime();
|
||||
|
||||
if(mLastDateTime != 0)
|
||||
{
|
||||
delete mLastDateTime;
|
||||
}
|
||||
mLastDateTime = new QDateTime(NetworkTime.toLocalTime());
|
||||
emit ModbusDateTimeReceived(mLastDateTime);
|
||||
|
||||
qDebug("Date & Heure reçue du SACL: %s",mLastDateTime->toString("yyyy-MM-dd hh:mm:ss").toAscii().data());
|
||||
mModbusRepo->WriteSingleReg(MODBUS_CC_CLK_UPDATE_BASE_REG_ADD,0);
|
||||
}
|
||||
mLastDateTime = new QDateTime(NetworkTime.toLocalTime());
|
||||
emit ModbusDateTimeReceived(mLastDateTime);
|
||||
|
||||
qDebug("Date & Heure reçue du SACL: %s",mLastDateTime->toString("yyyy-MM-dd hh:mm:ss").toAscii().data());
|
||||
mModbusRepo->WriteSingleReg(MODBUS_CC_CLK_UPDATE_BASE_REG_ADD,0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
emit RepoHasChanged();
|
||||
@@ -144,6 +148,7 @@ void CModbusCCMgr::ModbusRequestException(quint8 ExceptionCode, quint8 FctCode)
|
||||
void CModbusCCMgr::ModbusCCWatchdogTimeout()
|
||||
{
|
||||
CZTLog::instance()->AddLogString("Perte du lien de communication avec la CC: Watchdog CC Expiré",true);
|
||||
ResetCCRepository();
|
||||
mCCLinkState = false;
|
||||
}
|
||||
|
||||
@@ -161,9 +166,36 @@ void CModbusCCMgr::ModbusZTWatchdogTimeout()
|
||||
}
|
||||
}
|
||||
|
||||
int CModbusCCMgr::ResetCCRepository()
|
||||
{
|
||||
//Clear read registers
|
||||
mModbusRepo->WriteSingleReg(MODBUS_CC_WATCHDOG_BASE_REG_ADD,0);
|
||||
mModbusRepo->WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,0);
|
||||
mModbusRepo->WriteSingleReg(MODBUS_CC_ZT1_TRAIN_TYPE_REG_ADD, MODBUS_CC_TRAIN_TYPE_INVALID_SACL_OFFLINE);
|
||||
mModbusRepo->WriteSingleReg(MODBUS_CC_ZT2_TRAIN_TYPE_REG_ADD, MODBUS_CC_TRAIN_TYPE_INVALID_SACL_OFFLINE);
|
||||
QList<qint16> ResetValues;
|
||||
ResetValues << 0 << 0 << 0 //Train compo ZT1
|
||||
<< 0 << 0 << 0 //Train compo ZT2
|
||||
<< 0 << 0 << 0 << 0 << 0; //Date & Time update registers
|
||||
|
||||
mModbusRepo->WriteMultipleRegs(MODBUS_CC_ZT1_TRAIN_ID_1_REG_ADD,ResetValues);
|
||||
|
||||
//Do not clear the TK (write) regisers, they will clear themselves when needed.
|
||||
|
||||
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
bool CModbusCCMgr::GetZT1InhibitionFlag()
|
||||
{
|
||||
bool OK = false;
|
||||
|
||||
if(mCCLinkState == false)//Ignore registers data if link is with SACL is not healthy
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
qint16 Reg = mModbusRepo->GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD,&OK);
|
||||
|
||||
if(OK)
|
||||
@@ -180,6 +212,12 @@ bool CModbusCCMgr::GetZT1InhibitionFlag()
|
||||
bool CModbusCCMgr::GetZT2InhibitionFlag()
|
||||
{
|
||||
bool OK = false;
|
||||
|
||||
if(mCCLinkState == false)//Ignore registers data if link is with SACL is not healthy
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
qint16 Reg = mModbusRepo->GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD,&OK);
|
||||
|
||||
if(OK)
|
||||
@@ -200,7 +238,7 @@ QList<qint16> CModbusCCMgr::GetZT1TrainComposition()
|
||||
QList<qint16> Compo;
|
||||
Compo = mModbusRepo->GetRegs(MODBUS_CC_ZT1_TRAIN_ID_1_REG_ADD,3,&OK);
|
||||
|
||||
if(OK == false)
|
||||
if(OK == false || mCCLinkState == false) //Ignore registers data if link is with SACL is not healthy
|
||||
{
|
||||
Compo << 0 << 0 << 0;
|
||||
}
|
||||
@@ -214,7 +252,7 @@ QList<qint16> CModbusCCMgr::GetZT2TrainComposition()
|
||||
QList<qint16> Compo;
|
||||
Compo = mModbusRepo->GetRegs(MODBUS_CC_ZT2_TRAIN_ID_1_REG_ADD,3,&OK);
|
||||
|
||||
if(OK == false)
|
||||
if(OK == false || mCCLinkState == false)//Ignore registers data if link is with SACL is not healthy
|
||||
{
|
||||
Compo << 0 << 0 << 0;
|
||||
}
|
||||
@@ -230,28 +268,36 @@ qint16 CModbusCCMgr::GetZT1TrainType()
|
||||
int Type = TRAIN_TYPE_UNKNOWN;
|
||||
if(OK)
|
||||
{
|
||||
if(Reg == 63)
|
||||
if(Reg == MODBUS_CC_TRAIN_TYPE_MR63)
|
||||
{
|
||||
Type = TRAIN_TYPE_MR63;
|
||||
}
|
||||
else if(Reg == 73)
|
||||
else if(Reg == MODBUS_CC_TRAIN_TYPE_MR73)
|
||||
{
|
||||
Type = TRAIN_TYPE_MR73;
|
||||
}
|
||||
else if(Reg == 10)
|
||||
else if(Reg == MODBUS_CC_TRAIN_TYPE_MPM10)
|
||||
{
|
||||
Type = TRAIN_TYPE_MPM10;
|
||||
}
|
||||
else if(Reg == 0)
|
||||
else if(Reg == MODBUS_CC_TRAIN_TYPE_MAINTENANCE)
|
||||
{
|
||||
Type = TRAIN_TYPE_MAINTENANCE_VEHICLE;
|
||||
}
|
||||
else if(Reg == MODBUS_CC_TRAIN_TYPE_INVALID_SACL_OFFLINE)
|
||||
{
|
||||
Type = TRAIN_TYPE_UNKNOWN;
|
||||
}
|
||||
else
|
||||
{
|
||||
CEngLog::instance()->AddLogString(QString("MODBUS: Réception d'un type de train ZT1 invalide du SACL [%1]").arg(Reg));
|
||||
Type = TRAIN_TYPE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
if(mCCLinkState == false)//Ignore registers data if link is with SACL is not healthy
|
||||
{
|
||||
Type = TRAIN_TYPE_UNKNOWN;
|
||||
}
|
||||
return Type;
|
||||
}
|
||||
|
||||
@@ -262,27 +308,36 @@ qint16 CModbusCCMgr::GetZT2TrainType()
|
||||
int Type = TRAIN_TYPE_UNKNOWN;
|
||||
if(OK)
|
||||
{
|
||||
if(Reg == 63)
|
||||
if(Reg == MODBUS_CC_TRAIN_TYPE_MR63)
|
||||
{
|
||||
Type = TRAIN_TYPE_MR63;
|
||||
}
|
||||
else if(Reg == 73)
|
||||
else if(Reg == MODBUS_CC_TRAIN_TYPE_MR73)
|
||||
{
|
||||
Type = TRAIN_TYPE_MR73;
|
||||
}
|
||||
else if(Reg == 10)
|
||||
else if(Reg == MODBUS_CC_TRAIN_TYPE_MPM10)
|
||||
{
|
||||
Type = TRAIN_TYPE_MPM10;
|
||||
}
|
||||
else if(Reg == 0)
|
||||
else if(Reg == MODBUS_CC_TRAIN_TYPE_MAINTENANCE)
|
||||
{
|
||||
Type = TRAIN_TYPE_MAINTENANCE_VEHICLE;
|
||||
}
|
||||
else if(Reg == MODBUS_CC_TRAIN_TYPE_INVALID_SACL_OFFLINE)
|
||||
{
|
||||
Type = TRAIN_TYPE_UNKNOWN;
|
||||
}
|
||||
else
|
||||
{
|
||||
CEngLog::instance()->AddLogString(QString("MODBUS: Réception d'un type de train ZT2 invalide du SACL [%1]").arg(Reg));
|
||||
Type = TRAIN_TYPE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
if(mCCLinkState == false) //Ignore registers data if link is with SACL is not healthy
|
||||
{
|
||||
Type = TRAIN_TYPE_UNKNOWN;
|
||||
}
|
||||
return Type;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,21 @@
|
||||
#include "ModbusRepository.h"
|
||||
#include <QTimer>
|
||||
|
||||
enum eModbusCCTrainTypes
|
||||
{
|
||||
MODBUS_CC_TRAIN_TYPE_MR63 = 63,
|
||||
MODBUS_CC_TRAIN_TYPE_MR73 = 73,
|
||||
MODBUS_CC_TRAIN_TYPE_MPM10 = 10,
|
||||
MODBUS_CC_TRAIN_TYPE_MAINTENANCE = 0,
|
||||
MODBUS_CC_TRAIN_TYPE_INVALID_ATS_OFFLINE = 98,
|
||||
MODBUS_CC_TRAIN_TYPE_INVALID_SERVICE_REBOOT = 97,
|
||||
MODBUS_CC_TRAIN_TYPE_INVALID_NOT_UPDATED = 99,
|
||||
MODBUS_CC_TRAIN_TYPE_INVALID_SACL_OFFLINE = 96,
|
||||
|
||||
MODBUS_CC_TRAIN_TYPE_MAX_VALUE
|
||||
};
|
||||
|
||||
|
||||
class CModbusCCMgr : public CModbusBackend
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -41,6 +56,8 @@ private:
|
||||
bool mCCLinkState;
|
||||
QDateTime *mLastDateTime;
|
||||
|
||||
int ResetCCRepository();
|
||||
|
||||
signals:
|
||||
void RepoHasChanged();
|
||||
void ModbusCCConnected();
|
||||
|
||||
@@ -703,5 +703,5 @@ void CModbusTKTransport::ModbusCCUpdated()
|
||||
qint16 ClearReg = mModbusRepo->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;
|
||||
qDebug("ZT1Clr = %d",mZT1Clear);
|
||||
// qDebug("ZT1Clr = %d",mZT1Clear);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user