733 lines
23 KiB
C++
733 lines
23 KiB
C++
#include "fwaccmondlg.h"
|
||
#include "ui_fwaccmondlg.h"
|
||
#include <QMessageBox>
|
||
#include <QDateTime>
|
||
|
||
FwAccMonDlg::FwAccMonDlg(QWidget *parent) :
|
||
QDialog(parent),
|
||
ui(new Ui::FwAccMonDlg)
|
||
{
|
||
ui->setupUi(this);
|
||
m_tz=QTimeZone::systemTimeZone();
|
||
Qt::WindowFlags flags=Qt::Window;
|
||
// flags |=Qt::WindowMinMaxButtonsHint|Qt::WindowCloseButtonHint;
|
||
flags |=Qt::WindowCloseButtonHint;
|
||
setWindowFlags(flags);
|
||
setFixedSize(this->width(),this->height());//固定窗口大小
|
||
setAttribute(Qt::WA_DeleteOnClose);
|
||
|
||
m_RecvBuf.resize(EN_MaxRespBufSize);
|
||
m_SendBuf.resize(EN_MaxCmdBufSize);
|
||
m_ConnectFlag=CN_CommDisconnect;
|
||
m_RtuNum = 0;
|
||
m_pRtuInfo = NULL;
|
||
m_CurrentRtuNo = -1;
|
||
m_RefreshMode = 0;
|
||
m_RefreshFlag = 0;
|
||
m_StartIndex = 0;
|
||
m_EndIndex = 0;
|
||
m_RefreshTimer = NULL;
|
||
m_FrameProcess = 0;
|
||
|
||
ui->RTUTable->setColumnWidth(0,60);
|
||
ui->RTUTable->setColumnWidth(1,60);
|
||
ui->RTUTable->setColumnWidth(2,250);
|
||
|
||
ui->PointTable->setColumnWidth(0,60);
|
||
ui->PointTable->setColumnWidth(1,60);
|
||
ui->PointTable->setColumnWidth(2,200);
|
||
ui->PointTable->setColumnWidth(3,100);
|
||
ui->PointTable->setColumnWidth(4,60);
|
||
ui->PointTable->setColumnWidth(5,200);
|
||
|
||
ui->AllValueButton->setChecked(true);
|
||
ui->SectionValueButton->setChecked(false);
|
||
m_StartIndex = -1;
|
||
m_EndIndex = -1;
|
||
|
||
m_RefreshTimer = new QTimer(this);
|
||
if(m_RefreshTimer!=NULL)
|
||
connect(m_RefreshTimer,SIGNAL(timeout()),this,SLOT(OnRefeshTimer()));
|
||
connect(ui->RtuRefreshButton,SIGNAL(clicked()),this,SLOT(OnRTURefresh()));
|
||
connect(ui->PointRefreshButton,SIGNAL(clicked()),this,SLOT(OnPointInfoRefresh()));
|
||
connect(ui->RTUTable,SIGNAL(cellClicked(int,int)),this,SLOT(OnRtuCellClick(int,int)));
|
||
connect(ui->ValueRefreshButton ,SIGNAL(clicked()),this,SLOT(OnPointValueRefresh()));
|
||
}
|
||
|
||
FwAccMonDlg::~FwAccMonDlg()
|
||
{
|
||
if(m_pRtuInfo!=NULL)
|
||
{
|
||
for(int i=0;i<m_RtuNum;i++)
|
||
{
|
||
if((m_pRtuInfo+i)->pAcc!= NULL)
|
||
free((m_pRtuInfo+i)->pAcc);
|
||
}
|
||
free(m_pRtuInfo);
|
||
}
|
||
|
||
if(m_RefreshTimer != NULL)
|
||
delete m_RefreshTimer;
|
||
delete ui;
|
||
}
|
||
|
||
|
||
void FwAccMonDlg::closeEvent(QCloseEvent *event)
|
||
{
|
||
emit closed();
|
||
QDialog::closeEvent(event);
|
||
}
|
||
|
||
void FwAccMonDlg::SetConnectFlags(int flags) //主界面传输连接标志到本窗口
|
||
{
|
||
m_ConnectFlag = flags;
|
||
}
|
||
|
||
void FwAccMonDlg::OnRTURefresh()
|
||
{
|
||
unsigned char data[40];
|
||
|
||
if(m_ConnectFlag==CN_CommDisconnect)
|
||
{
|
||
QMessageBox::warning(NULL,tr("告警"),tr("通信中断,无法读取数据。请连接FES系统!"));
|
||
return;
|
||
}
|
||
|
||
//stop other windows data refresh
|
||
|
||
m_CmdCode = CN_SFesSimFwRTUInfoReq;
|
||
data[0] = m_CmdCode;
|
||
data[1] = 0x00; //帧序号
|
||
data[2] = 0x00; //帧序号
|
||
data[3] = 0x00; //请求状态
|
||
int type=CN_RTUInfoType_PI;
|
||
data[4] = type&0xff; //RTUNo
|
||
data[5] = (type>>8)&0xff; //RTUNo
|
||
data[6] = (type>>16)&0xff; //RTUNo
|
||
data[7] = (type>>24)&0xff; //RTUNo
|
||
|
||
memcpy(m_SendBuf.data(),data,8);
|
||
emit SendCmdSig(m_CmdCode,m_SendBuf,8);
|
||
|
||
}
|
||
|
||
|
||
void FwAccMonDlg::OnPointInfoRefresh()
|
||
{
|
||
unsigned char data[40];
|
||
|
||
if(m_ConnectFlag==CN_CommDisconnect)
|
||
{
|
||
QMessageBox::warning(NULL,tr("告警"),tr("通信中断,无法读取数据。请连接FES系统!"));
|
||
return;
|
||
}
|
||
|
||
m_CmdCode = CN_SFesSimFwAccParamReq;
|
||
data[0] = m_CmdCode;
|
||
data[1] = 0x00; //帧序号
|
||
data[2] = 0x00; //帧序号
|
||
data[3] = 0x00; //请求状态
|
||
int type=CN_RTUInfoType_PI;
|
||
data[4] = type&0xff; //RTUNo
|
||
data[5] = (type>>8)&0xff; //RTUNo
|
||
data[6] = (type>>16)&0xff; //RTUNo
|
||
data[7] = (type>>24)&0xff; //RTUNo
|
||
data[8] = m_CurrentRtuNo&0xff; //RTUNo
|
||
data[9] = (m_CurrentRtuNo>>8)&0xff; //RTUNo
|
||
data[10] = (m_CurrentRtuNo>>16)&0xff; //RTUNo
|
||
data[11] = (m_CurrentRtuNo>>24)&0xff; //RTUNo
|
||
memcpy(m_SendBuf.data(),data,12);
|
||
emit SendCmdSig(m_CmdCode,m_SendBuf,12);
|
||
}
|
||
|
||
void FwAccMonDlg::OnRecvRTUInfoResp(int CmdCode,QByteArray Data,int DataLen)
|
||
{
|
||
unsigned char RecvData[EN_MaxRespBufSize];
|
||
SFesSimRTUInfo RtuInfo;
|
||
int SeqNo,TotalNum;
|
||
|
||
if(DataLen>EN_MaxRespBufSize)
|
||
return;
|
||
memcpy(RecvData,Data.data(),DataLen);
|
||
SeqNo = RecvData[1];
|
||
SeqNo |= (int)RecvData[2]<<8;
|
||
TotalNum = RecvData[8];
|
||
TotalNum |= RecvData[9]<<8;
|
||
TotalNum |= RecvData[10]<<16;
|
||
TotalNum |= RecvData[11]<<24;
|
||
if((SeqNo&0x7fff)==0)//frist frame,检查系统数据空间是否有效
|
||
{
|
||
if(TotalNum!=m_RtuNum)
|
||
{
|
||
m_RtuNum = TotalNum;
|
||
if(m_pRtuInfo!=NULL)//清除原有的空间,从新分配空间
|
||
{
|
||
m_pRtuInfo = (SFwAccMonRtu*)realloc(m_pRtuInfo,sizeof(SFwAccMonRtu)*m_RtuNum);
|
||
if(m_pRtuInfo!=NULL)
|
||
{
|
||
memset(m_pRtuInfo,0,sizeof(SFwAccMonRtu)*m_RtuNum);
|
||
}
|
||
else
|
||
m_RtuNum = 0;
|
||
}
|
||
else
|
||
{
|
||
m_pRtuInfo = (SFwAccMonRtu*)malloc(sizeof(SFwAccMonRtu)*m_RtuNum);
|
||
if(m_pRtuInfo!=NULL)
|
||
{
|
||
memset(m_pRtuInfo,0,sizeof(SFwAccMonRtu)*m_RtuNum);
|
||
}
|
||
else
|
||
m_RtuNum = 0;
|
||
}
|
||
}
|
||
else //点号相同,应该已分配过
|
||
{
|
||
if((m_pRtuInfo==NULL)&&(m_RtuNum>0))
|
||
{
|
||
m_pRtuInfo = (SFwAccMonRtu*)malloc(sizeof(SFwAccMonRtu)*m_RtuNum);
|
||
if(m_pRtuInfo!=NULL)
|
||
{
|
||
memset(m_pRtuInfo,0,sizeof(SFwAccMonRtu)*m_RtuNum);
|
||
}
|
||
else
|
||
m_RtuNum = 0;
|
||
}
|
||
}
|
||
|
||
//清除表格
|
||
ui->RTUTable->setRowCount(0);
|
||
ui->RTUTable->clearContents();
|
||
|
||
}
|
||
if(m_pRtuInfo==NULL)
|
||
return;
|
||
int readx,count,row;
|
||
count = 0;
|
||
readx = 16;
|
||
row = ui->RTUTable->rowCount();
|
||
while(readx<DataLen)
|
||
{
|
||
RtuInfo.RtuNo = RecvData[readx++];
|
||
RtuInfo.RtuNo |= RecvData[readx++]<<8;
|
||
RtuInfo.RtuNo |= RecvData[readx++]<<16;
|
||
RtuInfo.RtuNo |= RecvData[readx++]<<24;
|
||
|
||
RtuInfo.Used = RecvData[readx++];
|
||
RtuInfo.Used |= RecvData[readx++]<<8;
|
||
RtuInfo.Used |= RecvData[readx++]<<16;
|
||
RtuInfo.Used |= RecvData[readx++]<<24;
|
||
|
||
RtuInfo.MaxPoints = RecvData[readx++];
|
||
RtuInfo.MaxPoints |= RecvData[readx++]<<8;
|
||
RtuInfo.MaxPoints |= RecvData[readx++]<<16;
|
||
RtuInfo.MaxPoints |= RecvData[readx++]<<24;
|
||
|
||
memcpy(RtuInfo.RtuName,&RecvData[readx],CN_FesMaxNameSize);
|
||
readx += CN_FesMaxNameSize;
|
||
|
||
memcpy(m_pRtuInfo+row,&RtuInfo,sizeof(RtuInfo));
|
||
|
||
ui->RTUTable->insertRow(row);
|
||
ui->RTUTable->setItem(row,0,new QTableWidgetItem(QString::number(RtuInfo.RtuNo)));
|
||
ui->RTUTable->setItem(row,1,new QTableWidgetItem(QString::number(RtuInfo.Used)));
|
||
ui->RTUTable->setItem(row,2,new QTableWidgetItem(QString(RtuInfo.RtuName)));
|
||
row++;
|
||
count++;
|
||
}
|
||
|
||
//判断是否还有后续帧
|
||
if((SeqNo&CN_SFesSimFrameLastSeqNo)==0)
|
||
{
|
||
unsigned char data[40];
|
||
int temp=SeqNo+1;
|
||
m_CmdCode = CN_SFesSimFwRTUInfoReq;
|
||
data[0] = m_CmdCode;
|
||
data[1] = temp&0xff; //帧序号:bit7 1: 最后一帧 0:非最后一帧
|
||
data[2] = (temp>>8)&0xff; //帧序号:bit7 1: 最后一帧 0:非最后一帧
|
||
data[3] = 0x00;
|
||
int type=CN_RTUInfoType_PI;
|
||
data[4] = type&0xff; //RTUNo
|
||
data[5] = (type>>8)&0xff; //RTUNo
|
||
data[6] = (type>>16)&0xff; //RTUNo
|
||
data[7] = (type>>24)&0xff; //RTUNo
|
||
memcpy(m_SendBuf.data(),data,8);
|
||
emit SendCmdSig(m_CmdCode,m_SendBuf,8);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
void FwAccMonDlg::OnRtuCellClick(int row,int column)
|
||
{
|
||
m_CurrentRtuRow = row;
|
||
QString RtuStr = ui->RTUTable->item(m_CurrentRtuRow,0)->text();
|
||
bool ok;
|
||
m_CurrentRtuNo=RtuStr.toInt(&ok,10);
|
||
if(ok==false)
|
||
m_CurrentRtuNo = -1;
|
||
else
|
||
DisplayPiParam(m_CurrentRtuNo);
|
||
}
|
||
|
||
|
||
void FwAccMonDlg::OnRecvPiParamResp(int CmdCode,QByteArray Data,int DataLen)
|
||
{
|
||
unsigned char RecvData[EN_MaxRespBufSize];
|
||
SFesSimFwAccParam param;
|
||
SFesSimFwAcc *pAcc;
|
||
SFwAccMonRtu *pRtu;
|
||
int SeqNo,RtuNo,MaxPoints,Num;
|
||
|
||
if(DataLen>EN_MaxRespBufSize)
|
||
return;
|
||
memcpy(RecvData,Data.data(),DataLen);
|
||
SeqNo = RecvData[1];
|
||
SeqNo |=(int) RecvData[2]<<8;
|
||
RtuNo = RecvData[8];
|
||
RtuNo |= RecvData[9]<<8;
|
||
RtuNo |= RecvData[10]<<16;
|
||
RtuNo |= RecvData[11]<<24;
|
||
MaxPoints = RecvData[12];
|
||
MaxPoints |= RecvData[13]<<8;
|
||
MaxPoints |= RecvData[14]<<16;
|
||
MaxPoints |= RecvData[15]<<24;
|
||
Num = RecvData[16];
|
||
Num |= RecvData[17]<<8;
|
||
Num |= RecvData[18]<<16;
|
||
Num |= RecvData[19]<<24;
|
||
if((pRtu = GetRtuByRtuNo(RtuNo))==NULL)
|
||
return;
|
||
|
||
if((SeqNo&0x7fff)==0)//frist frame,检查系统数据空间是否有效
|
||
{
|
||
if(MaxPoints!=pRtu->MaxPoints)
|
||
{
|
||
pRtu->MaxPoints = MaxPoints;
|
||
if(pRtu->pAcc!=NULL)//清除原有的空间,从新分配空间
|
||
{
|
||
pRtu->pAcc = (SFesSimFwAcc*)realloc(pRtu->pAcc,sizeof(SFesSimFwAcc)*pRtu->MaxPoints);
|
||
if(pRtu->pAcc!=NULL)
|
||
{
|
||
memset(pRtu->pAcc,0,sizeof(SFesSimFwAcc)*pRtu->MaxPoints);
|
||
}
|
||
else
|
||
pRtu->MaxPoints = 0;
|
||
}
|
||
else
|
||
{
|
||
pRtu->pAcc = (SFesSimFwAcc*)malloc(sizeof(SFesSimFwAcc)*pRtu->MaxPoints);
|
||
if(pRtu->pAcc!=NULL)
|
||
{
|
||
memset(pRtu->pAcc,0,sizeof(SFesSimFwAcc)*pRtu->MaxPoints);
|
||
}
|
||
else
|
||
pRtu->MaxPoints = 0;
|
||
}
|
||
}
|
||
else //点号相同,应该已分配过
|
||
{
|
||
if((pRtu->pAcc==NULL)&&(pRtu->MaxPoints>0))
|
||
{
|
||
pRtu->pAcc = (SFesSimFwAcc*)malloc(sizeof(SFesSimFwAcc)*pRtu->MaxPoints);
|
||
if(pRtu->pAcc!=NULL)
|
||
{
|
||
memset(pRtu->pAcc,0,sizeof(SFesSimFwAcc)*pRtu->MaxPoints);
|
||
}
|
||
else
|
||
pRtu->MaxPoints = 0;
|
||
}
|
||
}
|
||
|
||
//清除表格
|
||
ui->PointTable->setRowCount(0);
|
||
ui->PointTable->clearContents();
|
||
|
||
//分配空间
|
||
ui->PointTable->setRowCount(pRtu->MaxPoints);
|
||
|
||
}
|
||
if(pRtu->pAcc==NULL)
|
||
return;
|
||
int readx,count;
|
||
count = 0;
|
||
readx = 20;
|
||
while(readx<DataLen)
|
||
{
|
||
param.PointNo = RecvData[readx++];
|
||
param.PointNo |= RecvData[readx++]<<8;
|
||
param.PointNo |= RecvData[readx++]<<16;
|
||
param.PointNo |= RecvData[readx++]<<24;
|
||
|
||
param.Used = RecvData[readx++];
|
||
param.Used |= RecvData[readx++]<<8;
|
||
param.Used |= RecvData[readx++]<<16;
|
||
param.Used |= RecvData[readx++]<<24;
|
||
|
||
memcpy(param.PointTagName,&RecvData[readx],CN_FesMaxTagSize);
|
||
readx += CN_FesMaxTagSize;
|
||
|
||
param.FesRtuNo = RecvData[readx++];
|
||
param.FesRtuNo |= RecvData[readx++]<<8;
|
||
param.FesRtuNo |= RecvData[readx++]<<16;
|
||
param.FesRtuNo |= RecvData[readx++]<<24;
|
||
|
||
param.FesPointNo = RecvData[readx++];
|
||
param.FesPointNo |= RecvData[readx++]<<8;
|
||
param.FesPointNo |= RecvData[readx++]<<16;
|
||
param.FesPointNo |= RecvData[readx++]<<24;
|
||
|
||
if(param.PointNo<pRtu->MaxPoints)
|
||
{
|
||
pAcc = pRtu->pAcc + param.PointNo;
|
||
memcpy(&pAcc->param,¶m,sizeof(param));
|
||
ui->PointTable->setItem(param.PointNo,0,new QTableWidgetItem(QString::number(param.PointNo)));
|
||
ui->PointTable->setItem(param.PointNo,1,new QTableWidgetItem(QString::number(param.Used)));
|
||
ui->PointTable->setItem(param.PointNo,2,new QTableWidgetItem(QString(param.PointTagName)));
|
||
ui->PointTable->setItem(param.PointNo,6,new QTableWidgetItem(QString::number(param.FesRtuNo)));
|
||
ui->PointTable->setItem(param.PointNo,7,new QTableWidgetItem(QString::number(param.FesPointNo)));
|
||
}
|
||
}
|
||
|
||
//判断是否还有后续帧
|
||
if((SeqNo&CN_SFesSimFrameLastSeqNo)==0)
|
||
{
|
||
unsigned char data[40];
|
||
int temp = SeqNo+1;
|
||
m_CmdCode = CN_SFesSimFwAccParamReq;
|
||
data[0] = m_CmdCode;
|
||
data[1] = temp&0xff; //帧序号:bit7 1: 最后一帧 0:非最后一帧
|
||
data[2] = (temp>>8)&0xff;
|
||
data[3] = 0x00;
|
||
int type=CN_RTUInfoType_PI;
|
||
data[4] = type&0xff;
|
||
data[5] = (type>>8)&0xff;
|
||
data[6] = (type>>16)&0xff;
|
||
data[7] = (type>>24)&0xff;
|
||
data[8] = m_CurrentRtuNo&0xff; //RTUNo
|
||
data[9] = (m_CurrentRtuNo>>8)&0xff; //RTUNo
|
||
data[10] = (m_CurrentRtuNo>>16)&0xff; //RTUNo
|
||
data[11] = (m_CurrentRtuNo>>24)&0xff; //RTUNo
|
||
memcpy(m_SendBuf.data(),data,12);
|
||
emit SendCmdSig(m_CmdCode,m_SendBuf,12);
|
||
}
|
||
}
|
||
|
||
SFwAccMonRtu* FwAccMonDlg::GetRtuByRtuNo(int RtuNo)
|
||
{
|
||
int i;
|
||
SFwAccMonRtu *pRtu;
|
||
|
||
for(i=0;i<m_RtuNum;i++)
|
||
{
|
||
pRtu = m_pRtuInfo+i;
|
||
if(pRtu->RtuNo == RtuNo)
|
||
return pRtu;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
void FwAccMonDlg::DisplayPiParam(int RtuNo)
|
||
{
|
||
int i;
|
||
SFwAccMonRtu *pRtu;
|
||
SFesSimFwAcc *pAcc;
|
||
|
||
if((pRtu = GetRtuByRtuNo(RtuNo))==NULL)
|
||
return;
|
||
|
||
ui->PointTable->setRowCount(0);
|
||
ui->PointTable->clearContents();
|
||
|
||
//分配空间
|
||
ui->PointTable->setRowCount(pRtu->MaxPoints);
|
||
|
||
for(i=0;i<pRtu->MaxPoints;i++)
|
||
{
|
||
pAcc = pRtu->pAcc+i;
|
||
ui->PointTable->setItem(i,0,new QTableWidgetItem(QString::number(pAcc->param.PointNo)));
|
||
ui->PointTable->setItem(i,1,new QTableWidgetItem(QString::number(pAcc->param.Used)));
|
||
ui->PointTable->setItem(i,2,new QTableWidgetItem(QString(pAcc->param.PointTagName)));
|
||
ui->PointTable->setItem(i,6,new QTableWidgetItem(QString::number(pAcc->param.FesRtuNo)));
|
||
ui->PointTable->setItem(i,7,new QTableWidgetItem(QString::number(pAcc->param.FesPointNo)));
|
||
}
|
||
}
|
||
|
||
|
||
void FwAccMonDlg::OnPointValueRefresh()
|
||
{
|
||
unsigned char data[40];
|
||
|
||
if(m_ConnectFlag==CN_CommDisconnect)
|
||
{
|
||
QMessageBox::warning(NULL,tr("告警"),tr("通信中断,无法读取数据。请连接FES系统!"));
|
||
m_RefreshFlag = 0;
|
||
ui->ValueRefreshButton->setText(tr("数据刷新"));
|
||
return;
|
||
}
|
||
if(ui->AllValueButton->isChecked())
|
||
{
|
||
m_RefreshMode = 0;
|
||
m_StartIndex = -1;
|
||
m_EndIndex = -1;
|
||
}
|
||
else
|
||
{
|
||
m_RefreshMode = 1; //section
|
||
//2018-8-31 jacky 增加区间点刷新的非法字符判断
|
||
QString str1;
|
||
QString str2;
|
||
bool ok;
|
||
str1 = ui->StartPointNo->text();
|
||
str2 = ui->EndPointNo->text();
|
||
QByteArray ba1 = str1.toLatin1();
|
||
const char *s1 = ba1.data();
|
||
while(*s1 && *s1>='0' && *s1<='9') s1++;
|
||
|
||
QByteArray ba2 = str2.toLatin1();
|
||
const char *s2 = ba2.data();
|
||
while(*s2 && *s2>='0' && *s2<='9') s2++;
|
||
|
||
if(*s1) //m_StartIndex不是纯数字
|
||
{
|
||
QMessageBox::warning(NULL,tr("告警"),tr("区域start数据非法或为负,默认为0!"));
|
||
m_StartIndex = 0;
|
||
|
||
}
|
||
else
|
||
{
|
||
m_StartIndex = str1.toInt(&ok,10);
|
||
|
||
}
|
||
|
||
|
||
if(*s2) //m_EndIndex不是纯数字
|
||
{
|
||
QMessageBox::warning(NULL,tr("告警"),tr("区域end数据非法或为负,默认为0!"));
|
||
m_EndIndex = 0;
|
||
|
||
}
|
||
else
|
||
{
|
||
m_EndIndex = str2.toInt(&ok,10);
|
||
}
|
||
if(m_EndIndex<m_StartIndex)
|
||
{
|
||
QMessageBox::warning(NULL,tr("告警"),tr("区域start 大于 区域end点数,两者默认为0!"));
|
||
m_StartIndex = 0;
|
||
m_EndIndex = 0;
|
||
}
|
||
}
|
||
if(m_RefreshFlag == 0)
|
||
{
|
||
m_RefreshFlag = 1;
|
||
ui->ValueRefreshButton->setText(tr("停止刷新"));
|
||
if(m_RefreshTimer != NULL)
|
||
m_RefreshTimer->start(1000);
|
||
|
||
m_FrameProcess = 1;
|
||
m_CmdCode = CN_SFesSimFwAccDataReq;
|
||
data[0] = m_CmdCode;
|
||
data[1] = 0x00; //帧序号
|
||
data[2] = 0x00; //帧序号
|
||
data[3] = 0x00; //请求状态
|
||
int type=CN_RTUInfoType_PI;
|
||
data[4] = type&0xff; //RTUNo
|
||
data[5] = (type>>8)&0xff; //RTUNo
|
||
data[6] = (type>>16)&0xff; //RTUNo
|
||
data[7] = (type>>24)&0xff; //RTUNo
|
||
data[8] = m_CurrentRtuNo&0xff; //RTUNo
|
||
data[9] = (m_CurrentRtuNo>>8)&0xff; //RTUNo
|
||
data[10] = (m_CurrentRtuNo>>16)&0xff; //RTUNo
|
||
data[11] = (m_CurrentRtuNo>>24)&0xff; //RTUNo
|
||
data[12] = m_StartIndex&0xff; //-1 all data
|
||
data[13] = (m_StartIndex>>8)&0xff;
|
||
data[14] = (m_StartIndex>>16)&0xff;
|
||
data[15] = (m_StartIndex>>24)&0xff;
|
||
data[16] = m_EndIndex&0xff;
|
||
data[17] = (m_EndIndex>>8)&0xff;
|
||
data[18] = (m_EndIndex>>8)&0xff;
|
||
data[19] = (m_EndIndex>>8)&0xff;
|
||
memcpy(m_SendBuf.data(),data,20);
|
||
emit SendCmdSig(m_CmdCode,m_SendBuf,20);
|
||
|
||
}
|
||
else
|
||
{
|
||
if(m_RefreshTimer != NULL)
|
||
m_RefreshTimer->stop();
|
||
m_RefreshFlag = 0;
|
||
ui->ValueRefreshButton->setText(tr("数据刷新"));
|
||
m_FrameProcess = 0;
|
||
}
|
||
|
||
}
|
||
|
||
void FwAccMonDlg::OnRecvPiDataResp(int CmdCode,QByteArray Data,int DataLen)
|
||
{
|
||
unsigned char RecvData[EN_MaxRespBufSize];
|
||
SFesSimAccData piData;
|
||
SFesSimFwAcc *pAcc;
|
||
SFwAccMonRtu *pRtu;
|
||
int SeqNo,RtuNo,Num;
|
||
QDateTime dt;
|
||
QString tStr;
|
||
|
||
if(DataLen>EN_MaxRespBufSize)
|
||
return;
|
||
memcpy(RecvData,Data.data(),DataLen);
|
||
|
||
SeqNo = RecvData[1];
|
||
SeqNo |=(int) RecvData[2]<<8;
|
||
RtuNo = RecvData[8];
|
||
RtuNo |= RecvData[9]<<8;
|
||
RtuNo |= RecvData[10]<<16;
|
||
RtuNo |= RecvData[11]<<24;
|
||
Num = RecvData[12];
|
||
Num |= RecvData[13]<<8;
|
||
Num |= RecvData[14]<<16;
|
||
Num |= RecvData[15]<<24;
|
||
if((pRtu = GetRtuByRtuNo(RtuNo))==NULL)
|
||
return;
|
||
int readx,count;
|
||
float fvalue;
|
||
double dvalue;
|
||
unsigned char* pTemp;
|
||
count = 0;
|
||
readx = 16;
|
||
pTemp = (unsigned char*)&dvalue;
|
||
while(readx<DataLen)
|
||
{
|
||
piData.PointNo = RecvData[readx++];
|
||
piData.PointNo |= RecvData[readx++]<<8;
|
||
piData.PointNo |= RecvData[readx++]<<16;
|
||
piData.PointNo |= RecvData[readx++]<<24;
|
||
|
||
// piData.Value = (uint64)RecvData[readx++];
|
||
// piData.Value |= (uint64)RecvData[readx++]<<8;
|
||
// piData.Value |= (uint64)RecvData[readx++]<<16;
|
||
// piData.Value |= (uint64)RecvData[readx++]<<24;
|
||
// piData.Value |= (uint64)RecvData[readx++]<<32;
|
||
// piData.Value |= (uint64)RecvData[readx++]<<40;
|
||
// piData.Value |= (uint64)RecvData[readx++]<<48;
|
||
// piData.Value |= (uint64)RecvData[readx++]<<56;
|
||
pTemp = (unsigned char*)&dvalue;
|
||
*pTemp = RecvData[readx++];
|
||
*(pTemp+1) = RecvData[readx++];
|
||
*(pTemp+2) = RecvData[readx++];
|
||
*(pTemp+3) = RecvData[readx++];
|
||
*(pTemp+4) = RecvData[readx++];
|
||
*(pTemp+5) = RecvData[readx++];
|
||
*(pTemp+6) = RecvData[readx++];
|
||
*(pTemp+7) = RecvData[readx++];
|
||
piData.Value = dvalue;
|
||
piData.Status = (uint32)RecvData[readx++];
|
||
piData.Status |= (uint32)RecvData[readx++]<<8;
|
||
piData.Status |= (uint32)RecvData[readx++]<<16;
|
||
piData.Status |= (uint32)RecvData[readx++]<<24;
|
||
|
||
piData.time = (uint64)RecvData[readx++];
|
||
piData.time |= (uint64)RecvData[readx++]<<8;
|
||
piData.time |= (uint64)RecvData[readx++]<<16;
|
||
piData.time |= (uint64)RecvData[readx++]<<24;
|
||
piData.time |= (uint64)RecvData[readx++]<<32;
|
||
piData.time |= (uint64)RecvData[readx++]<<40;
|
||
piData.time |= (uint64)RecvData[readx++]<<48;
|
||
piData.time |= (uint64)RecvData[readx++]<<56;
|
||
|
||
if(piData.PointNo<pRtu->MaxPoints)
|
||
{
|
||
pAcc = pRtu->pAcc + piData.PointNo;
|
||
memcpy(&pAcc->value,&piData,sizeof(piData));
|
||
dt = QDateTime::fromSecsSinceEpoch(piData.time/1000);
|
||
//dt = QDateTime::fromSecsSinceEpoch(piData.time/1000,m_tz);
|
||
tStr = dt.toString("yyyy-MM-dd hh:mm:ss");
|
||
ui->PointTable->setItem(piData.PointNo,3,new QTableWidgetItem(QString::number(piData.Value)));
|
||
ui->PointTable->setItem(piData.PointNo,4,new QTableWidgetItem(QString::number(piData.Status)));
|
||
ui->PointTable->setItem(piData.PointNo,5,new QTableWidgetItem(tStr));
|
||
}
|
||
count++;
|
||
}
|
||
|
||
//判断是否还有后续帧
|
||
if((SeqNo&CN_SFesSimFrameLastSeqNo)==0)
|
||
{
|
||
unsigned char data[40];
|
||
int temp = (SeqNo&0x7fff)+1;
|
||
m_CmdCode = CN_SFesSimFwAccDataReq;
|
||
data[0] = m_CmdCode;
|
||
data[1] = temp&0xff; //帧序号:bit7 1: 最后一帧 0:非最后一帧
|
||
data[2] = (temp>>8)&0xff;
|
||
data[3] = 0x00;
|
||
int type=CN_RTUInfoType_PI;
|
||
data[4] = type&0xff; //RTUNo
|
||
data[5] = (type>>8)&0xff; //RTUNo
|
||
data[6] = (type>>16)&0xff; //RTUNo
|
||
data[7] = (type>>24)&0xff; //RTUNo
|
||
data[8] = m_CurrentRtuNo&0xff; //RTUNo
|
||
data[9] = (m_CurrentRtuNo>>8)&0xff; //RTUNo
|
||
data[10] = (m_CurrentRtuNo>>16)&0xff; //RTUNo
|
||
data[11] = (m_CurrentRtuNo>>24)&0xff; //RTUNo
|
||
data[12] = m_StartIndex&0xff; //-1 all data
|
||
data[13] = (m_StartIndex>>8)&0xff;
|
||
data[14] = (m_StartIndex>>16)&0xff;
|
||
data[15] = (m_StartIndex>>24)&0xff;
|
||
data[16] = m_EndIndex&0xff;
|
||
data[17] = (m_EndIndex>>8)&0xff;
|
||
data[18] = (m_EndIndex>>8)&0xff;
|
||
data[19] = (m_EndIndex>>8)&0xff;
|
||
memcpy(m_SendBuf.data(),data,19);
|
||
emit SendCmdSig(m_CmdCode,m_SendBuf,19);
|
||
}
|
||
else
|
||
m_FrameProcess = 0;
|
||
|
||
}
|
||
|
||
void FwAccMonDlg::OnRefeshTimer()
|
||
{
|
||
unsigned char data[40];
|
||
|
||
//if(!this->isActiveWindow())//只有激活的窗口才可发送数据,避免发送数据冲突。
|
||
// return;
|
||
|
||
if(m_FrameProcess == 1)//一次数据读取过程结束,才开始新的读取
|
||
return;
|
||
|
||
m_CmdCode = CN_SFesSimFwAccDataReq;
|
||
data[0] = m_CmdCode;
|
||
data[1] = 0x00; //帧序号:bit7 1: 最后一帧 0:非最后一帧
|
||
data[2] = 0x00;
|
||
data[3] = 0x00;
|
||
int type=CN_RTUInfoType_PI;
|
||
data[4] = type&0xff; //RTUNo
|
||
data[5] = (type>>8)&0xff; //RTUNo
|
||
data[6] = (type>>16)&0xff; //RTUNo
|
||
data[7] = (type>>24)&0xff; //RTUNo
|
||
data[8] = m_CurrentRtuNo&0xff; //RTUNo
|
||
data[9] = (m_CurrentRtuNo>>8)&0xff; //RTUNo
|
||
data[10] = (m_CurrentRtuNo>>16)&0xff; //RTUNo
|
||
data[11] = (m_CurrentRtuNo>>24)&0xff; //RTUNo
|
||
data[12] = m_StartIndex&0xff; //-1 all data
|
||
data[13] = (m_StartIndex>>8)&0xff;
|
||
data[14] = (m_StartIndex>>16)&0xff;
|
||
data[15] = (m_StartIndex>>24)&0xff;
|
||
data[16] = m_EndIndex&0xff;
|
||
data[17] = (m_EndIndex>>8)&0xff;
|
||
data[18] = (m_EndIndex>>8)&0xff;
|
||
data[19] = (m_EndIndex>>8)&0xff;
|
||
memcpy(m_SendBuf.data(),data,20);
|
||
emit SendCmdSig(m_CmdCode,m_SendBuf,20);
|
||
|
||
}
|
||
void FwAccMonDlg::keyPressEvent(QKeyEvent *event)
|
||
{
|
||
switch (event ->key())
|
||
{
|
||
case Qt::Key_Escape:
|
||
break;
|
||
default:
|
||
QDialog::keyPressEvent(event);
|
||
}
|
||
}
|