From cffcca3db1c586d2536e97e3f562b9d9fa27dec4 Mon Sep 17 00:00:00 2001 From: Chip Barnaby Date: Thu, 12 Nov 2020 13:51:41 -0500 Subject: [PATCH 1/2] ASHPVC refinements WIP --- src/CNLOADS.CPP | 65 ++++++++++++++++++++++++++++++++++++------------- src/CNRECS.DEF | 6 ++++- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/src/CNLOADS.CPP b/src/CNLOADS.CPP index 8d2599a08..0395288fb 100644 --- a/src/CNLOADS.CPP +++ b/src/CNLOADS.CPP @@ -3134,7 +3134,7 @@ float RSYS::rs_PerfASHP( // ASHP performance (simplified call) // else model defrost if available float tdbOut, // outdoor dry bulb, F float& COP, // returned: compressor-only full speed COP at tdbOut - float fanHAdj) // fan power adjustment, Btuh + float fanHAdj /*=0.f*/) // fan power adjustment, Btuh // removed from capacity and input (before COP calc) // returns total heating capacity (compressor + capDefrostHt), Btuh { @@ -3142,6 +3142,8 @@ float RSYS::rs_PerfASHP( // ASHP performance (simplified call) float what = rs_PerfASHP2(ashpModel, tdbOut, fanHAdj, capHt, inpHt, capDfHt, capHtMin, inpHtMin, capDfHtMin); + COP = inpHt > 0.f ? capHt / inpHt : 0.f; + return capHt; } // RSYS::rs_PerfASHP @@ -3347,10 +3349,7 @@ RC RSYS::rs_SetupASHP() // set ASHP defaults and derived parameters rs_cap17 = max( rs_Cap17RatioASHP()*rs_cap47, 1.f); if (!IsSet(RSYS_CAP35)) - { rs_cap35 = rs_cap17 + 0.6f * (rs_cap47 - rs_cap17); - if (rs_HasDefrost()) - rs_cap35 *= 0.9f; // capacity reduction for defrost - } + rs_cap35 = rs_Cap35Default(rs_cap47, rs_cap17); #if ASHP_COPREG == 1 // "traditional" model @@ -3418,9 +3417,10 @@ RC RSYS::rs_SetupASHP() // set ASHP defaults and derived parameters rs_CalcInputsAndSlopesASHP(); #if 1 && defined( _DEBUG) + // back-calc checks float COP; - float capHt = rs_PerfASHP(0, 47.f, COP, 0.f); - capHt = rs_PerfASHP(0, 17.f, COP, 0.f); + float capHt = rs_PerfASHP(0, 47.f, COP); + capHt = rs_PerfASHP(0, 17.f, COP); #endif return rc; @@ -3450,6 +3450,28 @@ x float capRat = 0.6280951f; return capRat; } // RSYS::rs_Cap17RatioASHP //----------------------------------------------------------------------------- +float RSYS::rs_Cap35Default( // default 35 F heating capacity + float cap47, // 47 F heating capacity, any power units + float cap17) const // 17 F heating capacity +// returns 35 F heating capacity, consistent units +{ + float cap35 = cap17 + 0.6f * (cap47 - cap17); + if (rs_HasDefrost()) + cap35 *= 0.9f; // capacity reduction for defrost + return cap35; +} // RSYS::rs_Cap35Default +//----------------------------------------------------------------------------- +float RSYS::rs_Inp35Default( // default 35 F input power + float inp47, // 47 F input power, any power units + float inp17) const // 17 F input power +// returns 35 F input power, consistent units +{ + float inp35 = inp17 + 0.6f * (inp47 - inp17); + if (rs_HasDefrost()) + inp35 *= 0.985f; // defrost power reduction + return inp35; +} // RSYS::rs_Inp35Default +//----------------------------------------------------------------------------- float RSYS::rs_RunFAdjustedEffHtASHP() { float effHt; @@ -3476,9 +3498,7 @@ RC RSYS::rs_CalcInputsAndSlopesASHP() rs_inp17 = rs_cap17 / max( rs_COP17, .1f); if (!IsSet( RSYS_COP35)) - { rs_inp35 = rs_inp17 + 0.6f * (rs_inp47 - rs_inp17); - if (rs_HasDefrost()) - rs_inp35 *= 0.985f; // defrost power reduction + { rs_inp35 = rs_Inp35Default( rs_inp47, rs_inp17); rs_COP35 = rs_cap35 / max( rs_inp35, .1f); } else @@ -3492,17 +3512,28 @@ RC RSYS::rs_CalcInputsAndSlopesASHP() // similar setup for variable capacity (ASHPVC) // unused if not ASHPVC - if (rs_runFMin < 1.f) - { if (!IsSet(RSYS_COPMIN47)) + if (rs_IsASHPVC()) + { // min spd capacities + float capMin47 = rs_CapMin47(); + float capMin17 = rs_CapMin17(); + float capMin35 = rs_Cap35Default(capMin47, capMin17); + + // min spd COP and input + if (!IsSet(RSYS_COPMIN47)) rs_COPMin47 = rs_COP47; - if (!IsSet(RSYS_COPMIN35)) - rs_COPMin35 = rs_COP35; if (!IsSet(RSYS_COPMIN17)) rs_COPMin17 = rs_COP17; - float inpMin47 = rs_cap47 * rs_runFMin / max(rs_COPMin47, .1f); - float inpMin35 = rs_cap35 * rs_runFMin / max(rs_COPMin35, .1f); - float inpMin17 = rs_cap17 * rs_runFMin / max(rs_COPMin17, .1f); + float inpMin47 = capMin47 / max(rs_COPMin47, .1f); + + float inpMin35; + if (!IsSet(RSYS_COPMIN35)) + { inpMin35 = rs_Inp35Default(inp47, inp17); + rs_COPMin35 = capMin35 / max(inpMin35, .1f); + } + else + inpMin35 = capMin35 / max(rs_COPMin35, .1f); + float inpMin17 = capMin17 / max(rs_COPMin17, .1f); rs_ASHPInpMinF[0] = (inpMin47 - inpMin17) / (47.f - 17.f); rs_ASHPInpMinF[1] = (inpMin35 - inpMin17) / (35.f - 17.f); diff --git a/src/CNRECS.DEF b/src/CNRECS.DEF index 6b0842a21..52c1d5d24 100644 --- a/src/CNRECS.DEF +++ b/src/CNRECS.DEF @@ -3089,7 +3089,7 @@ RECORD RSYS "RSYS" *RAT // residential HVAC system *declare "RC rs_PerfMapAC();" *declare "RC rs_PerfDataASHP();" *declare "void rs_PerfDataASHP1( FILE* f, float tDbOut);" -*declare "float rs_PerfASHP( int ashpModel, float tDbOut, float& COP, float fanHAdj);" +*declare "float rs_PerfASHP( int ashpModel, float tDbOut, float& COP, float fanHAdj=0.f);" *declare "float rs_PerfASHP2( int ashpModel, float tDbOut, float fanHAdj, float& capHt, float& inpHt, float& capDfHt, float& capHtMin, float& inpHtMin, float& capDfHtMin, float COPAdjF=1.f);" *declare "int rs_IsASHP() const { return rs_type == C_RSYSTYCH_ASHP || rs_type == C_RSYSTYCH_ASHPPKGRM || rs_IsASHPHydronic() || rs_IsASHPVC(); }" *declare "int rs_IsASHPHydronic() const { return rs_type == C_RSYSTYCH_ASHPHYD; }" @@ -3112,6 +3112,8 @@ RECORD RSYS "RSYS" *RAT // residential HVAC system *declare "static float rs_DHR( float capHt);" *declare "RC rs_SetupASHP();" *declare "float rs_Cap17RatioASHP() const;" +*declare "float rs_Cap35Default( float cap47, float cap17) const;" +*declare "float rs_Inp35Default( float inp47, float inp17) const;" *declare "RC rs_CalcInputsAndSlopesASHP();" *declare "void rs_AuszFinalASHP();" *declare "float rs_CapEffASHP( float tdbout=-999.f, int ashpModel=0, float fanHRtd=-1.f, float fanHOpr=-1.f, float COPAdjF=-1.f);" @@ -3216,6 +3218,8 @@ RECORD RSYS "RSYS" *RAT // residential HVAC system // re ASHPVC (variable capacity) *f *e FRAC_GZ rs_runFMin; // minimum run fraction fraction // (cycles below this) +*declare "float rs_CapMin47() const { return rs_cap47*rs_runFMin; }" +*declare "float rs_CapMin17() const { return rs_cap17*rs_runFMin; }" *f *e FLOAT_GZ rs_COPMin47 // COP at ODB=47 F, min speed *f *e FLOAT_GZ rs_COPMin35 // ditto 35 F *f *e FLOAT_GZ rs_COPMin17 // ditto 17 F From eff89ef765d87506deafd94eb3e1ec097288a860 Mon Sep 17 00:00:00 2001 From: Chip Barnaby Date: Fri, 13 Nov 2020 10:41:30 -0500 Subject: [PATCH 2/2] 35 deg default improvements; HSPF match fix --- src/CNLOADS.CPP | 50 ++++++++++++++++++++++++++----------------------- src/CNRECS.DEF | 2 ++ 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/CNLOADS.CPP b/src/CNLOADS.CPP index 0395288fb..408dfcb37 100644 --- a/src/CNLOADS.CPP +++ b/src/CNLOADS.CPP @@ -3139,11 +3139,9 @@ float RSYS::rs_PerfASHP( // ASHP performance (simplified call) // returns total heating capacity (compressor + capDefrostHt), Btuh { float capHt, inpHt, capDfHt, capHtMin, inpHtMin, capDfHtMin; - float what = rs_PerfASHP2(ashpModel, tdbOut, fanHAdj, + COP = rs_PerfASHP2(ashpModel, tdbOut, fanHAdj, capHt, inpHt, capDfHt, capHtMin, inpHtMin, capDfHtMin); - COP = inpHt > 0.f ? capHt / inpHt : 0.f; - return capHt; } // RSYS::rs_PerfASHP @@ -3169,7 +3167,7 @@ float RSYS::rs_PerfASHP2( // ASHP performance float COPAdjF /*=1.f*/) // COP adjustment factor // multiplies final COP result -// returns heating capacity (including defrost if any), Btuh +// returns compressor-only full-speed COP (as adjusted by COPAdjF) { capDfHt = 0.f; BOOL bDoDefrost = (ashpModel & 0x100) == 0 @@ -3386,11 +3384,11 @@ RC RSYS::rs_SetupASHP() // set ASHP defaults and derived parameters rs_COP47 = 0.3225f * rs_HSPF + 0.9099f; if (!IsSet( RSYS_COP17)) rs_COP17 = rs_HSPF < 8 - ? 0.5183f * rs_HSPF - 1.7244 + ? 0.5183f * rs_HSPF - 1.7244f : 0.2186f * rs_HSPF + 0.6734f; #elif ASHP_COPREG == 6 if (rs_IsPkgRoom()) - { rs_COP17 = 0.6870 * rs_COP47; + { rs_COP17 = 0.6870f * rs_COP47; // rs_cap17 set above } else if (!rs_IsASHPHydronic()) @@ -3400,13 +3398,19 @@ RC RSYS::rs_SetupASHP() // set ASHP defaults and derived parameters rs_COP47 = 0.3225f * rs_HSPF + 0.9099f; if (!IsSet( RSYS_COP17)) { rs_COP17 = 0.2186f * rs_HSPF + 0.6734f; - RC rc1 = rs_HSPFMatchASHP(); // adjust COP17 to be - // consistent with rs_HSPF - if (rc1 != RCOK // if fail - || (!rs_isAuszH && rs_COP17 > rs_COP47)) // or unreasonable - // (allow during ausz) - rc = err( "RSYS '%s': No reasonable value found for rsCOP17." - "\n Check rsHSPF and other heating inputs.", name); + int iTry; + RC rc1; + const int nTry = 40; + for (iTry=0; iTry