Modbus dev

Add modbus server closing capability before exiting application
Add some pointers cleanup and fix memory leaks
This commit is contained in:
zonetest 2017-09-08 14:05:25 -04:00
parent 9029432d46
commit 7a35241f76
6 changed files with 52 additions and 3 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
/Escape.ZT
/LOG/LogZT.txt
/ING/IngLog.txt
/sources/TKGenerator.cpp.autosave

View File

@ -46,7 +46,11 @@ CModbusBackend::CModbusBackend(CModbusRepository *Repo)
CModbusBackend::~CModbusBackend()
{
for(int i= 0; i < mRequestsList.size(); i++)
{
delete mRequestsList[i];
}
mRequestsList.clear();
}
void CModbusBackend::ModbusDataReady()
@ -62,6 +66,7 @@ void CModbusBackend::ModbusDataReady()
*TransactionDataStrm >> Transaction.mHeader;
*TransactionDataStrm >> Transaction.mPDU.mFunctionCode;
Transaction.mPDU.mData = InData.right(Transaction.mHeader.mMessageLength - 2); //-2 to remove Device ID and Function Code.
//
// qDebug("---------------------------------------");
// qDebug("modbus data received %s",InData.toHex().data());
@ -85,6 +90,8 @@ void CModbusBackend::ModbusDataReady()
{
CEngLog::instance()->AddLogString("Erreur Modbus: <Illegal modbus backend mode...>"); //Erreur de logique interne. Ne doit pas survenir normalement
}
delete TransactionDataStrm;
}
void CModbusBackend::ModbusLinkDisconnected()
@ -432,9 +439,11 @@ int CModbusBackend::SendModbusRequest(CModbusRequest *Request)
Buffer.close();
ModbusPacket.append(Request->mPDU.mData);
qDebug("Request packet: %s",ModbusPacket.toHex().data());
mModbusTCPSocketHandle->write(ModbusPacket);
delete PacketDataStrm;
return RET_OK;
}
@ -457,6 +466,7 @@ int CModbusBackend::SendErrorResponse(CModbusTransaction RequestTransaction, qui
ModbusPacket.append(ErrorCode);
CEngLog::instance()->AddLogString(QString("Modbus: Envoi d'un code d'un code d'erreur. Error Code %1, Error Packet: %2").arg(ErrorCode).arg(ModbusPacket.toHex().data()));
// qDebug("Sending error code %d. Error packet: %s",ErrorCode,ModbusPacket.toHex().data());

View File

@ -39,6 +39,10 @@ CModbusCCMgr::~CModbusCCMgr()
delete mZTWatchdogTimer;
delete mCCWatchdogTimer;
if(mLastDateTime != 0)
{
delete mLastDateTime;
}
}
int CModbusCCMgr::StartModbusCCServer()
@ -48,6 +52,30 @@ int CModbusCCMgr::StartModbusCCServer()
return 1;
}
int CModbusCCMgr::CloseModbusCCServer()
{
mModbusServer->close();
if(mModbusTCPSocketHandle != 0)
{
mModbusTCPSocketHandle->flush();
if(mModbusTCPSocketHandle->state() != QAbstractSocket::UnconnectedState)
{
// qDebug("Disconnecting socket");
mModbusTCPSocketHandle->disconnectFromHost();
if(mModbusTCPSocketHandle->waitForDisconnected(1000) == false)
{
// qDebug("Could not disconnect socket");
}
}
mModbusTCPSocketHandle->close();
delete mModbusTCPSocketHandle;
}
CZTLog::instance()->AddLogString(QString("Serveur Modbus Commande Centralisée démarré sur le port %1").arg(mModbusPort),true);
return 1;
}
void CModbusCCMgr::NewModbusConnection()
{
mModbusTCPSocketHandle = mModbusServer->nextPendingConnection();
@ -128,7 +156,7 @@ void CModbusCCMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length
{
delete mLastDateTime;
}
mLastDateTime = new QDateTime(NetworkTime.toLocalTime());
mLastDateTime = new QDateTime(NetworkTime.toLocalTime()); //The QDateTime object will be deleted by the slot function...
emit ModbusDateTimeReceived(mLastDateTime);
qDebug("Date & Heure reçue du SACL: %s",mLastDateTime->toString("yyyy-MM-dd hh:mm:ss").toAscii().data());

View File

@ -30,6 +30,7 @@ public:
virtual ~CModbusCCMgr();
int StartModbusCCServer();
int CloseModbusCCServer();
bool IsModbusConnected();

View File

@ -117,6 +117,7 @@ int CModbusTKTransport::SendTKToCC(int ZT)
CEngLog::instance()->AddLogString("Erreur de logique. ModbusTkTransport::SendTKToCC() ZT1 -> Lecture repository invalide.");
}
PannesReg = DataBuf.at(RegOffset(MODBUS_MISC_DATA_BASE_REG_ADD));
for(int i = 0; i < mZT1TKDataList.size(); i++)

View File

@ -1254,10 +1254,18 @@ void CZoneTest::ApplicationQuit(bool PowerButton)
else
mZtState = ZT_POWER_BUTTON_EXIT_STATE;
if(mModbusCCMgr != 0)
{
if(mModbusCCMgr->CloseModbusCCServer() != 0)
{
qDebug("Modbus server closed");
}
}
// qDebug("Creating escape file...");
system("echo exit > ./Escape.ZT"); //Crée un fichier vide pour informer le script de ne pas redémarrer l'application
system("echo exit > ./Escape.ZT"); //Crée un fichier vide pour informer le script de ne pas redémarrer l'application
system("sync");
mExtIOThread->quit();