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

📄 水箱实验view.cpp

📁 这是一个水箱的液位控制程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		//mv2图标:	tanglepoint[0].x=941-7 ;	tanglepoint[0].y=620;	tanglepoint[1].x=941-17;	tanglepoint[1].y=620+5;	tanglepoint[2].x=941-17;	tanglepoint[2].y=620-5;	mvRgnOther.CreatePolygonRgn(tanglepoint,3,WINDING);	//sv1图标:	tanglepoint[0].x=979+7;	tanglepoint[0].y=320;	tanglepoint[1].x=979+17;	tanglepoint[1].y=320+5;	tanglepoint[2].x=979+17;	tanglepoint[2].y=320-5;	svRgn.CreatePolygonRgn(tanglepoint,3,WINDING);	//sv2图标:	tanglepoint[0].x=979+7;	tanglepoint[0].y=620;	tanglepoint[1].x=979+17;	tanglepoint[1].y=620+5;	tanglepoint[2].x=979+17;	tanglepoint[2].y=620-5;	svRgnOther.CreatePolygonRgn(tanglepoint,3,WINDING);	//		return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);}void CMyView::OnOptionTime() {	// TODO: Add your command handler code here	Ccaiyang dlg;	dlg.m_time=m_time;	if(dlg.DoModal()==IDOK)	{		m_time=(dlg.m_time/500)*500;		if(m_time==0)			m_time=500;		CRect Rect3(80,330,890,345);		InvalidateRect(&Rect3,NULL);		CRect Rect4(80,630,890,645);		InvalidateRect(&Rect4,NULL);	}}void CMyView::OnPid() {	// TODO: Add your control notification handler code here	CPIDDlg dlg;	dlg.m_pidkp1=m_pidkp1;	dlg.m_pidkp2=m_pidkp2;	dlg.m_pidtd1=m_pidtd1;	dlg.m_pidtd2=m_pidtd2;	dlg.m_pidti1=m_pidti1;	dlg.m_pidti2=m_pidti2;		if(dlg.DoModal()==IDOK)		{			if((AfxMessageBox("决定修改PID参数?",MB_YESNO))==IDYES)		{			m_pidkp1=dlg.m_pidkp1;			m_pidkp2=dlg.m_pidkp2;			m_pidtd1=dlg.m_pidtd1;			m_pidtd2=dlg.m_pidtd2;			m_pidti1=dlg.m_pidti1;			m_pidti2=dlg.m_pidti2;				}		}	}void CMyView::OnOptionPid() {	// TODO: Add your command handler code here	CPIDDlg dlg;	dlg.m_pidkp1=m_pidkp1;	dlg.m_pidkp2=m_pidkp2;	dlg.m_pidtd1=m_pidtd1;	dlg.m_pidtd2=m_pidtd2;	dlg.m_pidti1=m_pidti1;	dlg.m_pidti2=m_pidti2;		if(dlg.DoModal()==IDOK)		{			if((AfxMessageBox("决定修改PID参数?",MB_YESNO))==IDYES)			{					m_pidkp1=dlg.m_pidkp1;			m_pidkp2=dlg.m_pidkp2;			m_pidtd1=dlg.m_pidtd1;			m_pidtd2=dlg.m_pidtd2;			m_pidti1=dlg.m_pidti1;			m_pidti2=dlg.m_pidti2;					}		}	}void CMyView::OnControler() {	// TODO: Add your control notification handler code here	CControlerSet dlg;	dlg.m_pidcontrol=m_pidcontrolget;	if(dlg.DoModal()==IDOK)	{		if((AfxMessageBox("确定改变控制方法吗?",MB_YESNO))==IDYES)		{			m_pidcontrolget=dlg.m_pidcontrol;		}	}}void CMyView::OnOptionControlset() {	// TODO: Add your command handler code here		CControlerSet dlg;	dlg.m_pidcontrol=m_pidcontrolget;	if(dlg.DoModal()==IDOK)	{if((AfxMessageBox("确定改变控制方法吗?",MB_YESNO))==IDYES)	{		m_pidcontrolget=dlg.m_pidcontrol;	}	}}void CMyView::OnOptionSetsv() {	// TODO: Add your command handler code here	Csetsv dlg;	dlg.aorm=aorm;	dlg.aorm2=aorm2;	if(aorm)	{		dlg.m_getsetsv1=m_getsetsv1;	}	else		dlg.m_getsetsv1=m_getsetmv1;	if(aorm2)	{		dlg.m_getsetsv2=m_getsetsv2;	}	else		dlg.m_getsetsv2=m_getsetmv2;			if(dlg.DoModal()==IDOK)	{		if((AfxMessageBox("确定修改原来设定的值吗?",MB_YESNO))==IDYES)		{			if(aorm)			{				m_getsetsv1=dlg.m_getsetsv1;				if(m_getsetsv1>5000)				{					m_getsetsv1=5000;				}				else				{					if(m_getsetsv1<1000)					{						m_getsetsv1=1000;					}				}			}			else			{				m_getsetmv1=dlg.m_getsetsv1;				if(m_getsetmv1>20000)				{					m_getsetmv1=20000;				}				else				{					if(m_getsetmv1<4000)					{						m_getsetmv1=4000;					}				}			}			if(aorm2)			{				m_getsetsv2=dlg.m_getsetsv2;				if(m_getsetsv2>5000)				{					m_getsetsv2=5000;				}				else				{					if(m_getsetsv2<1000)					{						m_getsetsv2=1000;					}				}			}			else			{				m_getsetmv2=dlg.m_getsetsv2;				if(m_getsetmv2>20000)				{					m_getsetmv2=20000;				}				else				{					if(m_getsetmv2<4000)					{						m_getsetmv2=4000;					}				}			}								}	}}void CMyView::OnTimer(UINT nIDEvent){	// TODO: Add your message handler code here and/or call default	if(!(cout%(m_time/100)))	{
//      zanshi[zanshi_shu]=mDataport.GetData1();
//		zanshi_shu=zanshi_shu+1;
//		if(zanshi_shu=29)
//			zanshi_shu=0;
//		yanchi=yanchi+1;
//      if(yanchi>=20)
//		{
//			    if(yanchi>=20)
//					if(yanchi<=30)
//	            		PvGetData[datanumber]=zanshi[zanshi_shu-20];//采样值由A/D转换器得到
//	            if(yanchi<20)
//					PvGetData[datanumber]=zanshi[30+zanshi_shu-20];//采样值由A/D转换器得到
//		}




		PvGetData[datanumber]=mDataport.GetData1();//采样值由A/D转换器得到		PvGetDataOther[datanumber]=mDataport.GetData2();//采样值由A/D转换器得到		if(datanumber==0)		{			for(int delay1=0;delay1<=int(m_delaytime1*1000/m_time)*5;delay1++)			{				PvData[delay1]=PvGetData[datanumber];			}			for(int delay2=0;delay2<=int(m_delaytime2*1000/m_time)*5;delay2++)			{				PvDataOther[datanumber+delay2]=PvGetDataOther[datanumber];			}		}		else		{			if(m_filteryes1)				PvData[datanumber+int(m_delaytime1*1000/m_time)*5]=m_getfilternun1*PvGetData[datanumber]+(1-m_getfilternun1)*PvData[datanumber-1+int(m_delaytime1*1000/m_time)*5];			else				PvData[datanumber+int(m_delaytime1*1000/m_time)*5]=PvGetData[datanumber];			if(m_filteryes2)				PvDataOther[datanumber+int(m_delaytime2*1000/m_time)*5]=m_getfilternun2*PvGetDataOther[datanumber]+(1-m_getfilternun2)*PvDataOther[datanumber-1+int(m_delaytime2*1000/m_time)*5];			else				PvDataOther[datanumber+int(m_delaytime2*1000/m_time)*5]=PvGetDataOther[datanumber];		}		if(PvData[datanumber]<1)			PvData[datanumber]=1;		if(PvDataOther[datanumber]<1)			PvDataOther[datanumber]=1;		//滤波的效果比不滤波好				if(!(aorm2==2))		{			if(aorm==1)			{				PvDataValue=PvData[datanumber];				switch(m_pidcontrolget)				{				case 0:					{						U1=pidcontrol1(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp1,m_pidti1,m_pidtd1);					break;					}    //控制算法				case 1: 					{						U1=smithcontrol1(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp1,m_pidti1,m_pidtd1);						break;					}				case 2:					{						U1=dmccontrol1(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp1,m_pidti1,m_pidtd1);						break;					}				case 3:   					{						U1=othercontrol1(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp1,m_pidti1,m_pidtd1);						break;					} 				default: 					break;				}
				    zanshi1[zanshi1_shu]=U1;
					zanshi1_shu=zanshi1_shu+1;
				    if(yanchi1>=20)
					{
					    mDataport.SetData1(zanshi1[zanshi1_shu-20]);   			            		
			        }
					if(U1>=4)
						yanchi1=yanchi1+1;
					if(yanchi1<=20)
					{
						mDataport.SetData1(zanshi1[0]); 
					}				//				mDataport.SetData1(float(U1));   //控制量输出到D/A转换器				SvData[datanumber]=float(m_getsetsv1)/1000;				MvData[datanumber]=U1;
				//yellowv=U1;			}			//上面的水箱一都是选择自动时的			else			{				if(aorm==0)				{					PvDataValue=PvData[datanumber];								U1=float(m_getsetmv1)/1000;					TRACE("m_getsetmv1=%f\n",m_getsetmv1);					TRACE("U1=%f\n",U1);					TRACE("datanumber=%f\n",float(datanumber));
				    zanshi1[zanshi1_shu]=U1;
					zanshi1_shu=zanshi1_shu+1;
				    if(yanchi1>=20)
					{
					    mDataport.SetData1(zanshi1[zanshi1_shu-20]);   			            		
			        }
					if(U1>=4)
						yanchi1=yanchi1+1;
					if(yanchi1<=20)
					{
						mDataport.SetData1(zanshi1[0]); 
					}
//					mDataport.SetData1(float(U1));   //控制量输出到D/A转换器								SvData[datanumber]=PvData[datanumber];					MvData[datanumber]=U1;
					yellowv=U1;
					yellov_backup=U1;					m_getsetsv1=int(SvData[datanumber]*1000);				}						}		}		if(!(aorm==2))		{			if(aorm2==1)			{				PvDataValueOther=PvDataOther[datanumber];				switch(m_pidcontrolget)				{				case 0:					{						U2=pidcontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],													m_pidkp2,m_pidti2,m_pidtd2);						break;					}    //控制算法				case 1: 					{						U2=smithcontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp2,m_pidti2,m_pidtd2);						break;					}				case 2:					{						U2=dmccontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp2,m_pidti2,m_pidtd2);						break;					}				case 3:   					{						U2=othercontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp2,m_pidti2,m_pidtd2);						break;					} 				default: 					break;				}				mDataport.SetData2(float(U2));   //控制量输出到D/A转换器						SvDataOther[datanumber]=float(m_getsetsv2)/1000;				MvDataOther[datanumber]=U2;			}			//上面的水箱二都是选择自动时的			else			{				if(aorm2==0)				{					PvDataValueOther=PvDataOther[datanumber];								U2=float(m_getsetmv2)/1000;	
					mDataport.SetData2(float(U2));   //控制量输出到D/A转换器								SvDataOther[datanumber]=PvDataOther[datanumber];					MvDataOther[datanumber]=U2;					m_getsetsv2=int(SvDataOther[datanumber]*1000);				}			}		}		//////////////////////////系统串级时:		if(aorm2==2)		{			//////////////加入水箱二串级时的代码:			///////串级自动,控制水箱一的期望值,通过PID算出来的值为水箱二的期望值SV			if(aorm==1)			{				PvDataValue=PvData[datanumber];				switch(m_pidcontrolget)				{				case 0:					{						U1=pidcontrol1(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp1,m_pidti1,m_pidtd1);						break;					}    //控制算法				case 1: 					{						U1=smithcontrol1(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp1,m_pidti1,m_pidtd1);						break;					}				case 2:					{						U1=dmccontrol1(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp1,m_pidti1,m_pidtd1);						break;					}				case 3:   					{						U1=othercontrol1(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],							m_pidkp1,m_pidti1,m_pidtd1);						break;					} 				default: 					break;				}				//MvData[datanumber]=U1;				SvDataOther[datanumber]=U1/4;				m_getsetsv2=int(U1*250);				PvDataValueOther=PvDataOther[datanumber];				if(m_seriesoption==0)				{///采用双级控制器					switch(m_pidcontrolget)					{					case 0:						{							U2=pidcontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],								m_pidkp2,m_pidti2,m_pidtd2);							break;						}    //控制算法					case 1: 						{							U2=smithcontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],								m_pidkp2,m_pidti2,m_pidtd2);							break;						}					case 2:						{							U2=dmccontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],								m_pidkp2,m_pidti2,m_pidtd2);							break;						}					case 3:   						{							U2=othercontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],								m_pidkp2,m_pidti2,m_pidtd2);							break;						} 					default: 						break;					}				}				else				{				U2=U1;				}				//U1=4.00;				mDataport.SetData1(4.00);   //控制量输出到D/A转换器				mDataport.SetData2(float(U2));   //控制量输出到D/A转换器							//MvDataOther[datanumber]=U2;				MvData[datanumber]=U1;				SvData[datanumber]=float(m_getsetsv1)/1000;				MvDataOther[datanumber]=U2;			}			///////手动时			else			{				PvDataValue=PvData[datanumber];				PvDataValueOther=PvDataOther[datanumber];				if(m_seriesoption==0)				{					switch(m_pidcontrolget)					{					case 0:						{							U1=pidcontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],								m_pidkp2,m_pidti2,m_pidtd2);							break;						}    //控制算法					case 1: 						{							U1=smithcontrol2(PvData[datanumber-1],SvData[datanumber-1],PvDataOther[datanumber-1],SvDataOther[datanumber-1],

⌨️ 快捷键说明

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