📄 realtimectrlview.cpp
字号:
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 + -