#include "fwaccmondlg.h" #include "ui_fwaccmondlg.h" #include #include 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;ipAcc!= 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(readxRTUTable->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(readxMaxPoints) { 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;iRtuNo == 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;iMaxPoints;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_EndIndexValueRefreshButton->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(readxMaxPoints) { 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); } }