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

📄 realtimectrlview.cpp

📁 一个演示实时多任务系统运行的仿真程序源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		
		for (int i=0; i<m_StrokePV.GetSize(); i++)
		{
			if((m_StrokeMV[i].x>=rectMain.left-1)&&(m_StrokeMV[i].x<=rectMain.right)&&(m_StrokeMV[i].y>=rectMain.top)&&(m_StrokeMV[i].y<=rectMain.bottom))
			{
				if(bFirstPoint)
				{
					dc.MoveTo(m_StrokeMV[i]);
					bFirstPoint = FALSE;
				}
				else
				{
					if(m_StrokeMV[i].x<rectMain.right)
						dc.LineTo(m_StrokeMV[i]);
					else
						dc.LineTo(m_StrokeMV[i].x-2,m_StrokeMV[i].y);
				}
			}
		}
		dc.SelectObject(pOldpen);
	}
	if(m_StrokeSV.GetSize()>=1)
	{
		bFirstPoint = TRUE;
		CPen* pOldpen = dc.SelectObject(&penSV);
		
		for ( int i=0; i<m_StrokeSV.GetSize(); i++)
		{
			if((m_StrokeSV[i].x>=rectMain.left-1)&&(m_StrokeSV[i].x<=rectMain.right)&&(m_StrokeSV[i].y>=rectMain.top)&&(m_StrokeSV[i].y<=rectMain.bottom))
			{
				if(bFirstPoint)
				{
					dc.MoveTo(m_StrokeSV[i]);
					bFirstPoint = FALSE;
				}
				else
				{
					if(m_StrokeSV[i].x<rectMain.right)
						dc.LineTo(m_StrokeSV[i]);
					else
						dc.LineTo(m_StrokeSV[i].x-2,m_StrokeSV[i].y);	
				}
			}
		}
		dc.SelectObject(pOldpen);
	}

	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;
}

void CRealTimeCtrlView::DrawStroke(CDC* pDC)			//OnDraw中画图
{
	CRect rectMain;						//主绘图区
	rectMain.SetRect(21,48,847,418);
	
	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));

//	CClientDC dc(this);
	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 = pDC->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)
				{
					pDC->MoveTo(m_StrokePV[i]);
					bFirstPoint = FALSE;
				}
				else
					pDC->LineTo(m_StrokePV[i]);
			}
		}
		pDC->SelectObject(pOldpen);
	}
	if(m_StrokeMV.GetSize()>=1)
	{
		bFirstPoint = TRUE;
		CPen* pOldpen = pDC->SelectObject(&penMV);
		
		for (int i=0; i<m_StrokePV.GetSize(); i++)
		{
			if((m_StrokeMV[i].x>=rectMain.left-1)&&(m_StrokeMV[i].x<=rectMain.right)&&(m_StrokeMV[i].y>=rectMain.top)&&(m_StrokeMV[i].y<=rectMain.bottom))
			{
				if(bFirstPoint)
				{
					pDC->MoveTo(m_StrokeMV[i]);	
					bFirstPoint = FALSE;
				}
				else
					pDC->LineTo(m_StrokeMV[i]);
			}
		}
		pDC->SelectObject(pOldpen);
	}
	if(m_StrokeSV.GetSize()>=1)
	{
		bFirstPoint = TRUE;
		CPen* pOldpen = pDC->SelectObject(&penSV);	
		for ( int i=0; i<m_StrokeSV.GetSize(); i++)
		{
			if((m_StrokeSV[i].x>=rectMain.left-1)&&(m_StrokeSV[i].x<=rectMain.right)&&(m_StrokeSV[i].y>=rectMain.top)&&(m_StrokeSV[i].y<=rectMain.bottom))
			{
				if(bFirstPoint)
				{
					pDC->MoveTo(m_StrokeSV[i]);
					bFirstPoint = FALSE;
				}
				else
					pDC->LineTo(m_StrokeSV[i]);
			}
		}
		pDC->SelectObject(pOldpen);
	}
	
	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;
}

void CRealTimeCtrlView::PIDCtrlCal()
{
		m_fDV = m_fSV - m_fPV;			//计算偏差

		//---------------采用变增益控制-增益系数m_fK---------------
		if((m_fDV<=m_fd) && (m_fDV>=(-m_fd)))			
			m_fDV = m_fK*m_fDV;
		else if(m_fDV>m_fd)
			m_fDV = m_fDV-(1-m_fK)*m_fd;
		else
			m_fDV = m_fDV+(1-m_fK)*m_fd;
		
		float delta_DV = m_fDV-m_fDV1;
		float delta_MV = delta_DV+m_fTc*m_fDV/m_fTI;
//		delta_MV = (delta_MV+m_fTD/m_fTc*(m_fDV+m_fDV2-2*m_fDV1))*m_fKP;	//不加不完全微分时
		//--------------不完全微分所加的内容-------------------------
		m_fU = (1/(m_fTc+m_fTD/m_fm))*(m_fTD*delta_DV+m_fTD*m_fU1/m_fm);
		delta_MV = (delta_MV+m_fU-m_fU1)*m_fKP;///1000;
		m_fU1 = m_fU;

		//--------------变化率限幅------------------------
//		if((m_fDV>=0.05f)||(m_fDV<=-0.05))
//		{
			if(delta_MV>=0.6f)
				delta_MV = 0.6f;
			else if(delta_MV<=-0.6f)
				delta_MV = -0.6f;
/*		}
		else
		{
			if(delta_MV>=0.01f)
			delta_MV = 0.01f;
			else if(delta_MV<=-0.01f)
			delta_MV = -0.01f;
		}*/

		m_fMV[0] = m_fMV[1]+delta_MV;

		//---------------输出限幅--------------------------
		if(m_fMV[0]>=m_fMH)
			m_fMV[0] = m_fMH;
		else if(m_fMV[0]<=m_fML)
			m_fMV[0] = m_fML;
		
		m_fDV2 = m_fDV1;
		m_fDV1 = m_fDV;
//		for(int i=149;i>0;i--)
//			m_fMV[i] = m_fMV[i-1];

}

void CRealTimeCtrlView::ManualCtrl()
{
//		m_fDV = m_fSV - m_fPV;			//计算偏差
		m_fMV[0] = m_fManual;
}

void CRealTimeCtrlView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	if(pScrollBar->GetDlgCtrlID()==IDC_SLIDER_MANUAL)
	{
		int nManual = m_SliderManual.GetPos();
		m_fManual = nManual/10000.0f;
		CString str;
		str.Format("%7.5f",m_fManual);
		m_EditManual.SetSel(0,-1);
		m_EditManual.ReplaceSel(str);
	}
	if(pScrollBar->GetDlgCtrlID()==IDC_SCROLLBAR)
	{
		switch(nSBCode) {
		case SB_PAGEDOWN:
			if(m_nNowPage3<m_nAllPage*3-2) 
			{
				m_nNowPage3+=3;
				m_Scrollbar.SetScrollPos(m_nNowPage3);//-2
				m_lXAdd = (m_nNowPage3-3)*(847-21)/3;
				DrawStroke();
			//	Invalidate(TRUE);
				break;
			}
			else
				break;
		case SB_PAGEUP:
			if(m_nNowPage3>6) 
			{
				m_nNowPage3-=3;
				m_Scrollbar.SetScrollPos(m_nNowPage3-2);
				m_lXAdd = (m_nNowPage3-3)*(847-21)/3;
				DrawStroke();
			//	Invalidate(TRUE);
				break;
			}
			else if(m_nNowPage3>3)
			{
				m_nNowPage3 = 3;
				m_Scrollbar.SetScrollPos(m_nNowPage3-3);
				m_lXAdd = (m_nNowPage3-3)*(847-21)/3;
				DrawStroke();
			//	Invalidate(TRUE);
				break;
			}
			else
				break;
		case SB_LINELEFT:
			if(m_nNowPage3>3)
			{
				m_nNowPage3-=1;
				m_Scrollbar.SetScrollPos(m_nNowPage3-2);
				m_lXAdd = (m_nNowPage3-3)*(847-21)/3;
				DrawStroke();
			//	Invalidate(TRUE);
				break;
			}
			else
				break;
		case SB_LINERIGHT:
			if(m_nNowPage3<3*m_nAllPage)
			{
				m_nNowPage3+=1;
				
//				if(m_nNowPage3 == m_nAllPage*3) m_Scrollbar.SetScrollPos(m_nNowPage3);
//				else m_Scrollbar.SetScrollPos(m_nNowPage3-2);
				m_Scrollbar.SetScrollPos(m_nNowPage3);
				m_lXAdd = (m_nNowPage3-3)*(847-21)/3;
				DrawStroke();
			//	Invalidate(TRUE);
				break;
			}
			else
				break;
		default:
			break;
		}
	}
	CFormView::OnHScroll(nSBCode, nPos, pScrollBar);
}


void CRealTimeCtrlView::OnMenuSpeed1() 
{
	// TODO: Add your command handler code here
	m_nSpeed = 1;
}

void CRealTimeCtrlView::OnUpdateMenuSpeed1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_nSpeed==1);
	pCmdUI->Enable(m_bSuspend);
}

void CRealTimeCtrlView::OnMenuSpeed8() 
{
	// TODO: Add your command handler code here
	m_nSpeed = 8;
}

void CRealTimeCtrlView::OnUpdateMenuSpeed8(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_nSpeed==8);
	pCmdUI->Enable(m_bSuspend);
}

void CRealTimeCtrlView::OnMenuSpeed2() 
{
	// TODO: Add your command handler code here
	m_nSpeed = 2;
}

void CRealTimeCtrlView::OnUpdateMenuSpeed2(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_nSpeed==2);
	pCmdUI->Enable(m_bSuspend);
}

void CRealTimeCtrlView::OnMenuSpeed4() 
{
	// TODO: Add your command handler code here
	m_nSpeed = 4;
}

void CRealTimeCtrlView::OnUpdateMenuSpeed4(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_nSpeed==4);
	pCmdUI->Enable(m_bSuspend);
}

void CRealTimeCtrlView::OnMenuSpeed16() 
{
	// TODO: Add your command handler code here
	m_nSpeed = 16;	
}

void CRealTimeCtrlView::OnUpdateMenuSpeed16(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_nSpeed==16);
	pCmdUI->Enable(m_bSuspend);	
}

void CRealTimeCtrlView::OnLButtonDown(UINT nFlags, CPoint point) 
{
/*	// TODO: Add your message handler code here and/or call default
	CPoint pt = point;
	ScreenToClient(&pt);

	CRect rectMain;
	rectMain.SetRect(21,48,847,418);
	CPoint ptOre(21,418);
	float nXStep = (float)((847-21)/150.0);
	float nYStep = (418-48)/5.0;
	
	if((pt.x>=rectMain.left)&&(pt.x<=rectMain.right)&&(pt.y>=rectMain.top-40)&&(pt.y<=rectMain.bottom-40))
	{
		int i =int( (pt.x-rectMain.left)/nXStep );
		i = i+50*(m_nNowPage3-3);

		if(i<m_StrokePV.GetSize())
		{
			float fPv,fMv,fSv;
			fPv = (ptOre.y-m_StrokePV[i].y)/nYStep;
			fMv = (ptOre.y-m_StrokeMV[i].y)/nYStep;
			fSv = (ptOre.y-m_StrokeSV[i].y)/nYStep;

			CString str;
			str.Format("%7.5f",fPv);
			m_EditShowPV.SetSel(0,-1);
			m_EditShowPV.ReplaceSel(str);
			str.Format("%7.5f",fMv);
			m_EditShowMV.SetSel(0,-1);
			m_EditShowMV.ReplaceSel(str);
			str.Format("%7.5f",fSv);
			m_EditShowSV.SetSel(0,-1);
			m_EditShowSV.ReplaceSel(str);
		}
	}
*/
	CFormView::OnLButtonDown(nFlags, point);
}

⌨️ 快捷键说明

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