📄 measure.c
字号:
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 + -