📄 水箱实验view.cpp
字号:
//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 + -