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

📄 flux_pca.c

📁 一个流量控制仪器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
                //为了显示脉冲,使用延时
                ucFluxPulseComing = FluxPulseComingDelay;
        }

}



/*******************************************************************
		流量计脉冲计数器复位函数
函数原型: void fnReset_FluxPulseCounter(bit bIFFluxPositiveTemp);
功能: 	流量计脉冲计数器复位函数

参数:bit bIFFluxPositive
	0	负流量
	1	正流量

********************************************************************/

void fnReset_FluxPulseCounter(bit bIFFluxPositiveTemp)
{
        //1.	计数器暂停
        FluxPulseCounterDisable;

        //2.	计数器清零
        
        //流量计复位掉电确认,只使用一次!!!复位后自动允许
        if(bFluxResetEnable == 1)
        {
        	ulFluxPulse = 0;
        	
        	ulFluxPulseLast = 0;
        }
        else
        {
        	bFluxResetEnable = 1;
        	
        	//默认掉电复位的第一次流速统计是不正确的!
        	ulFluxPulseLast = ulFluxPulse;
        }

        //3.	所有流量计相关变量初始化。
        bFluxLimitOver = 0;     //默认值 流量未到达

        bIFFluxPositive = bIFFluxPositiveTemp;    

        ucFluxPulseComing = 0;
        
        lFluxRemainInt = 0;
        ucFluxRemainDec = 0;
        
        //流速初始化
        ulFluxVelocity = 0;
        ulFluxVelocityInt = 0;
        ucFluxVelocityDec = 0;

        //流量计相关存储数据读入
        fnRead_FluxPulseCounterData();

        
        
}


/*******************************************************************
		检查是否当天过去,并保存当天最大流速
函数原型: void fnCheck_TodayFluxV()
********************************************************************/
void fnCheck_TodayFluxV()
{
	//uchar i;
	
		//检查是否当天已经过去(月、日)
		/*if ((uc7_RECFluxVelocityMaxDateTime_Today[6]!= uc8_SystemDateTime[6])|
				(uc7_RECFluxVelocityMaxDateTime_Today[5]!= uc8_SystemDateTime[5]))
		{
			//记录已经过去的当天最大流量和时间->L4
			fnWrite_SystemRecord4(ulRECFluxVelocityMax_Today, uc7_RECFluxVelocityMaxDateTime_Today);
			
			//当天最大流速清零
			ulRECFluxVelocityMax_Today = 0;
			
			//记录新的当天时间
			for(i=1;i++;i<7)
				uc7_RECFluxVelocityMaxDateTime_Today[i] = uc8_SystemDateTime[i];
			
		}*/
		;
}

/*******************************************************************
		流量计运行函数(正负流量)
函数原型: void	fnRun_Flux();

功能:
1.	脉冲到来的显示
2.	剩余水量计算(正负流量)
3.	流速计算
4.	流量统计(最大、最小的历史记录)
5.	流速统计(最大、最小的历史记录)

********************************************************************/

void	fnRun_Flux()
{
        uchar ucFluxComputeTemp;
        
        ulong ulFluxTemp;
        
        //使用临时变量代替ulFluxPulse
       	//防止出现中断冲突!
       	
       	//计数器暂停
			  EC=0;
			  
       	ulFluxTemp = ulFluxPulse;

       	//计数器运行
			  EC=1;

        //1.	脉冲到来的显示
        if (ucFluxPulseComing != 0)
        {
                ucFluxPulseComing --;
                
                //流量计脉冲到来的显示
                fnSet_DisplayLED(6,1,1);        //设置第六位LED显示不闪烁
        }
        else
                fnSet_DisplayLED(6,0,1);        //设置第六位LED不显示


        //2.	剩余水量计算
        if ( bFluxLimitOver == 0 )

				if(bIFFluxPositive)
				{
						//正流量
						//lFluxRemainInt = ( (ulong)uiFluxLimit * uiFluxPulsePerTonWater - ulFluxPulse ) % uiFluxPulsePerTonWater * 10;
        	lFluxRemainInt = ( ulFluxTemp % uiFluxPulsePerTonWater ) * 10;
        	ucFluxRemainDec = ( lFluxRemainInt  / uiFluxPulsePerTonWater ) * 10 ;
        	ucFluxRemainDec += ( lFluxRemainInt  % uiFluxPulsePerTonWater ) * 10 / uiFluxPulsePerTonWater;

                lFluxRemainInt = uiFluxLimit - ulFluxTemp / uiFluxPulsePerTonWater;

		
									if(lFluxRemainInt > 0)
                	if (ucFluxRemainDec != 0)
                	{
                		ucFluxRemainDec = 100 - ucFluxRemainDec;
                		lFluxRemainInt --;
                	}

                //判断流量到达
                
                if (ulFluxTemp >= (ulong)uiFluxLimit * uiFluxPulsePerTonWater)
                {
                        bFluxLimitOver = 1;
                        lFluxRemainInt = 0;
                        ucFluxRemainDec = 0;
                }

        }
        else
        {
        	//负流量
					//lFluxRemainInt = ( (ulong)uiFluxLimit * uiFluxPulsePerTonWater - ulFluxPulse ) % uiFluxPulsePerTonWater * 10;
        	lFluxRemainInt = ( ulFluxTemp % uiFluxPulsePerTonWater ) * 10;
        	ucFluxRemainDec = ( lFluxRemainInt  / uiFluxPulsePerTonWater ) * 10 ;
        	ucFluxRemainDec += ( lFluxRemainInt  % uiFluxPulsePerTonWater ) * 10 / uiFluxPulsePerTonWater;


                lFluxRemainInt =  ulFluxTemp / uiFluxPulsePerTonWater - (long)uiFluxLimit * ucFluxLimit_Negative / 10;

                ucFluxComputeTemp = (ulong)uiFluxLimit * ucFluxLimit_Negative % 10 * 10;
		
								//if(lFluxRemainInt < 0)
                //还是有问题:X.00附近!!

                if ( ucFluxComputeTemp < ucFluxRemainDec )
                {
                       ucFluxRemainDec = ucFluxComputeTemp - ucFluxRemainDec;
                        lFluxRemainInt ++;
                }
                else
                { 
                        ucFluxRemainDec = ucFluxComputeTemp - ucFluxRemainDec;
                }
                /*
                if (ucFluxComputeTemp == 0 )
                	if (ucFluxRemainDec != 0)
                	{
                		ucFluxRemainDec = (long)uiFluxLimit * ucFluxLimit_Negative % 10 * 100 - ucFluxRemainDec;
                		lFluxRemainInt ++;
                	}
                */
                //判断流量到达
                if (ulFluxTemp >= (ulong)uiFluxLimit * uiFluxPulsePerTonWater * ucFluxLimit_Negative / 10 )
                {
                        bFluxLimitOver = 1;
                        lFluxRemainInt = 0;
                        ucFluxRemainDec = 0;
                }
      
        }


        //3.	流速计算
        //每过uiFluxVelocityTime统计一次流量
        
        if ( fnBitTest( ucTurnSecT , 4 ) )
        {
        	ucTurnSecT = fnBitClr( ucTurnSecT , 4 );
        	
        	uiFluxVelocityTimeS++;
        	
        	if(uiFluxVelocityTimeS >= uiFluxVelocityTime)
        	{
        		uiFluxVelocityTimeS = 0;
        		
        		//统计流速
        		
        		//防止流速计算越界!
        		if(ulFluxTemp >= ulFluxPulseLast)
        		{
        			ulFluxVelocity = ulFluxTemp - ulFluxPulseLast;
        		}
        		else
        		{
        			ulFluxVelocity = 0xFFFFFFFF - ulFluxPulseLast + ulFluxTemp;
        		}
        		
        		ulFluxPulseLast = ulFluxTemp;
        		
        		//脉冲流速单位换算
        		ulFluxVelocityInt = ( ulFluxVelocity % uiFluxPulsePerTonWater ) * 10;
        		ucFluxVelocityDec = ( ulFluxVelocityInt  / uiFluxPulsePerTonWater ) * 10 ;
        		ucFluxVelocityDec += ( ulFluxVelocityInt  % uiFluxPulsePerTonWater ) * 10 / uiFluxPulsePerTonWater;

						ulFluxVelocityInt = ulFluxVelocity / uiFluxPulsePerTonWater;
						
						
						//检查是否最大流速!
						if (ulRECFluxVelocityMax < ulFluxVelocity)
						{
							//记录最大流速(当前时间/日期)
							fnWrite_SystemRecord3(1, ulFluxVelocity);
							
							ulRECFluxVelocityMax = ulFluxVelocity;
						}
						

						
						//检查是否当天最大流速
						//if (ulRECFluxVMax_Today < ulFluxVelocity)
						//{					
							//以防万一,先检查是否今天已过!保存昨天的数据		
						//	fnCheck_TodayFluxV();
							
						//	ulRECFluxVMax_Today = ulFluxVelocity;
							
							//记录时间
						//	for(ucFluxComputeTemp=1;ucFluxComputeTemp++;ucFluxComputeTemp<7)
						//		uc7_RECFluxVMaxDT_Today[ucFluxComputeTemp] = uc8_SystemDateTime[ucFluxComputeTemp];
							
						//}					
 		
        	}
        }
        
}

⌨️ 快捷键说明

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