-
Notifications
You must be signed in to change notification settings - Fork 461
Fix VRF Heat Pump Total Heating Rate not match the sum of coil heating rate (with piping loss) #10627
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Fix VRF Heat Pump Total Heating Rate not match the sum of coil heating rate (with piping loss) #10627
Changes from 6 commits
f5c5103
03d9070
098e584
a75d23a
6379fdc
f306890
94e3c1f
ac4911c
c9fb07f
94fbca7
3ba669a
303a572
0ca1aa3
fbcb90c
bc5d7c9
6161f8d
e1db7ed
65f2c96
411d96a
4075b7f
939896c
0958045
04a44d2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -17483,12 +17483,20 @@ void ControlVRFIUCoil(EnergyPlusData &state, | |
| if (QCoilSenHeatingLoad > QinSenMin1) { | ||
| // Modulate fan speed to meet room sensible load; SC is not updated | ||
| FanSpdRatioMax = 1.0; | ||
| auto f = [QCoilSenHeatingLoad, Ts_1, Tin, Garate, BF](Real64 FanSpdRto) { | ||
| return FanSpdResidualHeat(FanSpdRto, QCoilSenHeatingLoad, Ts_1, Tin, Garate, BF); | ||
| Tout = Tin + (Ts_1 - Tin) * (1 - BF); | ||
| Real64 RatedAirMassFlowRate = state.dataDXCoils->DXCoil(CoilIndex).RatedAirMassFlowRate[0]; | ||
| auto f = [QCoilSenHeatingLoad, RatedAirMassFlowRate, Tout, Tin, Win](Real64 FanSpdRto) { | ||
| return FanSpdResidualHeatUsingH(FanSpdRto, QCoilSenHeatingLoad, RatedAirMassFlowRate, Tout, Tin, Win); | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am not saying to change this but it just seems odd to me when meeting a load to modulate the fan based on suction temperature (which meets the load using air flow) instead of modulating the compressor at some known fan speed. I guess this is an artifact of using VS fan. I would hope in the case of a VS fan that the refrigerant suction T is relatively constant.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It seems that modulating the compressor is at the next step after the calculation of the TU's are finished. In this function, I don't think refrigerant suction temperature changes |
||
| }; | ||
| General::SolveRoot(state, 1.0e-3, MaxIter, SolFla, Ratio1, f, FanSpdRatioMin, FanSpdRatioMax); | ||
| // this will likely cause problems eventually, -1 and -2 mean different things | ||
| if (SolFla < 0) Ratio1 = FanSpdRatioMax; // over capacity | ||
| if (SolFla < 0) { | ||
| if (f(FanSpdRatioMin) <= 0) { // capacity <= demand | ||
| Ratio1 = FanSpdRatioMax; // over capacity | ||
| } else { // capacity > demand even for the minimum fan speed | ||
| Ratio1 = FanSpdRatioMin; | ||
| } | ||
| } | ||
| FanSpdRatio = Ratio1; | ||
| CoilOnOffRatio = 1.0; | ||
|
|
||
|
|
@@ -17769,6 +17777,27 @@ Real64 FanSpdResidualHeat(Real64 FanSpdRto, Real64 QCoilSenHeatingLoad, Real64 T | |
| return (TotCap - ZnSenLoad) / ZnSenLoad; | ||
| } | ||
|
|
||
| Real64 FanSpdResidualHeatUsingH(Real64 FanSpdRto, Real64 QCoilSenHeatingLoad, Real64 RatedAirMassFlowRate, Real64 Tout, Real64 Tin, Real64 Win) | ||
| { | ||
|
|
||
| // FUNCTION INFORMATION: | ||
| // AUTHOR Yujie Xu (yujiex) | ||
| // DATE WRITTEN Jul 2024 | ||
| // | ||
| // PURPOSE OF THIS FUNCTION: | ||
| // Calculates residual function (desired zone heating load - actual heating coil capacity) | ||
| // This is used to modify the fan speed to adjust the coil heating capacity to match | ||
| // the zone heating load. This one uses Hin and Hout difference rather than Tin and Tout difference | ||
| // like in FanSpdResidualHeat | ||
| // | ||
| Real64 ZnSenLoad = QCoilSenHeatingLoad; | ||
| // +-100 W minimum zone load? | ||
| if (std::abs(ZnSenLoad) < 100.0) ZnSenLoad = sign(100.0, ZnSenLoad); | ||
| Real64 Wout = Win; | ||
| Real64 TotCap = FanSpdRto * RatedAirMassFlowRate * (PsyHFnTdbW(Tout, Wout) - PsyHFnTdbW(Tin, Win)); | ||
| return (TotCap - ZnSenLoad) / ZnSenLoad; | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do you really need to iterate on this? There's only 1 unknown.., FanSpdRto.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I guess not. I will change it to directly calculate FanSpdRto |
||
| } | ||
|
|
||
| void SetMSHPDXCoilHeatRecoveryFlag(EnergyPlusData &state, int const DXCoilNum) | ||
| { | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11725,12 +11725,14 @@ void VRFCondenserEquipment::CalcVRFCondenser_FluidTCtrl(EnergyPlusData &state) | |
| this->VRFCondCyclingRatio = CyclingRatio; | ||
|
|
||
| Tsuction = this->EvaporatingTemp; // Outdoor unit evaporating temperature | ||
| this->HeatingCapacityPrev = this->HeatingCapacity; | ||
| this->HeatingCapacity = | ||
| this->CoffEvapCap * this->RatedEvapCapacity * CurveValue(state, this->OUCoolingCAPFT(NumOfCompSpdInput), Tdischarge, Tsuction) + | ||
| this->RatedCompPower * CurveValue(state, | ||
| this->OUCoolingPWRFT(NumOfCompSpdInput), | ||
| Tdischarge, | ||
| Tsuction); // Include the piping loss, at the highest compressor speed | ||
| this->PipingCorrectionHeatingPrev = this->PipingCorrectionHeating; | ||
| this->PipingCorrectionHeating = TU_HeatingLoad / (TU_HeatingLoad + Pipe_Q_h); | ||
| state.dataHVACVarRefFlow->MaxHeatingCapacity(VRFCond) = | ||
| this->HeatingCapacity; // for report, maximum condensing capacity the system can provide | ||
|
|
@@ -12219,7 +12221,14 @@ void VRFCondenserEquipment::CalcVRFCondenser_FluidTCtrl(EnergyPlusData &state) | |
| } | ||
|
|
||
| this->TotalCoolingCapacity = TotalCondCoolingCapacity * CoolingPLR; | ||
| this->TotalHeatingCapacity = TotalCondHeatingCapacity * HeatingPLR; | ||
| // adjustment for matching HP heating rate and coil heating rate | ||
| this->TotalHeatingCapacity = TotalCondHeatingCapacity * HeatingPLR * (this->RatedEvapCapacity / (this->RatedEvapCapacity + Pipe_Q_h)); | ||
| if (this->VRFCondPLR < 1.0) { | ||
| this->TotalHeatingCapacity = TotalCondHeatingCapacity * HeatingPLR * this->PipingCorrectionHeating; | ||
| } | ||
| if (this->TUHeatingLoad / this->PipingCorrectionHeating > TotalCondHeatingCapacity) { | ||
| this->TotalHeatingCapacity = this->HeatingCapacityPrev * HeatingPLR * this->PipingCorrectionHeatingPrev; | ||
| } | ||
|
||
|
|
||
| if (this->MinPLR > 0.0) { | ||
| bool const plrTooLow = this->VRFCondPLR < this->MinPLR; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -477,8 +477,8 @@ | |
| 0, !- No Cooling Supply Air Flow Rate {m3/s} | ||
| 0.595, !- Heating Supply Air Flow Rate {m3/s} | ||
| 0, !- No Heating Supply Air Flow Rate {m3/s} | ||
| autosize, !- Cooling Outdoor Air Flow Rate {m3/s} | ||
| autosize, !- Heating Outdoor Air Flow Rate {m3/s} | ||
| 0, !- Cooling Outdoor Air Flow Rate {m3/s} | ||
| 0, !- Heating Outdoor Air Flow Rate {m3/s} | ||
|
||
| 0, !- No Load Outdoor Air Flow Rate {m3/s} | ||
| VRFFanModeSchedule, !- Supply Air Fan Operating Mode Schedule Name | ||
| drawthrough, !- Supply Air Fan Placement | ||
|
|
||


There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This does seem like the correct definition for the VRF heating capacity.