⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 set1view.cpp

📁 一套故障诊断监测系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		int m;					//频谱下标
		double dAlarmPr;		//频谱报警值
		double dScaleHeight;

		factorfrequence = 1024/1024.0;	//1024为采样频率
		fx1 = 3000/(1.522*60.0);	//3000为转速
		dAlarmPr = 1.5;		//假设报警值为1.5
		dScaleHeight = 0.5*rect.Height()/dAlarmPr;

		//对当前显示的测点进行FFT变换
		double fr[1024],fi[1024],pr[1024],pi[1024];
		int n,k,l,il;
		n=1024;k=10;l=0;il=1;
		for(i=0;i<1024;i++)
		{
			pr[i]=m_nData[m_nCurMP][i];
			pi[i]=0.0;
			fr[i]=0.0;
			fi[i]=0.0;
		}
		m_calculate.FFT(pr,pi,n,k,fr,fi,l,il);
	
		//标纵坐标值
		CString zuobiao;
		zuobiao.Format("%.2f-",dAlarmPr);
		GetDlgItem(IDC_NBY_UP)->SetWindowText(zuobiao);
		
		dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GreenPen));
		//计算倍频:半倍频,一倍频,二倍频,三倍频,二十倍频
		for(i=0;i<5;i++)
		{
			switch (i)
			{
			case 0:		//半倍频
				nXCoordinate = (int)(0.5*nSixth);
				m = (int)(0.5*fx1/factorfrequence);
				break;
			case 1:		//一倍频
				nXCoordinate = (int)(nSixth);
				m = (int)(fx1/factorfrequence);
				break;
			case 2:		//二倍频
				nXCoordinate = (int)(2*nSixth);
				m = (int)(2*fx1/factorfrequence);
				break;
			case 3:		//三倍频
				nXCoordinate = (int)(3*nSixth);
				m = (int)(3*fx1/factorfrequence);
				break;
			case 4:		//二十倍频
				nXCoordinate = (int)(5*nSixth);
				m = (int)(20*fx1/factorfrequence);
				break;
			}
			
			//画频谱
			if(m<1024)
			{	
				dcMemory.MoveTo(nXCoordinate-2, rect.Height());
				dcMemory.LineTo(nXCoordinate-1, rect.Height()-(int)(pr[m-1]*dScaleHeight));//
				dcMemory.LineTo(nXCoordinate, rect.Height()-(int)(pr[m]*dScaleHeight));//
				dcMemory.LineTo(nXCoordinate+1, rect.Height()-(int)(pr[m+1]*dScaleHeight));//
				dcMemory.LineTo(nXCoordinate+2, rect.Height());
			}
		}

	}

	pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMemory,0,0,SRCCOPY);

    dcMemory.SelectObject(oldPen);
	dcMemory.SelectObject(oldBitmap);
	pWnd->ReleaseDC(pDC);
	::DeleteObject(&oldPen);
	::DeleteObject(&oldBitmap);
}

//画趋势曲线
void CSet1View::DrawTrendCurve()
{
	CWnd* pWnd = (CWnd*)GetDlgItem(IDC_SET1TREND);
	CDC *pDC = pWnd->GetDC();
	CRect rect;
    pWnd->GetClientRect(rect);
	
	CDC dcMemory;
	dcMemory.CreateCompatibleDC(pDC);

	CBitmap *oldBitmap;
	oldBitmap=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BlackBitmap));
    CPen *oldPen;
	oldPen=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GrayPen));
	dcMemory.FillRect(&rect,&(((CCDMSApp*) AfxGetApp())->m_BlackBrush));

	//画方格
	double x,y;
    x=rect.Width()/8.0;
	y=rect.Height()/4.0;
	for(int i=1;i<11;i++)
	{
		dcMemory.MoveTo((int)(x*i),0);
		dcMemory.LineTo((int)(x*i),rect.Height());
	}
	for( i=0;i<2;i++)
	{
		dcMemory.MoveTo(0,rect.Height()/2-(int)(y*i));
		dcMemory.LineTo(rect.Width(),rect.Height()/2-(int)(y*i));
		dcMemory.MoveTo(0,rect.Height()/2+(int)(y*i));
		dcMemory.LineTo(rect.Width(),rect.Height()/2+(int)(y*i));
	}

	if(m_bStart == TRUE)
	{
		//标纵坐标值
		CString zuobiao;
		zuobiao.Format("%.2f-",2*m_dVirValArray[m_nCurMP][0]);
		GetDlgItem(IDC_TAY_UP)->SetWindowText(zuobiao);

		//标横坐标值
		CString temp;
		int m=(10*1024)/m_nSampleFrenquence;//600×1秒=10分钟
		temp.Format("%d分钟",m);
		GetDlgItem(IDC_TAX_RIGHT)->SetWindowText(temp);
		m=m/2;
		temp.Format("%d分钟",m);
		GetDlgItem(IDC_TAX_CENTER)->SetWindowText(temp);

		//画曲线
		double dScaleWidth;
		double dScaleHeight;
		dScaleWidth = (double)rect.Width()/600.0;
		dScaleHeight = (double)rect.Height()/10.0;
		dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GreenPen));
		if(m_nTrendDataTimer<600)
		{
			dcMemory.MoveTo(0,rect.Height()/2);
			for( i = 0; i<=m_nTrendDataTimer; i++ )
			{
				dcMemory.LineTo((int)(i*dScaleWidth),(int)(rect.Height()/2.0-(m_dVirValArray[m_nCurMP][i]-m_dVirValArray[m_nCurMP][0])*dScaleHeight));
			}
		}
		if(m_nTrendDataTimer>600 && m_nTrendDataTimer<1200)
		{
			dcMemory.MoveTo(0,rect.Height()/2);
			for( i = 0; i<=m_nTrendDataTimer; i++ )
			{
				dcMemory.LineTo((int)(i*dScaleWidth),(int)(rect.Height()/2.0-(m_dVirValArray[m_nCurMP][i-600]-m_dVirValArray[m_nCurMP][600])*dScaleHeight));
			}
		}
		if(m_nTrendDataTimer>1200 && m_nTrendDataTimer<1800)
		{
			dcMemory.MoveTo(0,rect.Height()/2);
			for( i = 0; i<=m_nTrendDataTimer; i++ )
			{
				dcMemory.LineTo((int)(i*dScaleWidth),(int)(rect.Height()/2.0-(m_dVirValArray[m_nCurMP][i-1200]-m_dVirValArray[m_nCurMP][1200])*dScaleHeight));
			}
		}
		if(m_nTrendDataTimer>1800 && m_nTrendDataTimer<2400)
		{
			dcMemory.MoveTo(0,rect.Height()/2);
			for( i = 0; i<=m_nTrendDataTimer; i++ )
			{
				dcMemory.LineTo((int)(i*dScaleWidth),(int)(rect.Height()/2.0-(m_dVirValArray[m_nCurMP][i-1800]-m_dVirValArray[m_nCurMP][1800])*dScaleHeight));
			}
		}
		if(m_nTrendDataTimer>2400 && m_nTrendDataTimer<3000)
		{
			dcMemory.MoveTo(0,rect.Height()/2);
			for( i = 0; i<=m_nTrendDataTimer; i++ )
			{
				dcMemory.LineTo((int)(i*dScaleWidth),(int)(rect.Height()/2.0-(m_dVirValArray[m_nCurMP][i-2400]-m_dVirValArray[m_nCurMP][2400])*dScaleHeight));
			}
		}
		if(m_nTrendDataTimer>3000 && m_nTrendDataTimer<3600)
		{
			dcMemory.MoveTo(0,rect.Height()/2);
			for( i = 0; i<=m_nTrendDataTimer; i++ )
			{
				dcMemory.LineTo((int)(i*dScaleWidth),(int)(rect.Height()/2.0-(m_dVirValArray[m_nCurMP][i-3000]-m_dVirValArray[m_nCurMP][3000])*dScaleHeight));
			}
		}
	}

	pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMemory,0,0,SRCCOPY);

    dcMemory.SelectObject(oldPen);
	dcMemory.SelectObject(oldBitmap);
	pWnd->ReleaseDC(pDC);
	::DeleteObject(&oldPen);
	::DeleteObject(&oldBitmap);
}

void CSet1View::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(bActivate)
	{
		m_pMainFrame->SetCurActiveView(VIEW_TYPE_SET1);//
	}	

	CFormView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}

LRESULT CSet1View::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class

	int i;

	switch(message)
	{
	//激活本视图
	case UM_ACTIVATE_VIEW1:	
		this->GetParentFrame()->ActivateFrame();
		break;

	//采样开始
	case UM_COLLECTSTART:

		if(m_bStart == FALSE)
		{
			m_bStart = TRUE;
			for(i=0;i<2;i++)
			{
				((CLabel*)m_staticArray.GetAt(i))->ShowWindow(TRUE);
				((CLabel*)m_staticArray.GetAt(i))->SetFontSize(12);
				((CLabel*)m_staticArray.GetAt(i))->SetBkColor(RGB(153,255,255));
				((CLabel*)m_staticArray.GetAt(i))->SetText("0.00");
			}
			SetTimer(3, 1000, NULL);
		}
		break;

	//采样完毕
	case UM_COLLECTCOMPLETE:

		m_nTrendDataTimer++;	//趋势数据计数器
		if(m_nTrendDataTimer==3600)
			m_nTrendDataTimer=0;

		for(i=0; i<2; i++)
		{
			//获取数据
			for(int j=0; j<1024; j++)
			{
				m_nData[i][j] = m_pMainFrame->m_nOriginalData[i][j];
			}
		
			//计算有效值(均方根值)
			m_dVirtualValue[i] = m_calculate.GetVirtualValue(m_nData[i],1024);
			m_dVirValArray[i][m_nTrendDataTimer]=m_calculate.GetVirtualValue(m_nData[i],1024);//趋势数据

			DecideAlarmStatus(i);
		}
		//采完一次计算一次趋势值,3600次存入硬盘
		if(m_nTrendDataTimer==3599)
			SaveTrendData();
		break;
	}
	
	return CFormView::WindowProc(message, wParam, lParam);
}

void CSet1View::OnDestroy() 
{

	m_pMainFrame->m_hViewSet1 = NULL;

	CFormView::OnDestroy();
	
	// TODO: Add your message handler code here
	
}

void CSet1View::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	if(nIDEvent == 3)
	{
		//设置静态控件数字
		SetStaticValue();
		//画时域波形
		DrawTimeDomainWave();
		//画柱状图
//		DrawHistoGram();		
		//画窄带报警
		DrawNarrowbandAlarm();	
		//画趋势曲线
		DrawTrendCurve();
		
		//测点循环计数
		if(m_pMainFrame->m_bCycMp == TRUE)
			m_nCurMP++;
		if(m_nCurMP == 2)
			m_nCurMP = 0;

		//视图循环计数
		if(m_pMainFrame->m_bIsSet1Active == TRUE)
		{
			if(m_pMainFrame->m_bCycSet == TRUE)
			{
				m_nCount++;
				if(m_nCount == 2)
				{
					//显示完毕,发消息告诉主框架
					::SendMessage(m_pMainFrame->m_hWnd, UM_SET1COMPLETE, NULL, NULL);
					//重新开始视图循环计数
					m_nCount = 0;
				}
			}
		}
	}

	CFormView::OnTimer(nIDEvent);
}

void CSet1View::SetStaticValue()
{
	CString ss;
	for(int i=0;i<2;i++)
	{
		ss.Format("%.3f",m_dVirtualValue[i]);
		SetBackColor(i);		
		((CLabel*)m_staticArray.GetAt(i))->SetText(ss);			
	}

	CString ss2;
    ((CLabel*)m_staticArray.GetAt(m_nCurMP))->GetWindowText(ss2);
	((CLabel*)m_staticArray.GetAt(m_nCurMP))->SetBkColor(RGB(0,255,0));
	((CLabel*)m_staticArray.GetAt(m_nCurMP))->SetText(ss2);
}

void CSet1View::DecideAlarmStatus(int i)
{

}

void CSet1View::SaveTrendData()
{

}

void CSet1View::SetBackColor(int i)
{
/*
	if(theApp.m_sAlarm[i].alarm)
	{
		((CLabel*)m_staticArray.GetAt(m))->SetBkColor(RGB(255,0,0));//红色
	}
	else if(theApp.m_sAlarm[i].warn)
	{
		((CLabel*)m_staticArray.GetAt(m))->SetBkColor(RGB(255,255,0));//黄色
	}
	else
	{*/
		((CLabel*)m_staticArray.GetAt(i))->SetBkColor(RGB(153,255,255));	
//	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -