257 lines
7.6 KiB
C
257 lines
7.6 KiB
C
#include "../main/SystemInclude.h"
|
||
//==============================================================================
|
||
u16 calibTANode[CURVE_DATA_MAX];
|
||
u16 calibTAVal[CURVE_DATA_MAX], curveTANum;
|
||
u16 resFactor,temperatureFactor;
|
||
|
||
/******************************************************************************/
|
||
void TemperatureCorrectInit(void)
|
||
{
|
||
//------------------------------------------------------------------------------
|
||
temperatureFactor = (u16)ReadParameterFromMemory(TEMP_FACTOR, TEMP_FACTOR_WIDTH, TEMP_FACTOR_DEFAULT);
|
||
resFactor = (u16)ReadParameterFromMemory(RES_FACTOR, RES_FACTOR_WIDTH, RES_FACTOR_DEFAULT);
|
||
}
|
||
|
||
/******************************************************************************/
|
||
void TemperatureCorrection(void)
|
||
{
|
||
float tempF;
|
||
|
||
#ifndef TEMP_CORR_USE_RR
|
||
#pragma message("[undefined] TEMP_CORR_USE_RR")
|
||
#elif(TEMP_CORR_USE_RR)
|
||
// currentFlowRate = ((RH-RHROOM)*temperatureFactor*currentFlowRate)/(RHROOM*resFactor)
|
||
// resFactor: default 0.0030 --->30
|
||
// temperatureFactor: default 0.0030 --->30
|
||
// tmpSLA = (signed long int)voltageDetected[NRR];
|
||
// tmpSLA -= (signed long int)NRHRoom;
|
||
// tmpSLA *= (signed long int)temperatureFactor;
|
||
// tmpSLA *= (signed long int)10000;
|
||
//
|
||
// tmpSLB = (signed long int)NRHRoom;
|
||
// tmpSLB *= (signed long int)resFactor;
|
||
// tmpSLA /= tmpSLB;
|
||
// tmpSLA += (signed long int)10000;
|
||
|
||
#ifndef ENABLE_MULTI_PONIT_TA_CORR
|
||
#pragma message("[undefined] ENABLE_MULTI_PONIT_TA_CORR")
|
||
#elif(ENABLE_MULTI_PONIT_TA_CORR)
|
||
tmpSLB = (signed long int)GetTACurveValue(voltageDetected[CTYPE_FR]);
|
||
#else
|
||
tmpSLB = (signed long int)NRHRoom;
|
||
#endif
|
||
|
||
if((tmpSLB > NRR_MAX) || (tmpSLB < NRR_MIN))
|
||
{
|
||
voltageDetected[TCOE] = 10000;
|
||
return;
|
||
}
|
||
|
||
tmpSLA = (signed long int)voltageDetected[NRR];
|
||
tmpSLA -= (signed long int)tmpSLB;
|
||
tmpSLA *= (signed long int)temperatureFactor;
|
||
tmpSLA *= (signed long int)10000;
|
||
|
||
tmpSLB *= (signed long int)resFactor;
|
||
tmpSLA /= tmpSLB;
|
||
tmpSLA += (signed long int)10000;
|
||
//------------------------------------------------------------------------------
|
||
#else
|
||
//------------------------------------------------------------------------------
|
||
#ifndef ENABLE_MULTI_PONIT_TA_CORR
|
||
#pragma message("[undefined] ENABLE_MULTI_PONIT_TA_CORR")
|
||
#elif(ENABLE_MULTI_PONIT_TA_CORR)
|
||
tmpSLB = (signed long int)GetTACurveValue(voltageDetected[CTYPE_FR]);
|
||
#else
|
||
tmpSLB = (signed long int)calibTemperature;
|
||
#endif
|
||
|
||
if((tmpSLB > 13500) || (tmpSLB < 11000))
|
||
{
|
||
voltageDetected[TCOE] = 10000;
|
||
return;
|
||
}
|
||
|
||
#ifndef TEMP_CORR_USE_TA
|
||
#pragma message("[undefined] TEMP_CORR_USE_TA")
|
||
#elif(TEMP_CORR_USE_TA)
|
||
tmpSLA = (signed long int)voltageDetected[TPCB];
|
||
#else
|
||
tmpSLA = (signed long int)voltageDetected[TGAS];
|
||
#endif
|
||
|
||
tmpSLA -= tmpSLB;
|
||
tmpSLA *= (signed long int)temperatureFactor;
|
||
tmpSLA /= (signed long int)100;
|
||
tmpSLA += (signed long int)10000;
|
||
#endif
|
||
//------------------------------------------------------------------------------
|
||
|
||
if(tmpSLA > 12000) tmpSLA = 12000;
|
||
else if(tmpSLA < 8000) tmpSLA = 8000;
|
||
voltageDetected[TCOE] = (unsigned int)tmpSLA;
|
||
tempF = (float)tmpSLA;
|
||
tempF /= (float)10000;
|
||
tempF *= (float)currentFlowRate;
|
||
|
||
currentFlowRate = (unsigned long int)tempF;
|
||
}
|
||
|
||
//******************************************************************************
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽ڵ<DFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
||
u8 ReadTACurveNodeAndValue(u16 I)
|
||
{
|
||
ReadMultiByteFromEEPROM(TACURVE_DATA_BASE + I * TACURVE_DATA_WIDTH, tempDev.Byte, TACURVE_DATA_WIDTH, PARA_EEPROM);
|
||
if(tempDev.Byte[TACURVE_DATA_CRC] == CRC8(tempDev.Byte, TACURVE_DATA_CRC))
|
||
{
|
||
tempDev.Byte[TACURVE_DATA_CRC] = 0;
|
||
|
||
calibTAVal[I] = tempDev.Word[0];
|
||
calibTANode[I] = tempDev.Word[1];
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
calibTAVal[I] = 0;
|
||
calibTANode[I] = 0;
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
//******************************************************************************
|
||
//Ĭ<>ϵĶ<CFB5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD><DFB2><EFBFBD>
|
||
void DefaultTACuvre(void)
|
||
{
|
||
curveTANum = 5;
|
||
calibTANode[0] = 0;
|
||
calibTANode[1] = 5000;
|
||
calibTANode[2] = 10000;
|
||
calibTANode[3] = 15000;
|
||
calibTANode[4] = 20000;
|
||
|
||
calibTAVal[0] = 0;
|
||
calibTAVal[1] = 0;
|
||
calibTAVal[2] = 0;
|
||
calibTAVal[3] = 0;
|
||
calibTAVal[4] = 0;
|
||
}
|
||
|
||
//******************************************************************************
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD><DFB2><EFBFBD>
|
||
void RetriveTACurve(void)
|
||
{
|
||
ReadMultiByteFromEEPROM(TACURVE_NUM, tempL.Byte, TACURVE_NUM_WIDTH, PARA_EEPROM);
|
||
if(tempL.Byte[1] != CRC8(tempL.Byte, 1)) goto RetResetCurve;
|
||
|
||
curveTANum = tempL.Byte[0];
|
||
if((curveTANum > CURVE_DATA_MAX)||(curveTANum < 3)) goto RetResetCurve;
|
||
|
||
for(unsigned char I = 0; I < curveTANum; I++) ReadTACurveNodeAndValue(I);
|
||
return;
|
||
|
||
RetResetCurve:
|
||
DefaultTACuvre();
|
||
return;
|
||
}
|
||
|
||
//******************************************************************************
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||
u16 GetTACurveValue(u16 calibIndex)
|
||
{
|
||
u16 I;
|
||
|
||
if((curveTANum < 3) || (curveTANum > CURVE_DATA_MAX))
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
for(I = 0; I < curveTANum - 1; I++)
|
||
{
|
||
if(calibTANode[I] > 32767) continue;
|
||
if(calibTANode[I] > calibIndex) break;
|
||
}
|
||
|
||
if(I == 0) return calibTAVal[0];
|
||
|
||
Secondary.NodeX = calibIndex;
|
||
if(calibTANode[I] > 32767) Secondary.NodeH = 0;
|
||
else Secondary.NodeH = calibTANode[I];
|
||
if(calibTANode[I-1] > 32767) Secondary.NodeL = 0;
|
||
else Secondary.NodeL = calibTANode[I-1];
|
||
|
||
Secondary.ValueH = calibTAVal[I];
|
||
Secondary.ValueL = calibTAVal[I-1];
|
||
|
||
return SecondaryCompute();
|
||
|
||
}
|
||
|
||
/******************************************************************************/
|
||
void ReadCurveByCom(void)
|
||
{
|
||
u16 I;
|
||
|
||
I = MBBuf.StartAddr;
|
||
I -= INT_CURVE_NODE1;
|
||
I /= INT_CURVE_WIDTH;
|
||
|
||
MBBuf.RxPointer[MBBuf.Index++] = 0;
|
||
MBBuf.RxPointer[MBBuf.Index++] = 0;
|
||
if(calibType == INTCMD_1ST_TABLE) {
|
||
tempL.Word[1] = calibTANode[I];
|
||
tempL.Word[0] = calibTAVal[I];
|
||
}
|
||
else if(calibType == INTCMD_2ND_TABLE) {
|
||
tempL.Word[1] = ATypeNode[I];
|
||
tempL.Word[0] = ATypeVal[I];
|
||
}
|
||
|
||
MBBuf.RxPointer[MBBuf.Index++] = tempL.Byte[3];
|
||
MBBuf.RxPointer[MBBuf.Index++] = tempL.Byte[2];
|
||
MBBuf.RxPointer[MBBuf.Index++] = tempL.Byte[1];
|
||
MBBuf.RxPointer[MBBuf.Index++] = tempL.Byte[0];
|
||
|
||
MBBuf.DataByte = CURVE_DATA_WIDTH;
|
||
ModbusVariablePointerDec();
|
||
}
|
||
|
||
/******************************************************************************/
|
||
void WriteCurveByCom(void)
|
||
{
|
||
MBBuf.DataByte = CURVE_DATA_WIDTH;
|
||
if(MBBuf.ByteNumber < MBBuf.DataByte)
|
||
{
|
||
MBBuf.ByteNumber = 0;
|
||
MBBuf.BusError = ILLEGAL_DATA_VALUE;
|
||
return;
|
||
}
|
||
|
||
u16 I;
|
||
|
||
I = MBBuf.StartAddr;
|
||
I -= INT_CURVE_NODE1;
|
||
I /= INT_CURVE_WIDTH;
|
||
|
||
tempDev.Byte[5] = MBBuf.RxPointer[MBBuf.Index++];
|
||
tempDev.Byte[4] = MBBuf.RxPointer[MBBuf.Index++];
|
||
tempDev.Byte[3] = MBBuf.RxPointer[MBBuf.Index++];
|
||
tempDev.Byte[2] = MBBuf.RxPointer[MBBuf.Index++];
|
||
tempDev.Byte[1] = MBBuf.RxPointer[MBBuf.Index++];
|
||
tempDev.Byte[0] = MBBuf.RxPointer[MBBuf.Index++];
|
||
|
||
tempDev.DWord[1] = 0;
|
||
if(calibType == INTCMD_1ST_TABLE)
|
||
{
|
||
WriteParameterToEEPROM(TACURVE_DATA_BASE+I*TACURVE_DATA_WIDTH, TACURVE_DATA_WIDTH);
|
||
calibTANode[I] = tempDev.Word[1];
|
||
calibTAVal[I] = tempDev.Word[0];
|
||
}
|
||
else if(calibType == INTCMD_2ND_TABLE)
|
||
{
|
||
WriteParameterToEEPROM(ATYPECURVE_DATA_BASE+I*ATYPECURVE_DATA_WIDTH, ATYPECURVE_DATA_WIDTH);
|
||
ATypeNode[I] = tempDev.Word[1];
|
||
ATypeVal[I] = tempDev.Word[0];
|
||
}
|
||
}
|
||
|