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

View File

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

View File

@ -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;
@ -228,12 +235,27 @@ void CModbusSEIMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Lengt
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)

View File

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

View File

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

View File

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

View File

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