-
Notifications
You must be signed in to change notification settings - Fork 396
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
Fix documentation of VRF Heat Pump Total Heating Rate, should equal the sum of coil heating rate, not air terminal heating rate #10627
base: develop
Are you sure you want to change the base?
Changes from 6 commits
f5c5103
03d9070
098e584
a75d23a
6379fdc
f306890
94e3c1f
ac4911c
c9fb07f
94fbca7
3ba669a
303a572
0ca1aa3
fbcb90c
bc5d7c9
6161f8d
e1db7ed
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); | ||
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. 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; | ||
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. 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; | ||
} | ||
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. TotalHeatingCapacity should match the sum of the TU capacity + piping losses. So isn't it just that? TotalHeatingCapacity = Q_h_TU_PL = TU_HeatingLoad + Pipe_Q_h? 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. yes, it is matching this. |
||
|
||
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} | ||
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. Does including OA flow cause a difference between the sum of TU heating capacity + piping losses and condenser total heating capacity? 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 does cause some more difference 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. @rraustad Here is the output file when the heating cooling air flow rate is autosize The following is a snapshot sorted with column O in descending order 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. If L x M = 9083.83288 * 0.98793126 = 8974.2, which closely matches column K at 8973.19993, then why is the TU heating coil "allowed" to provide more than that "max" heating rate? Is the TU heating coil capacity getting limited by the MaxHeatingCapacity variable? I recall discussing that function LimitTUCapacity should include piping losses. 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. Coil capacity should have been limited. Maybe there's some lingering issues there. I will check on that. 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. @rraustad I've changed to just using eplusout_0 heating cooling air flow.csv The coil capacity is indeed limited. I set the OU evaporative capacity to 5000W (coil capacity is 10023W). Coil heating rate is less than OU capacity at max speed. |
||
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.