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

📄 voltage.c

📁 应用与电网中电压合格率的统计。经过现场的投运使用
💻 C
📖 第 1 页 / 共 4 页
字号:
	//(0,y1),(500,y2) ;  y = kx+b = (y2-y1)*x/(x2-x1) +y1;这里500对应5.00V,0对应0V;y1,y2为AD在0V和5v时的AD值
	// 所以x = (y-y1)*(x2-x1) / (y2-y1);
    g_sRealVal.iDCValue = ((float)iValue[0] - psCs5460Coef->dw0Value )*500.0 /((float)psCs5460Coef->dw5Value - (float)psCs5460Coef->dw0Value); 
//	WriteCom(0,(BYTE*)&g_sRealVal.iDCValue,4);
//	WriteCom(0,(BYTE*)&iValue[0],4);
 //   WriteCom(0,(BYTE*)&psCs5460Coef->dw0Value,4);
//	    WriteCom(0,(BYTE*)&psCs5460Coef->dw5Value,4); 
    // (x-x1) /(y-y1) = (x2-x)/(y2-y)  => x = ( x2*(y1-y) + x1*(y-y2) ) /(y1-y2);
    iValue[1] =  100.0 * (psCs5460Coef->dw200Real * ((float)psCs5460Coef->dw100Value - (float)iValue[1] )  + (float)(psCs5460Coef->dw100Real *((float)iValue[1] - (float)psCs5460Coef->dw200Value) )) / ((float)psCs5460Coef->dw100Value - (float)psCs5460Coef->dw200Value);
  //  iValue[1] = 100.0 * (200.0 * ((float)psCs5460Coef->dw100Value - (float)iValue[1] ) + (float)(100.0*((float)iValue[1] - (float)psCs5460Coef->dw200Value) )) / ((float)psCs5460Coef->dw100Value - (float)psCs5460Coef->dw200Value);
    g_sRealVal.iTemperature = FindPt100Value(iValue[1]);
 //    WriteCom(0,(BYTE*)&iValue[1],4); 
  //    WriteCom(0,(BYTE*)&g_sRealVal.iTemperature,4); 
}
const WORD TablePt[40][10] = {  //系数100
		{8804,8764,8724,8684,8644,8604,8563,8523,8483,8443},  //-30度
		{9204,9164,9124,9084,9044,9004,8964,8924,8884,8844},  //-20度
		{9603,9563,9523,9483,9443,9403,9363,9324,9284,9244},  //-10度
		{10000,9960,9921,9881,9841,9801,9762,9722,9682,9642}, //-0度
		{10000,10040,10079,10119,10159,10198,10238,10278,10317,10357}, //0度
		{10396,10436,10475,10515,10554,10594,10633,10673,10712,10752}, //10度
		{10791,10831,10870,10910,10949,10988,11028,11067,11107,11146}, //20度
		{11185,11225,11264,11303,11343,11382,11421,11460,11500,11539},//30度
		{11578,11617,11657,11696,11735,11774,11813,11852,11891,11931},//40度
		{11970,12009,12048,12087,12126,12165,12204,12243,12282,12321},//50度
		{12360,12399,12438,12477,12516,12555,12594,12633,12672,12710},//60度
		{12749,12788,12827,12866,12905,12944,12982,13021,13060,13099},//70度
		{13137,13176,13215,13254,13292,13331,13370,13408,13447,13488},//80度
		{13524,13563,13602,13640,13679,13717,13756,13794,13832,13872},//90度
		{13910,13949,13987,14026,14064,14102,14141,14179,14218,14266},//100度
		{14295,14333,14371,14410,14448,14486,14525,14563,14601,14640},//110度
		{14678,14716,14755,14793,14831,14869,14907,14946,14984,15022},//120度
		{15060,15098,15137,15175,15213,15251,15289,15327,15365,15403},//130度
		{15441,15479,15517,15555,15593,15631,15669,15707,15745,15783},//140度
		{15821,15859,15897,15935,15973,16011,16049,16086,16125,16162},//150度
		{16200,16238,16276,16313,16351,16389,16427,16464,16500,16540},//160度
		{16578,16616,16653,16691,16728,16765,16803,16841,16870,16910},//170度
		{16954,16991,17029,17057,17104,17142,17179,17217,17250,17292},//180度
		{17329,17367,17404,17441,17479,17516,17554,17591,17620,17666},//190度
		{17703,17740,17778,17815,17852,17890,17927,17964,18000,18039},//200度
		{18076,18113,18151,18188,18225,18262,18299,18336,18370,18411},//210度
		{18448,18485,18522,18559,18596,18633,18670,18707,18740,18781},//220度
		{18818,18855,18892,18929,18966,19003,19040,19077,19110,19151},//230度
		{19188,19224,19261,19298,19335,19372,19409,19445,19480,19519},//240度
		{19556,19592,19629,19666,19703,19739,19776,19813,19850,19886},//250度
		{19923,19950,19990,20033,20069,20106,20142,20179,20210,20252},//260度
		{20289,20325,20362,20398,20435,20471,20508,20544,20580,20611},//270度
		{20653,20690,20726,20763,20799,20835,20872,20908,20940,20981},//280度
		{21017,21053,21089,21126,21162,21198,21234,21271,21300,21343},//290度
		{21379,21415,21451,21488,21524,21560,21596,21632,21660,21704},//300度
		{21740,21776,21812,21849,21885,21921,21957,21993,22020,22064},//310度
		{22100,22136,22172,22208,22244,22280,22316,22352,22380,22423},//320度
		{22459,22495,22531,22567,22602,22638,22674,22710,22746,22781},//340度
		{22817,22853,22888,22924,22960,22995,23031,23067,23102,23138},//350度
		{23173,23209,23245,23280,23316,23351,23387,23422,23450,23493},//360度
};
INT32 FindPt100Value(INT32 iValue)
{
	int i;
	int j;
	INT32 iTempX1;
	INT32 iTempX2;
	INT32 iTempY1;
	INT32 iTempY2;
    BYTE flag=0;
	//************当前的PT值对应的温度位于 零下时
	if(iValue <=TablePt[3][0]  && iValue >=TablePt[0][9] ) 
	{
		for(i=0; i<4; i++)
		{
           for(j=9; j>=0; j--)
		   {
              if(iValue <= TablePt[i][j] ) 
		      {
		         flag = 1;
		         break;
		      }
		   }
		   if(flag == 1)break;
		}
        if(iValue == TablePt[i][j] ) 
		{
			return (-(3-i)*1000 - j*100);  //
		}
		else
		{
			// (y-y1) /(x-x1) = (y2-y)/(x2-x)  => y = ( y2*(x1-x) + y1*(x-x2) ) /(x1-x2);
			iTempX2 = TablePt[i][j];
			iTempY2 = (-(3-i)*1000 - j*100);
			if(j == 9)
			{
                i --;
				j = 0;
			}
			else j++;
            iTempX1 = TablePt[i][j];
			iTempY1 = (-(3-i)*1000 - j*100);
			return (iTempY2 *(iTempX1 - iValue) + (iTempY1*(iValue - iTempX2))) / (iTempX1 - iTempX2);
		}
	}
    //**********当前的PT值对应的温度位于 零上时
    flag = 0;
    if(iValue <=TablePt[39][9]  && iValue >=TablePt[4][0] ) 
    {
	   for(i=4; i<40; i++)
	   {
			for(j=0; j<10; j++)
			{
				if(iValue <=TablePt[i][j] ) 
				{
					flag = 1;
					break;
				}
			}
			if(flag == 1)break;
	   }
	}
	if(flag == 1)
	{
		if(iValue == TablePt[i][j] ) 
		{
			return (i-4)*1000 + j*100;
		}
		else
		{
            iTempX2 = TablePt[i][j];
			iTempY2 = (i-4)*1000 + j*100;
			if(j == 0)
			{
                i --;
				j = 9;
			}
			else j--;
			iTempX1 = TablePt[i][j];
			iTempY1 = (i-4)*1000 + j*100;
			return (iTempY2 *(iTempX1 - iValue) + (iTempY1*(iValue - iTempX2))) / (iTempX1 - iTempX2);
		}
	}
}
//************负荷曲线处理*******************
BOOL bSaveCurveFalg = 0;
void CurveDataProcess(BYTE *pFreezeFreq)
{
//	static BYTE bLoad = FALSE;
//	static BYTE byFreezeFreq = 1; //默认15分钟
	int ltemp;
	BYTE i;
	SDateTime sTime;
	STime4  sTime4;
	WORD wTemp;
	DWORD dwTemp;
	SLoadCurve sLoadCurve;
    BYTE byInterval[4] = {0, 15, 30, 0};
	/*if(g_bParamCurveFlag)
	{
        g_bParamCurveFlag = FALSE;
	//	LoadParam((INT32)&p_gcSysParam->sRestrict.byFreezeFreq[0], &byFreezeFreq,sizeof(BYTE));
		ReadFile(CURVE_FILE, 0, pFreezeFreq, sizeof(BYTE)); //读取存储密度
	}
	*/
    wTemp =  *pFreezeFreq; //mode zhw 2007-3-13
    i =  wTemp;
    if(wTemp >3 || wTemp==0)return;//保存间隔 单位分钟  0表示不冻结
    wTemp = byInterval[wTemp];  
 	GetTime(&sTime);
    if(   (i==1 && ((sTime.byMinute == 15) || (sTime.byMinute == 30) ||(sTime.byMinute == 45) ||(sTime.byMinute == 0)))
		||(i==2 && ((sTime.byMinute == 30) ||(sTime.byMinute == 0)))
		||(i==3 && (sTime.byMinute ==0))
      )
    {
		if(bSaveCurveFalg == 1)
		   return;
		else
		{
		   //Print("222222");
		   sTime4.byMinute = sTime.byMinute;
		   sTime4.byHour = sTime.byHour;
		   sTime4.byDay = sTime.byDay;
		   sTime4.byMonth = sTime.byMonth;
		   sLoadCurve.sTime.byMinute = sTime.byMinute;
		   sLoadCurve.sTime.byHour = sTime.byHour;
		   sLoadCurve.sTime.byDay = sTime.byDay;
		   sLoadCurve.sTime.byMonth = sTime.byMonth;
		   
		    /*dwTemp = sLoadCurve.sTime.byMonth;
		    PrintHex((BYTE*)&dwTemp,1);
		    dwTemp = sLoadCurve.sTime.byDay;
		    PrintHex((BYTE*)&dwTemp,1);
		    dwTemp = sLoadCurve.sTime.byHour;
		    PrintHex((BYTE*)&dwTemp,1);
		    dwTemp = sLoadCurve.sTime.byMinute;
		    PrintHex((BYTE*)&dwTemp,1);
		          */
           memcpy32((DWORD*)&sLoadCurve.sEnergy,(DWORD*)&g_sEnergy,sizeof(SEnergy)/4);
		   memcpy32((DWORD*)&sLoadCurve.sRealVal, (DWORD*)&g_sRealVal,sizeof(SRealVal)/4);
		   if(SaveCurveData(&sTime4,&sLoadCurve))
		   {
		     
		   }
           bSaveCurveFalg = 1;
		}
	}
	else
	{
		bSaveCurveFalg =0 ;
	}
}

void InitVoltagePro(void)
{
	BYTE i;
	SDateTime sTime;
    GetTime(&sTime);
    if(!CreateVoltageFile())
	{ //	Ledwhile();
		for (i=0;  i<MAX_LU_NUM;  i++)
		{
			if (
				 g_sVoltageCompute.dwTimeCnt[i] > 1440 || g_sVoltStat.dwUperT[i]+g_sVoltStat.dwLower[i]+g_sVoltStat.dwGoodT[i] > g_sVoltageCompute.dwTimeCnt[i]
			   )//清除异常情况的数据
			{
                 g_sVoltageCompute.dwTimeCnt[i] =0;
				 g_sVoltStat.dwLower[i] = 0;
                 g_sVoltStat.dwUperT[i] = 0;
				 g_sVoltStat.dwGoodT[i] = 0;
				 g_sVoltStat.dwMaxU[i] = 0;
				 g_sVoltStat.dwMaxT[i] = 0;
				 g_sVoltStat.dwMinU[i] = 0;
				 g_sVoltStat.dwMinT[i] = 0;
				 g_sVoltStat.dwAvgU[i] = 0;
			}//if()
		/*	if (monData[i].totalMin > 1440*31 || monData[i].upMin+monData[i].downMin+monData[i].okMin > monData[i].totalMin
				|| monData[i].upRate + monData[i].downRate + monData[i].okRate >10000 )
			{
				memset(&monData[i], 0, sizeof(STAT_DATA));
				SaveFram(monData[i], &monData[i]);
			}//if()
			*/
		//	memcpy(&ram_Data.sLastSamTime[0],&g_sVoltageCompute.sLastSamTime[i],sizeof(SDateTime));
			//重启时判断
	      if(i==0)
	      {
	         ram_Data.sLastSamTime.wYear = g_sVoltageCompute.sLastSamTime.dwYear ;
	         ram_Data.sLastSamTime.byMonth = g_sVoltageCompute.sLastSamTime.dwMonth;
	         ram_Data.sLastSamTime.byDay = g_sVoltageCompute.sLastSamTime.dwDay ;
      	     ram_Data.sLastSamTime.byHour = g_sVoltageCompute.sLastSamTime.dwHour; 
	         ram_Data.sLastSamTime.byMinute= g_sVoltageCompute.sLastSamTime.dwMinute;
             ram_Data.sLastSamTime.bySecond = g_sVoltageCompute.sLastSamTime.dwSecond ;
           	if (   sTime.byDay != ram_Data.sLastSamTime.byDay
	            || sTime.wYear != ram_Data.sLastSamTime.wYear
		        || sTime.byMonth != ram_Data.sLastSamTime.byMonth
	           )
	          {
				// Print("66666");
	             //SaveDayData(&g_sVoltStat, &ram_Data.sLastSamTime[0],&ram_Data.sLastSamTime[0]);
	            // SaveTransData(&ram_Data.sLastSamTime[0],&sTime);//保存配变统计的数据
	             g_sVoltageCompute.dwTimeCnt[0] = 0 ;
                 g_sVoltageCompute.dwTimeCnt[1] = 0 ;
                 g_sVoltageCompute.dwTimeCnt[2] = 0 ;
                 g_sVoltageCompute.dwU[0] = 0 ;
                 g_sVoltageCompute.dwU[1] = 0 ;       
                 g_sVoltageCompute.dwU[2] = 0 ;
                 g_sVoltageCompute.sLastSamTime.dwYear = sTime.wYear;
	             g_sVoltageCompute.sLastSamTime.dwMonth = sTime.byMonth;
	             g_sVoltageCompute.sLastSamTime.dwDay = sTime.byDay;
	             g_sVoltageCompute.sLastSamTime.dwHour = sTime.byHour;
	             g_sVoltageCompute.sLastSamTime.dwMinute = sTime.byMinute;
                 g_sVoltageCompute.sLastSamTime.dwSecond = sTime.bySecond;	 
	          }
			}//if
		}
	}
	else //数据文件不存在
	{
	    
	}			
	//Print("22222");
}
extern void TestYx(void);
extern void ProHarmonic(SRestrict *psRestrict);
extern void InitHarmonic(void);
void RUN_RPO(DWORD *pdwRunTicks)  //运行灯处理函数
{
       //运行灯的tick计数,一秒钟闪烁2次
     if( (OSTimeGet() - (*pdwRunTicks)   ) <=  OS_TICKS_PER_SEC /4)
     {
         RUN_OFF();
     }
     else if( (OSTimeGet() - (*pdwRunTicks) ) >  OS_TICKS_PER_SEC /4 
                &&  (OSTimeGet() - *pdwRunTicks ) <= OS_TICKS_PER_SEC/2
            )
     {
         RUN_ON() ;
     }
     else if((OSTimeGet() - (*pdwRunTicks) ) <=  OS_TICKS_PER_SEC *3/4 
         && (OSTimeGet() - *pdwRunTicks ) > OS_TICKS_PER_SEC/2
         )
     {
        RUN_OFF();
       
     }
    else if((OSTimeGet() - (*pdwRunTicks) ) >  OS_TICKS_PER_SEC *3/4
         && (OSTimeGet() - *pdwRunTicks ) <= OS_TICKS_PER_SEC
         )
     {
         RUN_ON() ;     
     }
     else 
     {
       *pdwRunTicks = OSTimeGet() ;
       RUN_OFF();
     }
}
//*****************统计任务主函数****************************
BYTE byFreezeFreq;  //读取存储密度
void VoltageTask(void)
{
    DWORD dwADErrorTicks;  //AD异常的tick计数,异常时间为5秒

   	OSTimeDly(50); 
   	LoadParam((DWORD)&p_gcSysParam->sRestrict, (BYTE*)&g_sSysParam.sRestrict, sizeof(SRestrict)); 
   	LoadParam((DWORD)&p_gcSysParam->sCs5460Coef, (BYTE*)&g_sSysParam.sCs5460Coef, sizeof(SCs5460Coef)); 

    InitVoltagePro();   //合格率文件创建及初始化 
	InitState(&g_sSysParam.sRestrict);//

	g_dwParamUpdateFlag = 0;

	OSTimeDly(60); //延时500ms主要是因为AD的第一次转换的数据不正确,延时后把g_iAdcUpdateFlag=0,
	g_iAdcUpdateFlag = 0;
	InitHarmonic();
    dwADErrorTicks = OSTimeGet();
  
	while(1)
	{
	  //  GetTime(&sTime);
	    if(g_iAdcUpdateFlag == 1)  //AD 数据就绪
		{  
		   dwADErrorTicks = OSTimeGet();
           g_iAdcUpdateFlag = 0;
           ProADData(&g_sSysParam.sCs5460Coef); //工程化数据
		   g_bAdcUpdate_VoltageFlag  = TRUE; //通知电压合格率模块,工程数据就绪
		   g_bAdcUpdate_EventFlag = TRUE; //通知事件管理模块,工程数据就绪
		}
		if(OSTimeGet() - dwADErrorTicks > 5* OS_TICKS_PER_SEC)  //5秒内未AD数据就绪
		{
             dwADErrorTicks = OSTimeGet();
			 TestAdcNoCom();//重新初始化AD
			 Print("3366");
		}
		OSTimeDly(4);
		if(g_iAdcWaveUpdateFlag==0 && byStartWaveSample==0)//波形数据OK
		{
		   byStartWaveSample =1;
		}
		else if( g_iAdcWaveUpdateFlag == 1)
		{
		   g_iAdcWaveUpdateFlag = 0;
		   ProHarmonic(&g_sSysParam.sRestrict);//谐波分析计算
		   byStartWaveSample = 1;
		}
		if(g_dwParamUpdateFlag >0) //参数更改
		{ 	   
			LoadParam( (DWORD)&p_gcSysParam->sRestrict, (BYTE*)&g_sSysParam.sRestrict, sizeof(SRestrict)); 
		    if(g_dwParamUpdateFlag & (P1|P3|P4))  
		       g_bParamMeterFlag =  P1|P3|P4;
		    if(g_dwParamUpdateFlag & P31)
		       g_bTimeChange = TRUE;   //通知计量模块,时间被修改
		     g_dwParamUpdateFlag = 0;
		}
		OSTimeDly(4);  
   	    VoltageGrade(&g_sSysParam.sRestrict); //电压合格率统计
     
		CurveDataProcess(&byFreezeFreq); //负荷曲线处理
		OSTimeDly(4);
     //   EventState(&g_sSysParam.sRestrict);  // 事件记录
      //  OSTimeDly(2);
   }//while
}

⌨️ 快捷键说明

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