2026-03-20 21:16:58 +08:00
|
|
|
|
#include "../main/SystemInclude.h"
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
|
2026-03-20 21:16:58 +08:00
|
|
|
|
static s16 GasAnalysisCNT;
|
|
|
|
|
|
u16 ATypeNode[CURVE_DATA_MAX], ATypeVal[CURVE_DATA_MAX], curveATypeNum;
|
|
|
|
|
|
bool isCurrentGas;
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
void GasAnalysisParameterInit(void)
|
|
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
VHHParameterAir = (u16)ReadParameterFromMemory(VHH_AIR_PARA, VHH_AIR_PARA_WIDTH, RH_PARA_DEFAULT);
|
|
|
|
|
|
VHHParameterScale = (u16)ReadParameterFromMemory(VHH_PARA_SCALE, VHH_PARA_SCALE_WIDTH, 1000);
|
2026-03-20 21:16:58 +08:00
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef ENABLE_GAS_RECOGNITION_TABLE
|
|
|
|
|
|
#pragma message("[undefined] ENABLE_GAS_RECOGNITION_TABLE")
|
|
|
|
|
|
#elif(ENABLE_GAS_RECOGNITION_TABLE)
|
|
|
|
|
|
ReadVHHCurveFromMemory();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef ENABLE_DENSITY_DETECT
|
|
|
|
|
|
#pragma message("[undefined] ENABLE_DENSITY_DETECT")
|
|
|
|
|
|
#elif(ENABLE_DENSITY_DETECT)
|
2026-03-20 21:19:04 +08:00
|
|
|
|
densityFSParameter = (u16)ReadParameterFromMemory(DENSITY_FS_PARA, DENSITY_FS_PARA_WIDTH, DENSITY_FS_PARA_DEFAULT);
|
2026-03-20 21:16:58 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
2026-03-20 21:19:04 +08:00
|
|
|
|
unsigned int ComputeZeroVHH(void)
|
2026-03-20 21:16:58 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
tmpSLA = (unsigned long int)voltageDetected[RRRES];
|
|
|
|
|
|
tmpSLA -= (unsigned long int)NRHRoom;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
tmpSLB = (unsigned long int)VHHHigh;
|
|
|
|
|
|
tmpSLB -= (unsigned long int)VHHLow;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
tmpSLA *= tmpSLB;
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
tmpSLB = (unsigned long int)NRHHigh;
|
|
|
|
|
|
tmpSLB -= (unsigned long int)NRHLow;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
tmpSLA /= tmpSLB;
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
tmpSLA += (unsigned long int)VHHRoom;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
return (unsigned int)tmpSLA;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
bool GasAnasisOneTime(void)
|
|
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
signed int valueTemp;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
valueTemp = (signed int)(voltageDetected[VHPA] - VHHParameterAir);
|
|
|
|
|
|
if(abs(valueTemp) < VHHParameterScale) return 1;
|
|
|
|
|
|
else return 0;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
void GasAnasisCompute(void)//
|
|
|
|
|
|
{
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
voltageDetected[CVHHX] = ComputeZeroVHH();
|
|
|
|
|
|
voltageDetected[DVHHX] = WordSubFunction(voltageDetected[IVHDX], voltageDetected[CVHHX]);
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
#ifndef ENABLE_GAS_RECOGNITION_TABLE
|
|
|
|
|
|
#pragma message("[undefined] ENABLE_GAS_RECOGNITION_TABLE")
|
|
|
|
|
|
#elif(ENABLE_GAS_RECOGNITION_TABLE)
|
|
|
|
|
|
voltageDetected[VHPA] = FindVHHInCalibCurve(voltageDetected[RGIDX]);
|
|
|
|
|
|
#else
|
2026-03-20 21:19:04 +08:00
|
|
|
|
voltageDetected[VHPA] = (unsigned int)GetFlowRate(voltageDetected[REG_INDEX], ATYPE_VH);
|
2026-03-20 21:16:58 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
voltageDetected[VHPA] = WordSubFunction(voltageDetected[DVHHX], voltageDetected[VHPA]);
|
|
|
|
|
|
voltageDetected[VHPA] = MovingAverage(voltageDetected[VHPA], 5, VHPA);
|
|
|
|
|
|
VHHParameter = voltageDetected[VHPA];
|
|
|
|
|
|
|
|
|
|
|
|
if((VHHParameter < 32780) & (VHHParameter > 32700)) //32700-32780
|
|
|
|
|
|
{
|
|
|
|
|
|
GasAnalysisCNT--;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
if(GasAnasisOneTime()) GasAnalysisCNT--;
|
|
|
|
|
|
else GasAnalysisCNT++;
|
|
|
|
|
|
|
|
|
|
|
|
if(GasAnalysisCNT > 3)
|
|
|
|
|
|
{
|
|
|
|
|
|
systemAlarm.Bit.GasChange = 1; //<2F><><EFBFBD>ʸı<CAB8>
|
|
|
|
|
|
GasAnalysisCNT = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(GasAnalysisCNT < -3)
|
|
|
|
|
|
{
|
|
|
|
|
|
systemAlarm.Bit.GasChange = 0;
|
|
|
|
|
|
GasAnalysisCNT = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
void ReadVHHCurveFromMemory(void)
|
|
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
unsigned int I;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
curveATypeNum = (unsigned int)ReadParameterFromMemory(ATYPECURVE_NUM, ATYPECURVE_NUM_WIDTH, ATYPECURVE_NUM_DEFAULT);
|
2026-03-20 21:16:58 +08:00
|
|
|
|
for(I=0; I<curveATypeNum; I++)
|
|
|
|
|
|
{
|
|
|
|
|
|
ReadMultiByteFromEEPROM(ATYPECURVE_DATA_BASE + I * ATYPECURVE_DATA_WIDTH, tempDev.Byte, ATYPECURVE_DATA_WIDTH, PARA_EEPROM);
|
|
|
|
|
|
if(tempDev.Byte[ATYPECURVE_DATA_CRC] == CRC8(tempDev.Byte, ATYPECURVE_DATA_CRC))
|
|
|
|
|
|
{
|
|
|
|
|
|
tempDev.Byte[ATYPECURVE_DATA_CRC] = 0;
|
|
|
|
|
|
ATypeNode[I] = tempDev.Word[1];
|
|
|
|
|
|
ATypeVal[I] = tempDev.Word[0];
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ATypeVal[I] = 0;
|
|
|
|
|
|
ATypeVal[I] = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
2026-03-20 21:19:04 +08:00
|
|
|
|
unsigned int FindVHHInCalibCurve(unsigned int calibIndex)
|
2026-03-20 21:16:58 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
unsigned int I;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
|
|
|
|
|
|
if((curveATypeNum < 3) || (curveATypeNum > CURVE_DATA_MAX))
|
|
|
|
|
|
{
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
if(calibIndex > 32767) calibIndex = 0;
|
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
for(I = 0; I < curveATypeNum - 1; I++)
|
|
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
if(ATypeNode[I] > 32767) continue;
|
2026-03-20 21:16:58 +08:00
|
|
|
|
if(ATypeNode[I] > calibIndex) break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
if(I == 0) return ATypeVal[0];
|
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
Secondary.NodeX = calibIndex;
|
2026-03-20 21:19:04 +08:00
|
|
|
|
if(ATypeNode[I] > 32767) Secondary.NodeH = 0;
|
|
|
|
|
|
else Secondary.NodeH = ATypeNode[I];
|
2026-03-20 21:16:58 +08:00
|
|
|
|
if(ATypeNode[I-1] > 32767) Secondary.NodeL = 0;
|
|
|
|
|
|
else Secondary.NodeL = ATypeNode[I-1];
|
|
|
|
|
|
|
|
|
|
|
|
Secondary.ValueH = ATypeVal[I];
|
|
|
|
|
|
Secondary.ValueL = ATypeVal[I-1];
|
|
|
|
|
|
|
|
|
|
|
|
return SecondaryCompute();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
#ifndef ENABLE_DENSITY_DETECT
|
|
|
|
|
|
#pragma message("[undefined] ENABLE_DENSITY_DETECT")
|
|
|
|
|
|
#elif(ENABLE_DENSITY_DETECT)
|
|
|
|
|
|
void GasDensityCompute(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
Secondary.NodeH = densityFSParameter;
|
|
|
|
|
|
Secondary.NodeL = VHHParameterAir;
|
|
|
|
|
|
Secondary.NodeX = voltageDetected[VHPA];
|
|
|
|
|
|
|
|
|
|
|
|
Secondary.ValueH = DENSITY_FS;
|
|
|
|
|
|
Secondary.ValueL = DENSITY_ZERO;
|
|
|
|
|
|
|
|
|
|
|
|
density = SecondaryCompute();
|
|
|
|
|
|
if(density > Secondary.ValueH) density = Secondary.ValueH;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|