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:
zonetest
2017-08-30 11:03:53 -04:00
parent 69ca721ef7
commit 0efe9b3e8d
13 changed files with 225 additions and 72 deletions
+92 -37
View File
@@ -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;
}
+17
View File
@@ -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();
+1 -1
View File
@@ -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);
}