114 lines
3.1 KiB
C++
114 lines
3.1 KiB
C++
#include "ModbusMaster.h"
|
|
#include <QTcpSocket>
|
|
#include "ProtocolDefs.h"
|
|
|
|
CModbusMaster::CModbusMaster(CModbusRepository *Repo):
|
|
CModbusBackend(Repo)
|
|
{
|
|
// connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady()));
|
|
mModbusMode = MODBUS_MASTER_MODE;
|
|
|
|
mModbusTCPSocketHandle = new QTcpSocket();
|
|
connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady()));
|
|
connect(mModbusTCPSocketHandle,SIGNAL(disconnected()),this,SLOT(SocketDisconnected()));
|
|
connect(mModbusTCPSocketHandle,SIGNAL(connected()),this,SLOT(SocketConnected()));
|
|
|
|
}
|
|
|
|
CModbusMaster::~CModbusMaster()
|
|
{
|
|
if(mModbusTCPSocketHandle->state() != QAbstractSocket::UnconnectedState)
|
|
{
|
|
mModbusTCPSocketHandle->disconnectFromHost();
|
|
mModbusTCPSocketHandle->waitForDisconnected(1000);
|
|
}
|
|
delete mModbusTCPSocketHandle;
|
|
}
|
|
|
|
int CModbusMaster::ConnectToSlave(QString SlaveIP, int SlavePort)
|
|
{
|
|
if(mModbusTCPSocketHandle->state() != QAbstractSocket::UnconnectedState)
|
|
{
|
|
return RET_ERROR;
|
|
}
|
|
|
|
mModbusTCPSocketHandle->connectToHost(SlaveIP,SlavePort);
|
|
|
|
return RET_OK;
|
|
}
|
|
|
|
int CModbusMaster::DisconnectFromSlave()
|
|
{
|
|
if(mModbusTCPSocketHandle->state() != QAbstractSocket::ConnectedState)
|
|
{
|
|
qDebug("Trying to disconnect a non connected socket");
|
|
mModbusTCPSocketHandle->disconnectFromHost();
|
|
return 0;
|
|
}
|
|
|
|
qDebug("Requesting Disconnection...");
|
|
mModbusTCPSocketHandle->disconnectFromHost();
|
|
return 1;
|
|
}
|
|
|
|
void CModbusMaster::SocketConnected()
|
|
{
|
|
emit ModbusMasterConnected(this);
|
|
qDebug("Master: Connection established with slave");
|
|
}
|
|
|
|
void CModbusMaster::SocketDisconnected()
|
|
{
|
|
ModbusLinkDisconnected();
|
|
emit ModbusMasterDisconnected(this);
|
|
mModbusTCPSocketHandle->flush();
|
|
}
|
|
|
|
int CModbusMaster::ReadModbusRegisters()
|
|
{
|
|
return SendReadHoldingRegistersRequest(MODBUS_ZT_DATA_BASE_REG,MODBUS_ZT_TABLE_DATA_SIZE); //Read all registers from ZT (2000 - 2027)
|
|
}
|
|
|
|
|
|
void CModbusMaster::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length)
|
|
{
|
|
emit ModbusMasterRepositoryUpdated();
|
|
// qDebug("Database updated with ZT data...");
|
|
}
|
|
|
|
void CModbusMaster::ModbusResponseException(quint8 ExceptionCode, quint8 FctCode)
|
|
{
|
|
qDebug("Modbus MASTER exception: code:%d Fct:%d",ExceptionCode,FctCode);
|
|
}
|
|
|
|
int CModbusMaster::SendAN1ToZT()
|
|
{
|
|
//return SendWriteHoldingRegistersRequest(CC_AN1_REGISTER_ADDRESS,1);
|
|
return SendWriteSingleRegisterRequest(MODBUS_CC_AN_BASE_REG_ADD);
|
|
}
|
|
|
|
int CModbusMaster::SendAN2ToZT()
|
|
{
|
|
//return SendWriteHoldingRegistersRequest(CC_AN2_REGISTER_ADDRESS,1);
|
|
return SendWriteSingleRegisterRequest(MODBUS_CC_AN_BASE_REG_ADD);
|
|
}
|
|
|
|
int CModbusMaster::SendWatchdog()
|
|
{
|
|
return SendWriteSingleRegisterRequest(MODBUS_CC_WATCHDOG_BASE_REG_ADD);
|
|
}
|
|
int CModbusMaster::SendDateTime()
|
|
{
|
|
return SendWriteHoldingRegistersRequest(MODBUS_CC_CLK_UPDATE_BASE_REG_ADD,5);
|
|
}
|
|
|
|
int CModbusMaster::SendTrainData()
|
|
{
|
|
return SendWriteHoldingRegistersRequest(MODBUS_CC_ZT1_TRAIN_TYPE_REG_ADD,8);
|
|
}
|
|
|
|
int CModbusMaster::SendZTInhibitionData()
|
|
{
|
|
return SendWriteSingleRegisterRequest(MODBUS_CC_AN_BASE_REG_ADD);
|
|
}
|