📄 flux_pca.c
字号:
//为了显示脉冲,使用延时
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 + -