📄 realtimectrlview.cpp
字号:
// RealTimeCtrlView.cpp : implementation of the CRealTimeCtrlView class
//
#include "stdafx.h"
#include "RealTimeCtrl.h"
#include "RealTimeCtrlDoc.h"
#include "RealTimeCtrlView.h"
#include<math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRealTimeCtrlView
IMPLEMENT_DYNCREATE(CRealTimeCtrlView, CFormView)
BEGIN_MESSAGE_MAP(CRealTimeCtrlView, CFormView)
//{{AFX_MSG_MAP(CRealTimeCtrlView)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_CTRLPARA_RESET, OnCtrlparaReset)
ON_BN_CLICKED(IDC_OBJPARA_RESET, OnObjparaReset)
ON_BN_CLICKED(IDC_CTRLPARA_OK, OnCtrlparaOk)
ON_BN_CLICKED(IDC_OBJPARA_OK, OnObjparaOk)
ON_BN_CLICKED(IDC_BUTTON_AUTOANDMANUAL, OnButtonAutoandmanual)
ON_BN_CLICKED(IDC_BUTTON_RUN, OnButtonRun)
ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_BUTTON_RESTART, OnButtonRestart)
ON_COMMAND(ID_MENU_SPEED1, OnMenuSpeed1)
ON_UPDATE_COMMAND_UI(ID_MENU_SPEED1, OnUpdateMenuSpeed1)
ON_COMMAND(ID_MENU_SPEED8, OnMenuSpeed8)
ON_UPDATE_COMMAND_UI(ID_MENU_SPEED8, OnUpdateMenuSpeed8)
ON_COMMAND(ID_MENU_SPEED2, OnMenuSpeed2)
ON_UPDATE_COMMAND_UI(ID_MENU_SPEED2, OnUpdateMenuSpeed2)
ON_COMMAND(ID_MENU_SPEED4, OnMenuSpeed4)
ON_UPDATE_COMMAND_UI(ID_MENU_SPEED4, OnUpdateMenuSpeed4)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_MENU_SPEED16, OnMenuSpeed16)
ON_UPDATE_COMMAND_UI(ID_MENU_SPEED16, OnUpdateMenuSpeed16)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRealTimeCtrlView construction/destruction
CRealTimeCtrlView::CRealTimeCtrlView()
: CFormView(CRealTimeCtrlView::IDD)
{
//{{AFX_DATA_INIT(CRealTimeCtrlView)
m_fK = 0.0f;
m_fMH = 0.0f;
m_fML = 0.0f;
m_fKp = 0.0f;
m_fL = 0.0f;
m_fTp = 0.0f;
m_fTs = 0.0f;
m_fKP = 0.0f;
m_fTD = 0.0f;
m_fTI = 0.0f;
m_fSV = 0.0f;
m_fTc = 0.0f;
//}}AFX_DATA_INIT
// TODO: add construction code here
m_bAuto = TRUE;
m_bSuspend = TRUE;
m_fPV = 0.0f;
m_fPV1 = 0.0f;
m_bFirstPoint = TRUE;
m_fDV = 0.0f;
m_fDV1 = 0.0f;
m_fDV2 = 0.0f;
m_fd = 0.0f;
m_fm = 0.0f;
m_fU = 0.0f;
m_fU1 = 0.0f;
m_nRuntime = 0;
m_lXAdd = 0;
m_nAllPage = 1;
m_nNowPage = 1;
m_nNowPage2= 2;
m_nNowPage3= 3;
m_fManual = 0.0f;
m_nSpeed = 1;
}
CRealTimeCtrlView::~CRealTimeCtrlView()
{
}
void CRealTimeCtrlView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRealTimeCtrlView)
DDX_Control(pDX, IDC_SLIDER_MANUAL, m_SliderManual);
DDX_Control(pDX, IDC_MANUALSTATUS, m_ManualStatus);
DDX_Control(pDX, IDC_EDIT_MANUAL, m_EditManual);
DDX_Control(pDX, IDC_SCROLLBAR, m_Scrollbar);
DDX_Control(pDX, IDC_EDIT_RUNTIME, m_EditRuntime);
DDX_Control(pDX, IDC_EDIT_SHOW_SV, m_EditShowSV);
DDX_Control(pDX, IDC_EDIT_SHOW_PV, m_EditShowPV);
DDX_Control(pDX, IDC_EDIT_SHOW_MV, m_EditShowMV);
DDX_Control(pDX, IDC_EDIT_DATE, m_DateEdit);
DDX_Control(pDX, IDC_EDIT_TIME, m_TimeEdit);
DDX_Text(pDX, IDC_EDIT_K, m_fK);
DDX_Text(pDX, IDC_EDIT_MH, m_fMH);
DDX_Text(pDX, IDC_EDIT_ML, m_fML);
DDX_Text(pDX, IDC_EDIT_OBJ_KP, m_fKp);
DDX_Text(pDX, IDC_EDIT_OBJ_L, m_fL);
DDX_Text(pDX, IDC_EDIT_OBJ_TP, m_fTp);
DDX_Text(pDX, IDC_EDIT_OBJ_TS, m_fTs);
DDV_MinMaxFloat(pDX, m_fTs, 0.f, 1.f);
DDX_Text(pDX, IDC_EDIT_PID_KP, m_fKP);
DDX_Text(pDX, IDC_EDIT_PID_TD, m_fTD);
DDX_Text(pDX, IDC_EDIT_PID_TI, m_fTI);
DDX_Text(pDX, IDC_EDIT_SV, m_fSV);
DDX_Text(pDX, IDC_EDIT_TC, m_fTc);
DDV_MinMaxFloat(pDX, m_fTc, 4.0001f, 10000.f);
//}}AFX_DATA_MAP
}
BOOL CRealTimeCtrlView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
void CRealTimeCtrlView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
SetTimer(1,500,NULL);
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
m_ManualStatus.SetSel(0,-1);
m_ManualStatus.ReplaceSel("目前自动状态");
GetDlgItem(IDC_EDIT_MANUAL)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_SLIDER_MANUAL)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_MANUAL_STATIC)->ShowWindow(SW_HIDE);
m_Scrollbar.SetScrollRange(1,3); //滚动条的初始化
m_Scrollbar.SetScrollPos(1);
m_SliderManual.SetRange(-50000,50000); //滑块初始化
m_SliderManual.SetTicFreq(10000);
InitalParam();
}
/////////////////////////////////////////////////////////////////////////////
// CRealTimeCtrlView diagnostics
#ifdef _DEBUG
void CRealTimeCtrlView::AssertValid() const
{
CFormView::AssertValid();
}
void CRealTimeCtrlView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CRealTimeCtrlDoc* CRealTimeCtrlView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRealTimeCtrlDoc)));
return (CRealTimeCtrlDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRealTimeCtrlView message handlers
void CRealTimeCtrlView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==2) //数据采集及显示
{
ModelCal();
m_nRuntime +=(int)(m_fTs*1000);
int nSecond = (m_nRuntime/1000)%60;
int nMinute = ((m_nRuntime/1000)/60)%60;
int nHour = (m_nRuntime/1000)/(60*60);
CTime tRuntime(2003,8,13,nHour,nMinute,nSecond);
CString strRuntime = tRuntime.Format("%H:%M:%S");
// TRACE(strRuntime);
// strRuntime.Format("%2d:%2d:%2d",nHour,nMinute,nSecond);
m_EditRuntime.SetSel(0,-1);
m_EditRuntime.ReplaceSel(strRuntime);
DrawPoint();
}
if(nIDEvent==3) //控制计算
{
/* if(m_bSuspend)
{
KillTimer(2);
KillTimer(3);
GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
}*/
if(m_bAuto)
PIDCtrlCal();
else
ManualCtrl();
}
if(nIDEvent==1) //时间显示
{
CTime tNow;
tNow = CTime::GetCurrentTime();
CString strDate = tNow.Format("%Y年%m月%d日");
CString strTime = tNow.Format("%H:%M:%S");
m_DateEdit.SetSel(0,-1);
m_DateEdit.ReplaceSel(strDate);
m_TimeEdit.SetSel(0,-1);
m_TimeEdit.ReplaceSel(strTime);
}
CFormView::OnTimer(nIDEvent);
}
void CRealTimeCtrlView::InitalParam()
{
//--------------PID控制参数--------------------//
m_fKP = 4.0f; //比例KP
m_fTI = 28.0f; //积分TI
m_fTD = 1.0f; //微分TD
m_fm = 15.0f; //不完全微分增益
m_fTc = 15; //控制周期Tc
m_fK = 0.25; //增益系数K
m_fSV = 3; //给定值SV
m_fMH = 5; //输出限幅上限MH
m_fML = -5; //输出限幅下限ML
//----------------对象参数---------------------//
m_fL = 20; //延迟时间L
m_fKp = 1; //增益Kp
m_fTp = 50; //时间常数Tp
m_fTs = 1; //离散计算周期Ts
UpdateData(FALSE);
for(int i=0;i<600;i++)
m_fMV[i]=0;
m_fd = 0.2f;
}
void CRealTimeCtrlView::OnCtrlparaReset()
{
//为保证修改控制参数时对对象参数的外观没有影响,我得先把原来的对象参数全保存下来
float fLtemp = m_fL;
float fKptemp = m_fKp;
float fTptemp = m_fTp;
float fTstemp = m_fTs;
float fTctemp = m_fTc; //Tc运行时不能变
UpdateData(TRUE); //从屏幕保存
//--------------PID控制参数重置--------------------//
m_fKP = 4.0f; //比例KP
m_fTI = 28.0f; //积分TI
m_fTD = 1.0; //微分TD
m_fTc = 15; //控制周期Tc
m_fK =0.25; //增益系数K
m_fSV = 3; //给定值SV
m_fMH = 5; //输出限幅上限MH
m_fML = -5; //输出限幅下限ML
if(!m_bSuspend) m_fTc = fTctemp;
UpdateData(FALSE);
//把变化了的对象参数复原
m_fL = fLtemp;
m_fKp = fKptemp;
m_fTp = fTptemp;
m_fTs = fTstemp;
}
void CRealTimeCtrlView::OnObjparaReset()
{
//为保证修改对象参数时对控制参数的外观没有影响,我得先把原来的控制参数全保存下来
float fKPtemp = m_fKP; //比例KP
float fTItemp = m_fTI; //积分TI
float fTDtemp = m_fTD; //微分TD
float fTctemp = m_fTc; //控制周期Tc
float fKtemp = m_fK; //增益系数K
float fSVtemp = m_fSV; //给定值SV
float fMHtemp = m_fMH; //输出限幅上限MH
float fMLtemp = m_fML; //输出限幅下限ML
float fTstemp = m_fTs;
UpdateData(TRUE); //从屏幕保存
//----------------对象参数重置---------------------//
m_fL = 20; //延迟时间L
m_fKp = 1; //增益Kp
m_fTp = 50; //时间常数Tp
m_fTs = 1; //离散计算周期Ts
if(!m_bSuspend) m_fTs = fTstemp; //不是暂停状态则把Ts改回去
UpdateData(FALSE);
//把变化了的控制参数复原
m_fKP = fKPtemp;
m_fTI = fTItemp;
m_fTD = fTDtemp;
m_fTc = fTctemp;
m_fK = fKtemp;
m_fSV = fSVtemp;
m_fMH = fMHtemp;
m_fML = fMLtemp;
}
void CRealTimeCtrlView::OnCtrlparaOk()
{
//-------------确定修改控制参数-----------------------//
//为保证修改控制参数时对对象参数没有影响,我得先把原来的对象参数全保存下来
float fLtemp = m_fL;
float fKptemp = m_fKp;
float fTptemp = m_fTp;
float fTstemp = m_fTs;
UpdateData(TRUE); //从屏幕保存参数
//再把对象参数复原
m_fL = fLtemp;
m_fKp = fKptemp;
m_fTp = fTptemp;
m_fTs = fTstemp;
}
void CRealTimeCtrlView::OnObjparaOk()
{
//-------------确定修改对象参数-----------------------//
//为保证修改对象参数时对控制参数没有影响,我得先把原来的控制参数全保存下来
float fKPtemp = m_fKP; //比例KP
float fTItemp = m_fTI; //积分TI
float fTDtemp = m_fTD; //微分TD
float fTctemp = m_fTc; //控制周期T
float fKtemp = m_fK; //增益系数K
float fSVtemp = m_fSV; //给定值SV
float fMHtemp = m_fMH; //输出限幅上限MH
float fMLtemp = m_fML; //输出限幅下限ML
UpdateData(TRUE); //从屏幕保存参数
//再把控制参数复原
m_fKP = fKPtemp;
m_fTI = fTItemp;
m_fTD = fTDtemp;
m_fTc = fTctemp;
m_fK = fKtemp;
m_fSV = fSVtemp;
m_fMH = fMHtemp;
m_fML = fMLtemp;
}
void CRealTimeCtrlView::OnButtonAutoandmanual()
{
// TODO: Add your control notification handler code here
m_bAuto = !m_bAuto;
if(m_bAuto)
{
GetDlgItem(IDC_EDIT_MANUAL)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_SLIDER_MANUAL)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_MANUAL_STATIC)->ShowWindow(SW_HIDE);
m_ManualStatus.SetSel(0,-1);
m_ManualStatus.ReplaceSel("目前自动状态");
}
else
{
GetDlgItem(IDC_EDIT_MANUAL)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_SLIDER_MANUAL)->ShowWindow(SW_SHOW);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -