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
|
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
|
//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 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 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.
|
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)
|
//Sert à informer la classe dérivée lorsqu'une exception se produit dans la communication Modbus (réponse)
|
||||||
|
|
||||||
|
|
||||||
//Slave Exception
|
//Slave virtual function
|
||||||
virtual void ModbusRequestException(quint8 ExceptionCode, quint8 FctCode) = 0; //Fonction virtuelle à être implémentée par la classe dérivée
|
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)
|
//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
|
#ifdef COMPILE_MODBUS_TEST_MODE
|
||||||
static quint16 VehTypeZT1 = 1024, VehTypeZT2 = 1024;
|
static quint16 VehTypeZT1 = 1024, VehTypeZT2 = 1024;
|
||||||
qint16 Reg = mModbusRepo->GetSingleReg(MODBUS_CC_ZT1_TRAIN_TYPE_REG_ADD);
|
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)
|
quint8 CModbusCCMgr::BCDToDecByte(const quint8 byte)
|
||||||
|
|||||||
@ -94,7 +94,8 @@ void CModbusSEIMgr::SocketConnected()
|
|||||||
{
|
{
|
||||||
emit ModbusMasterConnected(mModbusTCPSocketHandle->localAddress().toIPv4Address(),mModbusTCPSocketHandle->peerAddress().toIPv4Address());
|
emit ModbusMasterConnected(mModbusTCPSocketHandle->localAddress().toIPv4Address(),mModbusTCPSocketHandle->peerAddress().toIPv4Address());
|
||||||
// qDebug("Master: Connection established with NetTrac");
|
// 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();
|
mConnectionTimer->stop();
|
||||||
mSEIModbusUpdateTimer->start();
|
mSEIModbusUpdateTimer->start();
|
||||||
mSEIWatchdogTimer->start(SEI_MODBUS_WATCHDOG_TIMEOUT*2); //allow twice the time for the first watchdog to come in
|
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(StartAddress)
|
||||||
Q_UNUSED(Length)
|
Q_UNUSED(Length)
|
||||||
|
static bool FirstUpdate = true;
|
||||||
|
|
||||||
|
|
||||||
qint16 WD = mModbusRepo->GetSingleReg(SEI_MODBUS_SEI_WATCHDOG_REG);
|
qint16 WD = mModbusRepo->GetSingleReg(SEI_MODBUS_SEI_WATCHDOG_REG);
|
||||||
WD = (WD & SEI_MODBUS_SEI_WATCHDOG_MASK);
|
WD = (WD & SEI_MODBUS_SEI_WATCHDOG_MASK);
|
||||||
// qDebug("WD = %d",WD);
|
if(FirstUpdate)
|
||||||
if(WD != mSEIWatchdogState)
|
{
|
||||||
|
mSEIWatchdogState = WD;
|
||||||
|
FirstUpdate = false;
|
||||||
|
}
|
||||||
|
else if(WD != mSEIWatchdogState)
|
||||||
{
|
{
|
||||||
mSEIWatchdogTimer->start(SEI_MODBUS_WATCHDOG_TIMEOUT); //The watchdog has toggled. Kick the timer.
|
mSEIWatchdogTimer->start(SEI_MODBUS_WATCHDOG_TIMEOUT); //The watchdog has toggled. Kick the timer.
|
||||||
mSEIWatchdogState = WD;
|
mSEIWatchdogState = WD;
|
||||||
@ -224,16 +231,31 @@ void CModbusSEIMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Lengt
|
|||||||
emit SEIModbusLinkRecovered();
|
emit SEIModbusLinkRecovered();
|
||||||
CZTLog::instance()->AddLogString("Lien de communication (Watchdog) avec NetTrac rétabli",true);
|
CZTLog::instance()->AddLogString("Lien de communication (Watchdog) avec NetTrac rétabli",true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mSEILinkState == true) //only consider data when link is healthy
|
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();
|
SendZTRegistersToSEI();
|
||||||
|
|
||||||
emit ModbusMasterRepositoryUpdated();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CModbusSEIMgr::ModbusResponseException(quint8 ExceptionCode, quint8 FctCode)
|
void CModbusSEIMgr::ModbusResponseException(quint8 ExceptionCode, quint8 FctCode)
|
||||||
|
|||||||
@ -51,7 +51,7 @@ private:
|
|||||||
signals:
|
signals:
|
||||||
void ModbusMasterConnected(qint32 LocalIP, qint32 RemoteIP);
|
void ModbusMasterConnected(qint32 LocalIP, qint32 RemoteIP);
|
||||||
void ModbusMasterDisconnected();
|
void ModbusMasterDisconnected();
|
||||||
void ModbusMasterRepositoryUpdated();
|
void SEIAlarmClearUpdate(bool ZT1Clear, bool ZT2Clear);
|
||||||
void SEIModbusLinkLost();
|
void SEIModbusLinkLost();
|
||||||
void SEIModbusLinkRecovered();
|
void SEIModbusLinkRecovered();
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ CModbusTKTransport::CModbusTKTransport(CModbusRepository *CCRepo, CModbusReposit
|
|||||||
mMaintenanceMode = mForceZT1Clear = mForceZT2Clear = false;
|
mMaintenanceMode = mForceZT1Clear = mForceZT2Clear = false;
|
||||||
mZT1TKDataList.clear();
|
mZT1TKDataList.clear();
|
||||||
mZT2TKDataList.clear();
|
mZT2TKDataList.clear();
|
||||||
mZT1Clear = mZT2Clear = false;
|
mZT1CCClear = mZT2CCClear = mZT1SEIClear = mZT2SEIClear = false;
|
||||||
mNewTrainIncoming = false;
|
mNewTrainIncoming = false;
|
||||||
|
|
||||||
mModbusTKZT1SMState = MODBUS_ZT1_TK_STANDBY_STATE;
|
mModbusTKZT1SMState = MODBUS_ZT1_TK_STANDBY_STATE;
|
||||||
@ -582,7 +582,7 @@ void CModbusTKTransport::ExecZT1SM()
|
|||||||
}
|
}
|
||||||
case MODBUS_ZT1_TK_WAIT_FOR_CLEAR_STATE:
|
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.
|
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:
|
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.
|
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()
|
void CModbusTKTransport::ModbusCCUpdated()
|
||||||
{
|
{
|
||||||
qint16 ClearReg = mMCCodbusRepo->GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD);
|
qint16 ClearReg = mMCCodbusRepo->GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD);
|
||||||
mZT1Clear = (ClearReg & (MODBUS_CC_FCYCLE_ZT1_FLAG_MASK)) != 0;
|
mZT1CCClear = (ClearReg & (MODBUS_CC_FCYCLE_ZT1_FLAG_MASK)) != 0;
|
||||||
mZT2Clear = (ClearReg & (MODBUS_CC_FCYCLE_ZT2_FLAG_MASK)) != 0;
|
mZT2CCClear = (ClearReg & (MODBUS_CC_FCYCLE_ZT2_FLAG_MASK)) != 0;
|
||||||
// qDebug("ZT1Clr = %d",mZT1Clear);
|
// qDebug("ZT1Clr = %d",mZT1Clear);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CModbusTKTransport::ModbusSEIClearUpdate(bool ZT1Clear, bool ZT2Clear)
|
||||||
|
{
|
||||||
|
mZT1SEIClear = ZT1Clear;
|
||||||
|
mZT2SEIClear = ZT2Clear;
|
||||||
|
}
|
||||||
|
|||||||
@ -74,7 +74,7 @@ private:
|
|||||||
bool mMaintenanceMode, mForceZT1Clear, mForceZT2Clear;
|
bool mMaintenanceMode, mForceZT1Clear, mForceZT2Clear;
|
||||||
int mModbusTKZT1SMState,mModbusTKZT2SMState;
|
int mModbusTKZT1SMState,mModbusTKZT2SMState;
|
||||||
QTimer *mZT1TKStateMachineTimer, *mZT2TKStateMachineTimer;
|
QTimer *mZT1TKStateMachineTimer, *mZT2TKStateMachineTimer;
|
||||||
bool mZT1Clear, mZT2Clear;
|
bool mZT1CCClear, mZT2CCClear,mZT1SEIClear, mZT2SEIClear;
|
||||||
bool mNewTrainIncoming;
|
bool mNewTrainIncoming;
|
||||||
|
|
||||||
int RegOffset(qint16 Reg){return (int)Reg-MODBUS_ZT_DATA_BASE_REG;}
|
int RegOffset(qint16 Reg){return (int)Reg-MODBUS_ZT_DATA_BASE_REG;}
|
||||||
@ -86,6 +86,7 @@ public slots:
|
|||||||
void ExecZT1SM();
|
void ExecZT1SM();
|
||||||
void ExecZT2SM();
|
void ExecZT2SM();
|
||||||
void ModbusCCUpdated();
|
void ModbusCCUpdated();
|
||||||
|
void ModbusSEIClearUpdate(bool ZT1Clear, bool ZT2Clear);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MODBUSTKTRANSPORT_H
|
#endif // MODBUSTKTRANSPORT_H
|
||||||
|
|||||||
@ -608,6 +608,9 @@ unsigned int CZoneTest::InitZT()
|
|||||||
connect(mModbusSEIMgr,SIGNAL(ModbusMasterDisconnected()),panel.mSEISettingsPage,SLOT(ModbusSEIDisconnected()));
|
connect(mModbusSEIMgr,SIGNAL(ModbusMasterDisconnected()),panel.mSEISettingsPage,SLOT(ModbusSEIDisconnected()));
|
||||||
connect(mModbusSEIMgr,SIGNAL(SEIModbusLinkLost()),panel.mSEISettingsPage,SLOT(ModbusSEILinkDown()));
|
connect(mModbusSEIMgr,SIGNAL(SEIModbusLinkLost()),panel.mSEISettingsPage,SLOT(ModbusSEILinkDown()));
|
||||||
connect(mModbusSEIMgr,SIGNAL(SEIModbusLinkRecovered()),panel.mSEISettingsPage,SLOT(ModbusSEILinkUP()));
|
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();
|
panel.mZTMainPage->ModbusSEIDisconnected();
|
||||||
|
|
||||||
@ -615,6 +618,7 @@ unsigned int CZoneTest::InitZT()
|
|||||||
CModbusTKTransport *TransportInterface = new CModbusTKTransport(mCCModbusRepository,mSEIModbusRepository);
|
CModbusTKTransport *TransportInterface = new CModbusTKTransport(mCCModbusRepository,mSEIModbusRepository);
|
||||||
mTKTransportInterface = (CTKTransportInterface*)TransportInterface;
|
mTKTransportInterface = (CTKTransportInterface*)TransportInterface;
|
||||||
connect(mModbusCCMgr,SIGNAL(RepoHasChanged()),TransportInterface,SLOT(ModbusCCUpdated()));
|
connect(mModbusCCMgr,SIGNAL(RepoHasChanged()),TransportInterface,SLOT(ModbusCCUpdated()));
|
||||||
|
connect(mModbusSEIMgr,SIGNAL(SEIAlarmClearUpdate(bool,bool)),TransportInterface,SLOT(ModbusSEIClearUpdate(bool,bool)));
|
||||||
|
|
||||||
mZTStateMachine->BindModbusCCMgrPtr(mModbusCCMgr);
|
mZTStateMachine->BindModbusCCMgrPtr(mModbusCCMgr);
|
||||||
connect(mModbusCCMgr,SIGNAL(ModbusCCLinkRecovered()),panel.mZTMainPage,SLOT(ModbusCCConnected()));
|
connect(mModbusCCMgr,SIGNAL(ModbusCCLinkRecovered()),panel.mZTMainPage,SLOT(ModbusCCConnected()));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user