#include "ModbusSEIMgr.h" #include #include "ModbusCCDefs.h" #include "GlobalDefine.h" CModbusSEIMgr::CModbusSEIMgr(CModbusRepository *Repo, QHostAddress ServerIP, int ModbusPort, int DevID): CModbusBackend(Repo) { // connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady())); mModbusMode = MODBUS_MASTER_MODE; mModbusPort = ModbusPort; mDeviceID = DevID; mSEIIPAddress = ServerIP; mConnectionTimer = new QTimer(); mConnectionTimer->setInterval(SEI_CLIENT_RECONNECT_TIMEOUT); mConnectionTimer->setSingleShot(false); mConnectionTimer->stop(); mModbusTCPSocketHandle = new QTcpSocket(); connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady())); connect(mModbusTCPSocketHandle,SIGNAL(disconnected()),this,SLOT(SocketDisconnected())); connect(mModbusTCPSocketHandle,SIGNAL(connected()),this,SLOT(SocketConnected())); connect(mConnectionTimer,SIGNAL(timeout()),this,SLOT(ConnectionTimerExpired())); } CModbusSEIMgr::~CModbusSEIMgr() { if(mModbusTCPSocketHandle->state() != QAbstractSocket::UnconnectedState) { mModbusTCPSocketHandle->disconnectFromHost(); mModbusTCPSocketHandle->waitForDisconnected(1000); } delete mModbusTCPSocketHandle; if(mConnectionTimer) delete mConnectionTimer; if(mSEIWatchdogTimer) delete mSEIWatchdogTimer; } int CModbusSEIMgr::StartSEICommunication() { mConnectionTimer->start(); return RET_OK; } int CModbusSEIMgr::ConnectToSlave(QHostAddress SlaveIP, int SlavePort) { if(mModbusTCPSocketHandle->state() != QAbstractSocket::UnconnectedState) { return RET_ERROR; } mModbusTCPSocketHandle->connectToHost(SlaveIP,SlavePort); return RET_OK; } int CModbusSEIMgr::DisconnectFromSlave() { if(mModbusTCPSocketHandle->state() != QAbstractSocket::ConnectedState) { mModbusTCPSocketHandle->disconnectFromHost(); mConnectionTimer->start(); return 0; } qDebug("Requesting Disconnection from NetTrac..."); mModbusTCPSocketHandle->disconnectFromHost(); return 1; } void CModbusSEIMgr::SocketConnected() { emit ModbusMasterConnected(this); qDebug("Master: Connection established with NetTrac"); mConnectionTimer->stop(); } void CModbusSEIMgr::SocketDisconnected() { ModbusLinkDisconnected(); emit ModbusMasterDisconnected(this); mConnectionTimer->start(); qDebug("Disconnected from NetTrac"); } int CModbusSEIMgr::ReadModbusRegisters() { //return SendReadHoldingRegistersRequest(ZT_DATA_BASE_REGISTER_ADDRESS,4); //Read all 3 registers from ZT (2000 - 2003) return RET_OK; } void CModbusSEIMgr::ConnectionTimerExpired() { //Establish connection only if not connected if(mModbusTCPSocketHandle->state() == QAbstractSocket::UnconnectedState) { ConnectToSlave(mSEIIPAddress,mModbusPort); mConnectionTimeout.restart(); } else if(mModbusTCPSocketHandle->state() == QAbstractSocket::ConnectingState) { //Default connection timeout is 1s for sockets. We want this to be shorter. //if connection timeout is reached, disconnect and retry. if(mConnectionTimeout.hasExpired(SEI_CLIENT_CONNECTION_TIMEOUT)) { mModbusTCPSocketHandle->disconnectFromHost(); qDebug("Connection timeout expired... disconnecting"); } } } int CModbusSEIMgr::SEISettingsChanged(QHostAddress ServerIP, int ModbusPort, int DevID) { if(DevID > 255) { return RET_ERROR; } mSEIIPAddress = ServerIP; mModbusPort = ModbusPort; mDeviceID = DevID; //Make shure we are disconnected. Connection timer will do the reconnection. DisconnectFromSlave(); return RET_OK; } void CModbusSEIMgr::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length) { Q_UNUSED(StartAddress) Q_UNUSED(Length) emit ModbusMasterRepositoryUpdated(); } void CModbusSEIMgr::ModbusResponseException(quint8 ExceptionCode, quint8 FctCode) { qDebug("Modbus MASTER exception: code:%d Fct:%d",ExceptionCode,FctCode); }