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

📄 realtimectrlview.cpp

📁 一个演示实时多任务系统运行的仿真程序源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -