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

📄 realtimectrlview.cpp

📁 一个演示实时多任务系统运行的仿真程序源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		GetDlgItem(IDC_MANUAL_STATIC)->ShowWindow(SW_SHOW);
		m_ManualStatus.SetSel(0,-1);
		m_ManualStatus.ReplaceSel("目前手动状态");
		m_fManual = m_fMV[0];
		CString str;
		str.Format("%7.5f",m_fManual);
		m_EditManual.SetSel(0,-1);
		m_EditManual.ReplaceSel(str);
		m_SliderManual.SetPos((int)m_fManual*10000);
	}
	GetDlgItem(IDC_BUTTON_AUTOANDMANUAL)->SetWindowText(m_bAuto?"手动":"自动");
}

void CRealTimeCtrlView::OnDraw(CDC* pDC) 
{
	// TODO: Add your specialized code here and/or call the base class
	//画三个标志颜色

	CPen penPV,penMV,penSV;
	penPV.CreatePen(PS_SOLID,10,RGB(255,0,0));		//红色
	penMV.CreatePen(PS_SOLID,10,RGB(255,0,255));	//紫色
	penSV.CreatePen(PS_SOLID,10,RGB(0,0,255));		//蓝色

	CPen* pOldpen = pDC->SelectObject(&penPV);
	pDC->MoveTo(110,456);
	pDC->LineTo(165,456);
	pDC->SelectObject(pOldpen);
	pOldpen = pDC->SelectObject(&penMV);
	pDC->MoveTo(355,456);
	pDC->LineTo(410,456);
	pDC->SelectObject(pOldpen);
	pOldpen = pDC->SelectObject(&penSV);
	pDC->MoveTo(585,456);
	pDC->LineTo(640,456);
	pDC->SelectObject(pOldpen);

	
	//画坐标
	CRect rectMain;
	rectMain.SetRect(21,48,847,418);	//(20,48,848,418)  (21,48,847,418)好
	int nXInterval = (int)((rectMain.right-rectMain.left)/15.0);
	int nYInterval = (int)((rectMain.bottom-rectMain.top)/10.0);

	CPen penCoordinate(PS_DOT,1,RGB(0,0,0));
	CPen* pOldpenCoordinate = pDC->SelectObject(&penCoordinate);
	pDC->Rectangle(rectMain);

	CString strI;
	strI.Format("%d",(m_nNowPage3-3)*50);
	COLORREF bkcolor = pDC->GetBkColor();
	pDC->SetBkColor(RGB(255,255,255));
	pDC->TextOut(rectMain.left+1,rectMain.bottom-15,strI);
	pDC->SetBkColor(bkcolor);
	for(int i=1;i<15;i++)
	{

		pDC->MoveTo(rectMain.left+i*nXInterval,rectMain.top);
		pDC->LineTo(rectMain.left+i*nXInterval,rectMain.bottom);
		CString strI;
		strI.Format("%d",(m_nNowPage3-3)*50+i*10);
//		CBrush brush(RGB(255,255,255));
//		CBrush* pOldbrush = pDC->SelectObject(&brush);
		COLORREF bkcolor = pDC->GetBkColor();
		pDC->SetBkColor(RGB(255,255,255));
		pDC->TextOut(rectMain.left+i*nXInterval+1,rectMain.bottom-17,strI);
		pDC->SetBkColor(bkcolor);
	}
	for( i=0; i<11; i++)
	{
		pDC->MoveTo(rectMain.left,rectMain.top+i*nYInterval);
		pDC->LineTo(rectMain.right,rectMain.top+i*nYInterval);
		CString strI;					//写坐标值
		strI.Format("%2.1f",((10-i)*0.5));
		pDC->TextOut(rectMain.left-20,rectMain.top+i*nYInterval-5,strI);
	}
	pDC->SelectObject(pOldpenCoordinate);

	DrawStroke(pDC);
}

void CRealTimeCtrlView::ModelCal()
{
/*	int i = (int)(m_fL/m_fTs+1);
//	int i = (int)((m_fL+m_fTs)/m_fTc);
	if( i>599 )
		i= 599;
	m_fPV =float( m_fKp*m_fMV[i]*(1-exp(-m_fTs/m_fTp)) + m_fPV1*exp(-m_fTs/m_fTp) );
	m_fPV1 = m_fPV;*/

	//--------------修正后的模型-------------------------------
	int n = (int)(m_fL/m_fTs);
	if( n>599 )
		n = 599;
	m_fPV = float( m_fKp*m_fMV[n]/m_fTp + m_fPV1*exp(-m_fTs/m_fTp) );
	m_fPV1 = m_fPV;

	for( int i=599;i>0;i--)
		m_fMV[i] = m_fMV[i-1];
}

void CRealTimeCtrlView::DrawPoint()
{
	//------------------------将点转化为坐标------------------------
	CRect rectMain;
	rectMain.SetRect(21,48,847,418);					//图形区
	CPoint ptOre(21,418);								//原点
	int nXInterval = (int)((rectMain.right-rectMain.left)/15.0);
	int nYInterval = (int)((rectMain.bottom-rectMain.top)/10.0);	
	float nXStep = (float)((847-21)/150.0);
	float nYStep = (418-48)/5.0;

	if(m_bFirstPoint)
	{
		m_bFirstPoint = FALSE;
		m_ptPV1 = CPoint(21,417);
		m_ptMV1 = CPoint(21,417);
		m_ptMV1.y = long(ptOre.y-m_fMV[0]*nYStep);
		m_ptSV1.x = 21;
		m_ptSV1.y = long(ptOre.y-m_fSV*nYStep);

		m_StrokePV.Add(m_ptPV1);
		m_StrokeMV.Add(m_ptMV1);
		m_StrokeSV.Add(m_ptSV1);
	}

	long x = (long)(ptOre.x+nXStep*(m_nRuntime/1000.0f));
//	if ((m_nRuntime/1000)%10==0)
//		x=ptOre.x+((m_nRuntime/1000)%150)/10*nXInterval;
	m_ptPV.x = x;							//(long)(ptOre.x+nXStep*(m_nRuntime/1000.0));
	m_ptPV.y = long(ptOre.y-m_fPV*nYStep);
	m_ptMV.x = x;							//(long)(ptOre.x+nXStep*(m_nRuntime/1000.0));
	m_ptMV.y = long(ptOre.y-m_fMV[0]*nYStep);
	m_ptSV.x = x;							//(long)(ptOre.x+nXStep*(m_nRuntime/1000.0));
	m_ptSV.y = long(ptOre.y-m_fSV*nYStep);

	if((m_fPV<=1e-6)&&(m_fPV>=-1e-6))
	{
		m_ptPV.y = ptOre.y-1;
	}
	if(((m_fMV[0]-5)<=1e-6)&&((m_fMV[0]-5)>=-1e-6))
	{
		m_ptMV.y = m_ptMV.y+1;
	}

	//------------------存入链表------------------
	m_StrokePV.Add(m_ptPV);
	m_StrokeMV.Add(m_ptMV);
	m_StrokeSV.Add(m_ptSV);

	CString strPV,strMV,strSV;
	strPV.Format("%7.5f",m_fPV);
	strMV.Format("%7.5f",m_fMV[0]);
	strSV.Format("%7.5f",m_fSV);
	m_EditShowPV.SetSel(0,-1);
	m_EditShowPV.ReplaceSel(strPV);
	m_EditShowMV.SetSel(0,-1);
	m_EditShowMV.ReplaceSel(strMV);
	m_EditShowSV.SetSel(0,-1);
	m_EditShowSV.ReplaceSel(strSV);

	//--------------三条曲线的显示-------------------
	CPen penPV,penMV,penSV;
	penPV.CreatePen(PS_SOLID,2,RGB(255,0,0));
	penMV.CreatePen(PS_SOLID,2,RGB(255,0,255));
	penSV.CreatePen(PS_SOLID,2,RGB(0,0,255));
	
	if(m_nNowPage3 >= m_nAllPage*3-2)
	{
		CClientDC dc(this);
		CPen* pOldpen = dc.SelectObject(&penPV);
		if(((m_ptPV.x-m_lXAdd)>=rectMain.left)&&((m_ptPV.x-m_lXAdd)<=rectMain.right)&&(m_ptPV.y>=rectMain.top)&&(m_ptPV.y<=rectMain.bottom))
		{
			dc.MoveTo(m_ptPV1.x-m_lXAdd,m_ptPV1.y);
			if((m_ptPV.x-m_lXAdd)<rectMain.right)
				dc.LineTo(m_ptPV.x-m_lXAdd,m_ptPV.y);
			else
				dc.LineTo(m_ptPV.x-m_lXAdd-2,m_ptPV.y);
		}
		dc.SelectObject(pOldpen);
		pOldpen = dc.SelectObject(&penMV);
		if(((m_ptMV.x-m_lXAdd)>=rectMain.left)&&((m_ptMV.x-m_lXAdd)<=rectMain.right)&&(m_ptMV.y>=rectMain.top)&&(m_ptMV.y<=rectMain.bottom))	
		{
			dc.MoveTo(m_ptMV1.x-m_lXAdd,m_ptMV1.y);
			if((m_ptMV.x-m_lXAdd)<rectMain.right)
				dc.LineTo(m_ptMV.x-m_lXAdd,m_ptMV.y);
			else
				dc.LineTo(m_ptMV.x-m_lXAdd-2,m_ptMV.y);
		}
		dc.SelectObject(pOldpen);
		pOldpen = dc.SelectObject(&penSV);
		if(((m_ptSV.x-m_lXAdd)>=rectMain.left)&&((m_ptSV.x-m_lXAdd)<=rectMain.right)&&(m_ptSV.y>=rectMain.top)&&(m_ptSV.y<=rectMain.bottom))
		{
			dc.MoveTo(m_ptSV1.x-m_lXAdd,m_ptSV1.y);
			if((m_ptSV.x-m_lXAdd)<rectMain.right)
				dc.LineTo(m_ptSV.x-m_lXAdd,m_ptSV.y);
			else
				dc.LineTo(m_ptSV.x-m_lXAdd-2,m_ptSV.y);				
		}
		dc.SelectObject(pOldpen);
	}

	if(m_nAllPage<(((x-20)/(847-21))+1))	
	{
		m_nAllPage = (x/(847-21))+1;
		m_Scrollbar.SetScrollRange(1,m_nAllPage*3);
	}

	m_ptSV1 = m_ptSV;
	m_ptPV1 = m_ptPV;
	m_ptMV1 = m_ptMV;

}

void CRealTimeCtrlView::OnButtonRun() 
{
	// TODO: Add your control notification handler code here
	m_bSuspend = FALSE;
	GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_OBJ_TS)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_TC)->EnableWindow(FALSE);

	if(m_bFirstPoint)
	{	
		CTime tRuntime(2003,8,13,0,0,0);
		CString strRuntime = tRuntime.Format("%H:%M:%S");
		m_EditRuntime.SetSel(0,-1);
		m_EditRuntime.ReplaceSel(strRuntime);
	}
	
	if(m_bFirstPoint)
	{
		PIDCtrlCal();
	}
	SetTimer(2,(int)(m_fTs*1000/m_nSpeed),NULL);
	SetTimer(3,(int)(m_fTc*1000/m_nSpeed),NULL);
}

void CRealTimeCtrlView::OnButtonStop() 
{
	// TODO: Add your control notification handler code here
	m_bSuspend = TRUE;
	KillTimer(2);
	KillTimer(3);
	GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_OBJ_TS)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_TC)->EnableWindow(TRUE);
}

void CRealTimeCtrlView::OnButtonRestart() 
{
	// TODO: Add your control notification handler code here
	KillTimer(2);
	KillTimer(3);	

	m_bSuspend = FALSE;
	m_nRuntime = 0;
	m_fPV   = 0.0f;
	m_fPV1  = 0.0f;
	m_bFirstPoint = TRUE;
	m_fDV   = 0.0f;
	m_fDV1  = 0.0f;
	m_fDV2  = 0.0f;
	m_fU	= 0.0f;
	m_fU1   = 0.0f;
	
	for(int i=0;i<600;i++)
		m_fMV[i]=0;
	GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_OBJ_TS)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_TC)->EnableWindow(FALSE);
	
	m_Scrollbar.SetScrollRange(1,3);					//滚动条的初始化
	m_Scrollbar.SetScrollPos(1);

	CTime tRuntime(2003,8,13,0,0,0);
	CString strRuntime = tRuntime.Format("%H:%M:%S");
	m_EditRuntime.SetSel(0,-1);
	m_EditRuntime.ReplaceSel(strRuntime);

	if(m_bFirstPoint)
	{
		if(m_bAuto)
			PIDCtrlCal();
		else
			ManualCtrl();
	}

	m_lXAdd = 0;
	m_nAllPage = 1;
	m_nNowPage = 1;
	m_nNowPage2= 2;
	m_nNowPage3= 3;

	m_fPV1 = 0;

	m_StrokePV.RemoveAll();
	m_StrokeMV.RemoveAll();
	m_StrokeSV.RemoveAll();

	SetTimer(2,(int)(m_fTs*1000/m_nSpeed),NULL);
	SetTimer(3,(int)(m_fTc*1000/m_nSpeed),NULL);

	DrawStroke();
}

void CRealTimeCtrlView::DrawStroke()		//画历史曲线
{
	CRect rectMain;						//主绘图区
	rectMain.SetRect(21,48,847,418);
	int nXInterval = (int)((rectMain.right-rectMain.left)/15.0);
	int nYInterval = (int)((rectMain.bottom-rectMain.top)/10.0);
	float nXStep = (float)((847-21)/150.0);
	
	CClientDC dc(this);	

	CPen penRect(PS_NULL,0,RGB(255,255,255));
	CPen* pOldRect = dc.SelectObject(&penRect);
	dc.Rectangle(rectMain);
	dc.SelectObject(pOldRect);
	
	CPen penCoordinate(PS_DOT,1,RGB(0,0,0));
	CPen* pOldpenCoordinate = dc.SelectObject(&penCoordinate);	

	CString strI;											//X坐标
	strI.Format("%d",(m_nNowPage3-3)*50);
	COLORREF bkcolor = dc.GetBkColor();
	dc.SetBkColor(RGB(255,255,255));
	dc.TextOut(rectMain.left+1,rectMain.bottom-17,strI);
	dc.SetBkColor(bkcolor);
	for(int i=1;i<15;i++)						
	{

		dc.MoveTo(rectMain.left+i*nXInterval,rectMain.top);
		dc.LineTo(rectMain.left+i*nXInterval,rectMain.bottom);
		CString strI;
		strI.Format("%d",(m_nNowPage3-3)*50+i*10);
		COLORREF bkcolor = dc.GetBkColor();
		dc.SetBkColor(RGB(255,255,255));
		dc.TextOut(rectMain.left+i*nXInterval+1,rectMain.bottom-17,strI);
		dc.SetBkColor(bkcolor);
	}
	for( i=1; i<10; i++)						//Y坐标
	{
		dc.MoveTo(rectMain.left,rectMain.top+i*nYInterval);
		dc.LineTo(rectMain.right,rectMain.top+i*nYInterval);
	}
	dc.SelectObject(pOldpenCoordinate);

	CPen penPV,penMV,penSV;
	penPV.CreatePen(PS_SOLID,2,RGB(255,0,0));
	penMV.CreatePen(PS_SOLID,2,RGB(255,0,255));
	penSV.CreatePen(PS_SOLID,2,RGB(0,0,255));

	if(m_StrokePV.GetSize()>=1)
		for(int i=0; i<m_StrokePV.GetSize(); i++)
			m_StrokePV[i].x = m_StrokePV[i].x-m_lXAdd;
	if(m_StrokeMV.GetSize()>=1)
		for(int i=0; i<m_StrokeMV.GetSize(); i++)
			m_StrokeMV[i].x = m_StrokeMV[i].x-m_lXAdd;
	if(m_StrokeSV.GetSize()>=1)
		for(int i=0; i<m_StrokeSV.GetSize(); i++)
			m_StrokeSV[i].x = m_StrokeSV[i].x-m_lXAdd;

	BOOL bFirstPoint = TRUE;
	if(m_StrokePV.GetSize()>=1)
	{
		CPen* pOldpen = dc.SelectObject(&penPV);
		
		for ( int i=0; i<m_StrokePV.GetSize(); i++)
		{
			if((m_StrokePV[i].x>=rectMain.left-1)&&(m_StrokePV[i].x<=rectMain.right)&&(m_StrokePV[i].y>=rectMain.top)&&(m_StrokePV[i].y<=rectMain.bottom))
			{
				if(bFirstPoint)
				{
					dc.MoveTo(m_StrokePV[i]);
					bFirstPoint = FALSE;
				}
				else
				{
					if(m_StrokePV[i].x<rectMain.right)
						dc.LineTo(m_StrokePV[i]);
					else
						dc.LineTo(m_StrokePV[i].x-2,m_StrokePV[i].y);
				}
			}
		}
		dc.SelectObject(pOldpen);
	}
	if(m_StrokeMV.GetSize()>=1)
	{
		bFirstPoint = TRUE;
		CPen* pOldpen = dc.SelectObject(&penMV);

⌨️ 快捷键说明

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