146 lines
4.3 KiB
C++
146 lines
4.3 KiB
C++
#include "ModbusSEIMgr.h"
|
|
#include <QTcpSocket>
|
|
#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(mModbusTCPSocketHandle->localAddress().toIPv4Address(),mModbusTCPSocketHandle->peerAddress().toIPv4Address());
|
|
qDebug("Master: Connection established with NetTrac");
|
|
mConnectionTimer->stop();
|
|
}
|
|
|
|
void CModbusSEIMgr::SocketDisconnected()
|
|
{
|
|
ModbusLinkDisconnected();
|
|
emit ModbusMasterDisconnected();
|
|
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);
|
|
}
|