📄 voltage.c
字号:
//(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 + -