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

📄 measure.c

📁 著名的CS5463抄表模块
💻 C
📖 第 1 页 / 共 4 页
字号:
    
	InitCom(&sComm,18000000,INT_MODE_RX);
    sComm.byCommNo=2;  //485
    InitCom(&sComm,18000000,INT_MODE_RX);    
}
void Ledwhile(void)
{
		while(1)
	{
	    Delay(10);
		pgsFPort1->regOutClr = P25;
		Delay(10);
		pgsFPort1->regOutSet = P25;
	}
}
void TestAdc5463(void)
{
 extern BYTE flag;	
extern BYTE flag_int ;
extern BYTE flag_w;
extern BYTE flag_int_w ;
     DWORD dwTemp;
     if(flag_int ==3)
     {
        
        dwTemp =3;
         PrintHex((BYTE*)&dwTemp,1);
         flag_int =0;
     }
 
     else if(flag_int_w ==4)
     {
         dwTemp = 4;
         PrintHex((BYTE*)&dwTemp,1);
         flag_int_w =0;
     }
     if(flag==2)
     {
         dwTemp = 2;
         PrintHex((BYTE*)&dwTemp,1);
         flag =0;
     }
 
}
void ProAdcCal(void)
{
  //  #define DEBUG_ADCCAL
    DWORD dwTemp;
    SADCoef sADCoef[4];
    BYTE i;
   	if(GetUp(0)==1  )//用户按下了上翻屏键,需要进行标定流程
	{	
	   LoadParam((DWORD)&p_gcSysParam->sADCoef[0],(BYTE*)&sADCoef[0],sizeof(SADCoef)*4);
	   AdcVoltCal(sADCoef,4);
	         
	   #ifdef DEBUG_ADCCAL 
	  	 Print("11111");
	  	 for(i=0; i<4; i++)
	  	 {
	   		  dwTemp = sADCoef[i].dwVACOffset;
			  WriteCom(0,(BYTE*)&dwTemp,4);
			  dwTemp = sADCoef[i].dwVACGain;
		 	  WriteCom(0,(BYTE*)&dwTemp,4);
			  dwTemp = sADCoef[i].dwIACOffset;
			  WriteCom(0,(BYTE*)&dwTemp,4);
		 	  dwTemp = sADCoef[i].dwIACGain;
		 	  WriteCom(0,(BYTE*)&dwTemp,4);
	  	 }
	   #endif 
	}
}
extern void TestAdcNoCom(void);
//判断是否需要重新初始化计量结构;当参数改变时需要重新装载参数
void ProcessChangeParam(SMeasureStat *psMeasureStat,SMeterParam *pMeterParam)
{
   //当计量的参数被修改时,常见的方式时 重新启动终端,进行计量统计结构的重新初始化
   //这里,当计量参数被修改时,判断是否修改然后再判断是否进行初始化
    BYTE byTemp;
    DWORD dwTemp;
    BYTE byArray[24];
    BYTE byFlag =0;
    BYTE i;
    LoadParam((DWORD)&p_gcSysParam->sMeterParam.byDemandInterval,(BYTE*)&byTemp,sizeof(BYTE));
    if(byTemp != pMeterParam->byDemandInterval) //需量周期被改变
         byFlag = 1;
    if(!byFlag)
    {
        LoadParam((DWORD)&p_gcSysParam->sMeterParam.bySlidingTime,(BYTE*)&byTemp,sizeof(BYTE));
        if(byTemp != pMeterParam->bySlidingTime) //滑差时间被改变
          byFlag = 1;
     }
     if(!byFlag)//费率被改变,在计量初始时会判断到其改变,结构不需要重新初始化
     {
       /* LoadParam((DWORD)&p_gcSysParam->sMeterParam.byTimeTable,(BYTE*)&byArray[0],sizeof(BYTE)* 24);
        for(i=0; i<24; i++)
        {
          if( byArray[i] != pMeterParam->byTimeTable[0][i])
          {
            byFlag = 1;
            break;
          }
        }
        */
     }    
     LoadParam((DWORD)&p_gcSysParam->sMeterParam,(BYTE*)pMeterParam,sizeof(SMeterParam));//装载参数
     if(byFlag)//计量参数被修改
     {
         InitMeasureStat(0, psMeasureStat, pMeterParam);//初始化计量统计结构
	     InitDayMeasureState(psMeasureStat, pMeterParam);//初始化天计量统计结构
     }       
     if(g_bTimeChange) //终端的时间被改变
     {
         psMeasureStat->bySaveFlag = 0;
		 extern BOOL bSaveCurveFalg;
		 bSaveCurveFalg =0;
         g_bTimeChange = 0;
     }
	 if( g_bParamMeterFlag & (P3|P4))//AD的参数被修改
	 {
         TestAdcNoCom();//重新初始化AD
	 }
}

extern BYTE flag;	/*mod,lyq,2007-03-07, 希望变量定义时,能从名称看出实际用途*/
extern BYTE flag_int;
extern BYTE flag_int_w ;
extern DWORD iTimerCnt;
extern BYTE byException ;
extern BYTE byFreezeFreq;
static SMeasureStat g_sMeasureStat;

/***************计量任务***************/
void MeasureTask(void*pdata)
{
    DWORD dwRunTicks;      //运行灯的tick计数,一秒钟闪烁2次
	DWORD dwTemp;
//	SMeterParam sMeterParam;
	BYTE cArray[5]={0x30,0x31,0x32,0x33,'\0'};
//    BYTE str[]={"\nUUUUU"};
    DWORD byFlag =4;
    InitCom0();  
//	TestYx();
   // TestAdc_5460();
//	InitAdc_cs5460();
    // WriteCom(0,(BYTE*)&byFlag,1);
   /* while(1)
    {
     // WriteCom(0,str,6);
    //  byFlag = strlen(cArray);
    //  WriteCom(0,(BYTE*)&byFlag,1);
    //  byFlag = strlen(cArray);
   //   WriteCom(0,(BYTE*)&byFlag,1);
      Print(cArray);
      Led(10,100000);
      OSTimeDly(10);
    }*/
   // Print("000");
	InitParamFile();//初始化参数文件
    CheckParamFlag();
  //  Print("111");
   // WriteCom(0,(BYTE*)&byFlag,1);
    InitYx();
    InitYK();
    ProAdcCal();//判断AD是否需要标定
	InitPulse();//初始化脉冲处理
	g_bParamMeterFlag = FALSE;
//	Print("222");
   /* while(1)
    {
       WriteCom(0,(BYTE*)&byFlag,1);
       OSTimeDly(10);
        Led(10,100000);
    }*/
    CreateEventFile(); ////事件记录数据文件
	CreateMeasureFile();//创建电能和最大需量的文件;
//	Print("11111");
	CreateVoltageFile(); 
  //  Print("11111");
	CreateTransFile();//配变统计数据文件
	CreatePQFile();//创建电能质量数据文件
//	Print("333");
    CreateCurveFile();  //负荷曲线记录数据文件
	ReadFile(CURVE_FILE, 0, &byFreezeFreq, sizeof(BYTE)); //读取存储密度
//	Print("444");
	InitMeasureStat(1, &g_sMeasureStat, &g_sSysParam.sMeterParam);//初始化计量统计结构
	InitDayMeasureState(&g_sMeasureStat, &g_sSysParam.sMeterParam);//初始化天计量统计结构

    TestAdcNoCom();//初始化AD
    
    Print("555");
    WriteCom(0,&g_sSysParam.sRestrict.iValueCoef[0],2);
    WriteCom(0,&g_sSysParam.sRestrict.iValueCoef[1],2);
    WriteCom(0,&g_sSysParam.sRestrict.iHRCoef[0],2);
    WriteCom(0,&g_sSysParam.sRestrict.iHRCoef[0],2);    
    dwRunTicks = OSTimeGet();
    RUN_RPO(&dwRunTicks);
//	InitAdc_cs5460();
    while(1)
	{   
	 //  if(GetKey(-1))
	   //  TestAdc();
	    GetTime(&g_sMeasureStat.sCurDateTime);  
	  //  OSTimeDly(10);
		if(g_bParamMeterFlag) 
		{ 
            ProcessChangeParam(&g_sMeasureStat, &g_sSysParam.sMeterParam);
		    g_bParamMeterFlag = FALSE;
         //  LoadParam((DWORD)&p_gcSysParam->sMeterParam,(BYTE*)&sMeterParam,sizeof(SMeterParam)); 
		}
		
		LedPulse(&g_sMeasureStat,&g_sSysParam.sMeterParam); //脉冲是否输出、脉冲处理
        OSTimeDly(1); //must not change this line
        
		ProAutoSwitch(&g_sMeasureStat,&g_sSysParam.sMeterParam); //判断是否需要自动切换备用时段费率,并切换
		
        if(g_iAdcPulseUpdateFlag == 1)//数据就绪
		{
           g_iAdcPulseUpdateFlag = 0;  //清数据就绪标志
           CalSumEnergy(&g_sMeasureStat);//计算各项总电能
           	LedPulse(&g_sMeasureStat,&g_sSysParam.sMeterParam); //脉冲是否输出、脉冲处理
           OSTimeDly(1); //must not change this line
		   CalRateEnergy(&g_sMeasureStat, &g_sSysParam.sMeterParam);//计算当前费率的各项电能
		   memcpy32((DWORD*)&g_sMeasureStat.sLastEneryCnt,(DWORD*)&g_sEneryCnt,sizeof(SEnergyCnt)/4); //
	       memcpy32((DWORD*)&g_sMeasureStat.sLastEnergy,(DWORD*)&g_sEnergy,sizeof(SEnergy)/4); //
		}//if
		if(g_bClearEnergy)
		{
		   Clear_Init_MeasureData(&g_sMeasureStat,&g_sSysParam.sMeterParam);
		   g_bClearEnergy = FALSE;
		}
		if(g_bInitDayMeasure)
		{
		    g_bInitDayMeasure = FALSE;
		    InitDayMeasureState(&g_sMeasureStat, &g_sSysParam.sMeterParam);//初始化天计量统计结构
		}//if  
		
		LedPulse(&g_sMeasureStat,&g_sSysParam.sMeterParam); //脉冲是否输出、脉冲处理
        OSTimeDly(1); //must not change this line
        
		CalMaxDemand(&g_sMeasureStat,&g_sSysParam.sMeterParam);//计算各项最大需量
		
        LedPulse(&g_sMeasureStat,&g_sSysParam.sMeterParam); //脉冲是否输出、脉冲处理
        OSTimeDly(1); //must not change this line
        
		if( IsSaveMeasureData(&g_sMeasureStat,&g_sSysParam.sMeterParam) )//抄表日到,
		{
           SaveMeasureDatas(&g_sMeasureStat);//保存电能数据,最大需量及其发生时间
		   ClearMonthMaxDemand(&g_sMeasureStat,&g_sSysParam.sMeterParam);//最大i需量清零
		}//if
		
		if(g_bNeedClearMaxDemand)
		{
           ClearCurMaxDemand(&g_sMeasureStat,&g_sSysParam.sMeterParam);
           g_bNeedClearMaxDemand =0;   //add zhw 2007-4-13
		}
		
		LedPulse(&g_sMeasureStat,&g_sSysParam.sMeterParam); //脉冲是否输出、脉冲处理
        OSTimeDly(1); //must not change this line
        if(g_sMeasureStat.sCurDateTime.bySecond ==0)
        {  //Led(10,100000);
          if(byFlag==0)
           {
              Print("333");		   
              dwTemp = CheckStack(OS_STK_RS485A,500);
			  WriteCom(0,(BYTE*)&dwTemp, sizeof(DWORD));
			  
			  dwTemp = CheckStack(OS_STK_INFRARED,500);
			  WriteCom(0,(BYTE*)&dwTemp, sizeof(DWORD));
			  
			   dwTemp = CheckStack(DispTaskStack,500);
			  WriteCom(0,(BYTE*)&dwTemp, sizeof(DWORD));
			  
			  dwTemp = CheckStack(MeasureTaskStack,320);
			  WriteCom(0,(BYTE*)&dwTemp, sizeof(DWORD));
			  dwTemp = CheckStack(VoltageTaskStack,500);
			  WriteCom(0,(BYTE*)&dwTemp, sizeof(DWORD));
			//  dwTemp = CheckStack(TestTaskStack,500);
			//  WriteCom(0,(BYTE*)&dwTemp, sizeof(DWORD));
			  WriteCom (0,(BYTE*)&g_sPowerQuality.wHRIa[0],2);
			  WriteCom (0,(BYTE*)&g_sPowerQuality.wIa1,2);
			  dwTemp  = sizeof(SSysParam);
			  WriteCom(0,(BYTE*)&dwTemp, sizeof(DWORD));
			 
			 //  WriteCom (0,&g_sPowerQuality.wTHDua,2);
			// WriteCom(0,(BYTE*)&g_sRealVal.iTemperature,4); 
			// WriteCom(0,(BYTE*)&g_sRealVal.iDCValue,4);
 //    WriteCom(0,(BYTE*)&i,4);
             // WriteCom(0,(BYTE*)&g_sRealCode.dwUb,4);
             // WriteCom(0,(BYTE*)&g_sRealCode.dwUc,4);
              byFlag = 1;
           }
        }
        else byFlag =0;
         YxPro();  //
         RUN_RPO(&dwRunTicks);
      // Print("6666");
      // OSTimeDly(100);
        //TestAdc5463();
    }//while
}

⌨️ 快捷键说明

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