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

📄 outctrltempthread.cpp

📁 高精度控温算法,使用PID控制思想
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    if(TempDeviate<=12*TempDeviateWave && TempDeviate>2*TempDeviateWave)/////80%~45%//80%+20%
    {
        CycleWork=CycleWorkDefault;
        count_i=0;
        if(TempDeviateDifferentialValid>0)
        {
            proportion = I_two*TempDeviate + P_two_positive*TempDeviateDifferentialValid + Cobble_two;
        }
        else
        {
            proportion = I_two*TempDeviate + P_two_negative*TempDeviateDifferentialValid + Cobble_two;
        }
        ///////////////
//        printf("%lf\n",proportion);/////////////////////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////
//        fprintf(fp,"%4d ",count_record);
//        fprintf(fp,"%0 .4f\n",proportion);
        /////////////////////////////////////
        DelayPlanningSign=0;
        ///////////////
        if(proportion>0&& proportion<0.9)
        {
            CycleWorkOccupy=int (proportion*CycleWork*CaiWenJianGe);           if(CycleWorkOccupy==0)        	{        	CycleWork=2;        	}            return;
        }
        if(proportion>0.9 && proportion<=1)
        {
            CycleWorkOccupy=int (0.9*CycleWork*CaiWenJianGe);return;
        }
        if(proportion>1)
        {
            CycleWorkOccupy=int (CycleWork*CaiWenJianGe);return;
        }
        if(proportion<0)
        {
            CycleWorkOccupy=0;CycleWork=2;return;
        }
        ////////////////////
    }
    if(TempDeviate<=2*TempDeviateWave && TempDeviate>revision*TempDeviateWave)//////50%~20%//55%+40%+5%
    {
        CycleWork=CycleWorkDefault;
        count_i=0;
        TempDeviateLast=TempDeviate;
        if(TempDeviateDifferentialValid>0)
        {
            proportion = I_three*TempDeviate + P_three_positive*TempDeviateDifferentialValid
                + D_three*TempDeviateDifferentialVariance + Cobble_three;
        }
        else
        {
            proportion = I_three*TempDeviate + P_three_negative*TempDeviateDifferentialValid
                + D_three*TempDeviateDifferentialVariance + Cobble_three;
        }
 //       printf("%lf\n",proportion);///////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////
 //       fprintf(fp,"%4d ",count_record);
 //       fprintf(fp,"%0 .4f\n",proportion);
        ///////////////////////////////////////
        DelayPlanningSign=0;
        ///////////////
        if(proportion>0 && proportion<0.7)
        {
            CycleWorkOccupy=int (proportion*CycleWork*CaiWenJianGe);        	if(CycleWorkOccupy==0)        	{        	CycleWork=2;        	}            return;
        }
        if(proportion>0.7 && proportion<=0.8)
        {
            CycleWorkOccupy=int (0.7*CycleWork*CaiWenJianGe);return;
        }
        if(proportion>0.8 && proportion<=0.9)
        {
            CycleWorkOccupy=int (0.8*CycleWork*CaiWenJianGe);return;
        }
        if(proportion>0.9)
        {
            CycleWorkOccupy=int (0.9*CycleWork*CaiWenJianGe);return;
        }
        if(proportion<=0)
        {
            CycleWorkOccupy=0;CycleWork=2;return;/////////////
        }
    }
    if(TempDeviate<=revision*TempDeviateWave && TempDeviate>-revision*TempDeviateWave)//////15%~5%//30%+60%+10%
    {
        count_i=0;
        ///////////////
        if(TempDeviateDifferentialValid>=0)
        {
            proportion = I_four*TempDeviate + P_four_positive*TempDeviateDifferentialValid
                + D_four*TempDeviateDifferentialVariance + Cobble_four;
        }
        else
        {
            proportion = I_four*TempDeviate + P_four_negative*TempDeviateDifferentialValid
                + D_four*TempDeviateDifferentialVariance + Cobble_four;
        }
//        printf("%lf\n",proportion);///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////
//        fprintf(fp,"%4d ",count_record);
//        fprintf(fp,"%0 .4f\n",proportion);
        //////////////////////////////////////
        if(proportion>0.05)
        {
            CycleWorkOccupy=regular;
        }
        else
        {
            CycleWorkOccupy=0;
        }
        ////////////
        if(CycleWorkOccupy==regular)
        {
            CycleWork=CycleWorkChange;
            if(TempDeviateDifferentialValid>=0)
            {
                DelayPlanningSign=1;
            }
            else
            {
                DelayPlanningSign=0;
            }
        }
        else
        {
            CycleWork=2;
            DelayPlanningSign=0;
        }
        ////////////
        if(TempDeviateLast<=2*TempDeviateWave && TempDeviateLast>revision*TempDeviateWave)
        {
            revision=0.4f;
        }
        if(TempDeviateLast<=0.3*TempDeviateWave && TempDeviateLastLast<=0.3*TempDeviateWave &&
            TempDeviateLastLastLast<=0.3*TempDeviateWave)
        {
            revision=0.3f;
        }
        TempDeviateLastLastLast=TempDeviateLastLast;
        TempDeviateLastLast=TempDeviateLast;
        TempDeviateLast=TempDeviate;
        return;
    }
    if(TempDeviate<=-revision*TempDeviateWave)//////////////////////////0%
    {
        count_i=0;
        CycleWorkOccupy=0;
        CycleWork=2;
        TempDeviateLastLastLast=TempDeviateLastLast;
        TempDeviateLastLast=TempDeviateLast;
        TempDeviateLast=TempDeviate;
        return;
    }
}
#define PT_EVT(x) {CKYEVT data(x,0); \(m_calorimeter.GetEventQueue()).Push(data);}void COutCtrlTempThread::CKYSleep( int nSeconds ){	for( int i = 0; i < nSeconds; i ++ )	{		if( m_bExitFlag )		{			//add code here, and run the clear action of exit.			m_calorimeter.OutsideBarrelCycle( false );			m_calorimeter.PotHeatFull( false );					if( m_hInsideTemp != NULL )				fclose( m_hInsideTemp );			if( m_hOutsideTemp != NULL )				fclose( m_hOutsideTemp );						CExperimentData &expData = m_calorimeter.GetExperimentData();			PT_EVT( SUB_CTRL_TEMP_BEGIN );			expData.InvalidateCtrlTempTime();						ExitThread();  //Halt;		}		sleep( 1 );	}}

void COutCtrlTempThread::run( void ){	//m_calorimeter.SwitchOnMixer( true ); //	CExperimentData &expData = m_calorimeter.GetExperimentData();		expData.EnableCtrlTempTime();	PT_EVT( SUB_CTRL_TEMP_BEGIN );		TempAim = expData.GetOutCtrlTemp();	/**/	int mSave = 0;		m_hInsideTemp = fopen( "/usr/sd/insideTemp.txt", "a+" );	m_hOutsideTemp = fopen( "/usr/sd/outsideTemp.txt", "a+" );
	/**/	if( m_hInsideTemp == NULL || m_hOutsideTemp == NULL )	{		printf( "create file insideTemp.txt or outsideTemp.txt fail!\n" );
		CExperimentData &expData = m_calorimeter.GetExperimentData();
		PT_EVT( SUB_CTRL_TEMP_BEGIN );
		expData.InvalidateCtrlTempTime();
		
		ExitThread();  		//return;	}
		//m_calorimeter.OutsideBarrelCycle( true );	sleep(5);		char szBuffer[ 100 ];	float dInsideTemp=0.0, dOutTemp=0.0,TempDe=0.0,TempDelast = 0.0f;	int nCounter = 0,OutLevel=0,InLevel=0;	
	//time_t c_start, c_end;  //
		while( true )	{	/////////////////////////////////////////////////////////////
		//CKYSleep( 1 );		dOutTemp = m_calorimeter.ReadOutsideBarrelTemperature();//		dOutTemp = Temp;
		TempDe = TempAim - dOutTemp;		if( TempDe > 1.2f )		{
			InLevel=0;
			if(OutLevel==0)
			{
				TempDelast=TempDe;
			}
			OutLevel++;
			if(OutLevel>=45)
			{
				OutLevel=0;
				if(TempDelast-TempDe<0.015f)
				{
					//add code here, and run the clear action of exit.
					m_calorimeter.OutsideBarrelCycle( false );
					m_calorimeter.PotHeatFull( false );
		
					if( m_hInsideTemp != NULL )
						fclose( m_hInsideTemp );
					if( m_hOutsideTemp != NULL )
						fclose( m_hOutsideTemp );
			
					CExperimentData &expData = m_calorimeter.GetExperimentData();
					PT_EVT( SUB_CTRL_TEMP_BEGIN );
					expData.InvalidateCtrlTempTime();
			
					//ExitThread();  //Halt;
				}
				TempDelast=TempDe;
			}
			//m_calorimeter.PotHeatFull( true );		}		else		{
			if(TempDe<=1.2 && TempDe>0.6)
			{
				OutLevel=0;
				if(InLevel==0)
				{
					TempDelast=TempDe;
				}
				InLevel++;
				if(InLevel>=90)
				{
					InLevel=0;
					if(TempDelast-TempDe<0.01f)
					{
						//add code here, and run the clear action of exit.
						m_calorimeter.OutsideBarrelCycle( false );
						m_calorimeter.PotHeatFull( false );
		
						if( m_hInsideTemp != NULL )
							fclose( m_hInsideTemp );
						if( m_hOutsideTemp != NULL )
							fclose( m_hOutsideTemp );
			
						CExperimentData &expData = m_calorimeter.GetExperimentData();
						PT_EVT( SUB_CTRL_TEMP_BEGIN );
						expData.InvalidateCtrlTempTime();
			
						//ExitThread();  //Halt;
					}
					TempDelast=TempDe;
				}
			}
			else
			{
				OutLevel=0;
				InLevel=0;
			}
			nCounter ++;			nCounter = Mathematical(nCounter,TempDe,TempAim);
	        if(nCounter < CycleWorkOccupy)
			{
				//m_calorimeter.PotHeatPart( true );
	        }
	        else
	        {
				m_calorimeter.PotHeatPart( false );
	        }		}		///////////////////////////////////////////////////////////		dInsideTemp= m_calorimeter.ReadInsideBarrelTemperature();		if( mSave >= 5 )		{
			mSave = 0;						double dTherTemp = m_calorimeter.ReadThermostatTemperature();			struct tm *newtime; 				time_t long_time; 			time( &long_time );            			newtime = localtime( &long_time ); 					sprintf( szBuffer,  "  %02d:%02d:%02d		%.4f	%.4f	%.4f\r\n", 					 newtime->tm_hour,					 newtime->tm_min,					 newtime->tm_sec, dInsideTemp, dOutTemp, dTherTemp );			fwrite( szBuffer, 1, strlen( szBuffer ),  m_hInsideTemp );					}		mSave++;
		CKYSleep( 1 );
				m_calorimeter.ReadThermostatTemperature();		m_calorimeter.ReadEnviromentTemperature();	}}

⌨️ 快捷键说明

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