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

📄 swmainform.cpp

📁 一个Windows下演示PID功能的源程序
💻 CPP
字号:
#include "SWMainForm.h"

 //region int SmartWinMain(sw::Application& app)
int SmartWinMain(sw::Application& app)
{
    SWMainForm* mainForm=new SWMainForm;
    mainForm->initAndCreate();
    return  app.run();
}

void SWMainForm::main_createMenu(void)
{
        mainMenu = createMenu();
		WidgetMenuPtr file = mainMenu->appendPopup( _T( "&File" ) );
		file->appendItem( 1, _T( "&New PLC File" ), & SWMainForm::menuEventHandler );
		file->appendItem( 2, _T( "&Open PLC File" ), & SWMainForm::menuEventHandler );	
		file->appendItem( 3, _T( "&Save PLC File" ), & SWMainForm::menuEventHandler );
		//file->appendItem( 5, _T( "&Load Quake 3 map" ), & SWMainForm::menuEventHandler );
//		file->appendItem( 6, _T( "&Add PLC File" ), & SWMainForm::menuEventHandler );	
		file->appendSeparatorItem();
		file->appendItem( 4, _T( "&Exit" ), & SWMainForm::menuEventHandler );
		
		mainMenu->attach( this );
}
void SWMainForm::main_createToolbar(void)
{
    WidgetToolbar::Seed toolbar_seed;
	toolbar_seed.style |= TBSTYLE_FLAT;
	toolbar = createToolbar(toolbar_seed);
	toolbar->setButtonSize( 30, 25 );
	//toolbar_1 = createToolbar(toolbar_seed);
	//toolbar_1->setButtonSize( 32, 25 );
	ImageListPtr imageList( new ImageList( 23, 20, ILC_COLOR24 ) );
	imageList->addMultiple( SmartWin::Bitmap("bitmap1.bmp") );
	toolbar->setNormalImageList( imageList );
	toolbar->addButton( 0, 0, _T( "New" ), _T( "New IRRscene File" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 1, 1, _T( "Open" ), _T( "Open IRRscene File" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 2, 2, _T( "Save" ), _T( "Save IRRscene File" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 3, 3, _T( "Dele" ), _T( "Delete model..." ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 4, 4, _T( "Copy" ), _T( "Testing model..." ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 5, 5, _T( "Past" ), _T( "Paste model..." ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 6, 6, _T( "Hide" ), _T( "Hide/Unhide" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 7, 7, _T( "Wire" ), _T( "Show Wire/Hide wire" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 8, 8, _T( "Mode" ), _T( "OpenMode" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 9, 9, _T( "View" ), _T( "View Change" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 10, 10, _T( "Full" ), _T( "Full Perspective View" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 11, 11, _T( "Play" ), _T( "Play" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 12, 12, _T( "Text" ), _T( "Texture" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 13, 13, _T( "MoveC" ), _T( "Move Camera" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 14, 14, _T( "MoveM" ), _T( "Move model" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 15, 15, _T( "Rota" ), _T( "Rotate model" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 16, 16, _T( "Scal" ), _T( "Scale model" ), false, & SWMainForm::toolbarClicked );
	toolbar->addButton( 17, 17, _T( "Cube" ), _T( "Add Cube" ), false, & SWMainForm::toolbarClicked );
	
	toolbar->refresh();
}

void SWMainForm::menuEventHandler( WidgetMenuPtr menu, unsigned int item )
{     
     UpdateCanvas c( this );
     
     switch(item) 
     {            
           case 2: 
               OnLoadFile();
               break;
            case 3:
                OnSaveFile();
                break;               
     }
    
}


void SWMainForm::toolbarClicked( WidgetToolbarPtr toolbar, unsigned btn )
{
    
     UpdateCanvas c( this );
    
    switch(btn) 
    {            
        case 0:        
           break;
		case 1: 
		    OnLoadFile();
           break;
        case 2:
            OnSaveFile();
           break;
   }
}
void SWMainForm::OnLoadFile()
{
     WidgetLoadFile L_dlg;
     SmartUtil::tstring filePath;
     std::fstream sfs;
     int len;
     char* buf;
     SmartUtil::tstring file_data;
     
     L_dlg = createLoadFile();
		      L_dlg.addFilter( _T( "PLC Files(*.plc)" ), _T( "*.plc" ) );
		      L_dlg.addFilter( _T( "All Files" ), _T( "*.*" ) );
		      L_dlg.activeFilter( 0 );
		      filePath = L_dlg.showDialog();
		      if(!filePath.empty())
		      {
		          std::fstream sfs(filePath.c_str());
		          if(!sfs)return;
		          sfs.seekg (0, ios::end);
		          len = sfs.tellg();
		          sfs.seekg (0, ios::beg);
		          buf = new char[len];
		          sfs.read(buf, len);
		          file_data=string(buf);
		          delete []buf;
		          sfs.close();
		          
		          //m_edit1->setText(file_data);		      
		      }		        
}

void SWMainForm::OnSaveFile()
{
     WidgetSaveFile S_dlg;
     SmartUtil::tstring filePath;
     std::fstream sfs;
     int len;
     char* buf;
     SmartUtil::tstring file_data;
     S_dlg = createSaveFile();
		       S_dlg.addFilter( _T( "PLC Files(*.plc)" ), _T( "*.plc" ) );
		       S_dlg.addFilter( _T( "All Files" ), _T( "*.*" ) );
		       S_dlg.activeFilter( 0 );
		       
		       filePath = S_dlg.showDialog();
		       if(!filePath.empty())
		       {		         
		           if(filePath.find(".plc")==-1&&filePath.find(".PLC")==-1)filePath+=".plc";  
                   sfs.open(filePath.c_str(), ios_base::out);
                   if(!sfs)return;
		           //file_data=m_edit1->getText();
		           sfs.write(file_data.c_str(), file_data.size());   
		           sfs.close();
		        }
}

//endregion
void SWMainForm::paint(Canvas  &  c)
{

        //img1.Show(hDC,340,95,451,263);
        RECT pDstRect={40,100,40+420,280};
		     img1.DrawToHDC(hDC,&pDstRect);

        
    UpdateCanvas uc( this );
    SmartWin::Rectangle rect(r.l, r.t, r.w+5, r.h+5 );
	uc.rectangle( rect );
	for(int i=1;i<samplenum;i++)
    {
        uc.line(r.x+i-1,r.y-output[i-1]*200,r.x+i,r.y-output[i]*200);
        uc.line(r.x+i-1+1,r.y-output[i-1]*200+1,r.x+i+1,r.y-output[i]*200+1);
        uc.line(r.x+i-1,r.y-output[i-1]*200+1,r.x+i,r.y-output[i]*200+1);
    }
        
    for(int i=0;i<13;i++)
    {
        uc.extTextOut(boost::lexical_cast<std::string>(i*20),r.x-25,r.y-i*20-5);
    }
	
}


void SWMainForm::OnButton1(WidgetButtonPtr widgetparam)
{ 
    if(widgetparam->getText()=="启动")
    {
	    b_PID_isrun=true;  
	    widgetparam->setText("停止");    
	}
	else
	{
	     b_PID_isrun=false;  
	    widgetparam->setText("启动");  
	}
	
	if(b_PID_isrun)
	{
        i_PID_out_point=0;        
        
        PID_Init();
        int PID_delay=100;
        Command com ( _T( "Run" ) );
	    createTimer( & SWMainForm::timer_PID_Run, PID_delay, com );
	}
}
void SWMainForm::PID_Init()
{

    kp=boost::lexical_cast<double>(m_edit2->getText());
    ki=boost::lexical_cast<double>(m_edit3->getText());
    kd=boost::lexical_cast<double>(m_edit4->getText());
    num2=boost::lexical_cast<double>(m_edit5->getText());
    num3=boost::lexical_cast<double>(m_edit6->getText());
    num4=boost::lexical_cast<double>(m_edit7->getText());
    den2=boost::lexical_cast<double>(m_edit8->getText());
    den3=boost::lexical_cast<double>(m_edit9->getText());
    den4=boost::lexical_cast<double>(m_edit10->getText());
    //double set=boost::lexical_cast<double>(m_edit1->getText());
    //input=set/200;
    double set=boost::lexical_cast<double>(slider1->getPosition());
    input=(256-set)/200;
    samplenum=0;
    for(int i=0;i<PID_out_buf_MAX;i++)output[i]=0.0;
    ts=boost::lexical_cast<double>(m_edit11->getText());
    u1=0.0;
    u2=0.0;
    u3=0.0;
    uk=0.0;
    y11=0.0;
    y2=0.0;
    y3=0.0;
    yk=0.0;
    x1=0.0;
    x2=0.0;
    x3=0.0;
    error=0.0;
    error1=0.0;
}
void SWMainForm::timer_PID_Run( const CommandPtr & cmd )
{
	if(samplenum<PID_out_buf_MAX-10)	
	{
	    samplenum++;
	}
	else
	{
	    samplenum=0;
	//    PID_Init();
	    // b_PID_isrun=false;  
	    //button1->setText("启动");  
	}
	
	pidproc();
	PID_Draw();
	if(b_PID_isrun)
	{	
	    int PID_delay=100;
        Command com ( _T( "Run" ) );
	    createTimer( & SWMainForm::timer_PID_Run, PID_delay, com );
	}
}

void SWMainForm::PID_Draw()
{	
	UpdateCanvas uc( this );	
	
	if(samplenum<2)
	{
	    SmartWin::Rectangle rect(r.l, r.t, r.w+5, r.h+5 );
	    uc.rectangle( rect );
	}
	else
	{ 
        uc.line(r.x+samplenum-1,r.y-output[samplenum-1]*200,r.x+samplenum,r.y-output[samplenum]*200);
        uc.line(r.x+samplenum-1+1,r.y-output[samplenum-1]*200+1,r.x+samplenum+1,r.y-output[samplenum]*200+1);
        uc.line(r.x+samplenum-1,r.y-output[samplenum-1]*200+1,r.x+samplenum,r.y-output[samplenum]*200+1);
	}
	
}


void SWMainForm::pidproc()
{
    uk=kp*x1+kd*x2+ki*x3;
    if(uk>=10)uk=10;
    if(uk<-10)uk=-10;
    yk=-(den2*y11)-(den3*y2)-(den4*y3)+(num2*u1)+(num3*u2)+(num4*u3);
    error=input-yk;
    u3=u2;
    u2=u1;
    u1=uk;
    y3=y2;
    y2=y11;
    y11=yk;
    x1=error;
    x2=(error-error1)/ts;
    x3=x3+error*ts;
    error1=error;
    output[samplenum]=yk;    
}



void SWMainForm::OnButton2(WidgetButtonPtr widgetparam)
{
    double set=boost::lexical_cast<double>(m_edit1->getText());
    input=set/200;
    slider1->setPosition(256-set);
}


void SWMainForm::OnSlider1(WidgetSliderPtr widgetparam)
{
     double set=boost::lexical_cast<double>(slider1->getPosition());
     m_edit1->setText(boost::lexical_cast<std::string>(256-set));
     input=(256-set)/200;
}


void SWMainForm::OnButton3(WidgetButtonPtr widgetparam)
{
        m_edit2->setText(_T("0.5"));
        m_edit3->setText(_T("0.001"));
        m_edit4->setText(_T("0.001"));
        m_edit5->setText(_T("0.0097"));
        m_edit6->setText(_T("0.0344"));
        m_edit7->setText(_T("0.0078"));
        m_edit8->setText(_T("-2.4386"));
        m_edit9->setText(_T("2.0848"));
        m_edit10->setText(_T("-0.6461"));
        m_edit11->setText(_T("0.005"));
}

⌨️ 快捷键说明

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