-
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 3 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 |
|---|---|---|
|
|
@@ -619,7 +619,7 @@ \subsubsection{Outputs}\label{outputs-039} | |
|
|
||
| \paragraph{VRF Heat Pump Total Heating Rate {[}W{]}}\label{vrf-heat-pump-total-heating-rate-w} | ||
|
|
||
| This output field is the operating total heating capacity of the variable refrigerant flow heat pump in Watts. The capacity includes any degradation due to defrost mode. This value is calculated for each HVAC system time step being simulated, and the results are averaged for the time step being reported. This value should match the sum of the individual zone terminal unit output variables for Zone VRF Air Terminal Total Heating Rate. | ||
| This output field is the operating total heating capacity of the variable refrigerant flow heat pump in Watts. The capacity includes any degradation due to defrost mode. This value is calculated for each HVAC system time step being simulated, and the results are averaged for the time step being reported. This value should match the sum of the individual zone terminal unit heating coil output variables for Heating Coil Heating Rate. | ||
|
|
||
| \paragraph{VRF Heat Pump Cooling Electricity Rate {[}W{]}}\label{vrf-heat-pump-cooling-electric-power-w} | ||
|
|
||
|
|
@@ -1153,6 +1153,10 @@ \subsubsection{Outputs} | |
|
|
||
| Note: refer to the rdd file after a simulation for exact output variable names | ||
|
|
||
| \paragraph{VRF Heat Pump Total Heating Rate {[}W{]}}\label{vrf-heat-pump-total-heating-rate-w} | ||
|
||
|
|
||
| This output field is the operating total heating capacity of the variable refrigerant flow heat pump in Watts. The capacity includes any degradation due to defrost mode. This value is calculated for each HVAC system time step being simulated, and the results are averaged for the time step being reported. This value should match the sum of the individual zone terminal unit heating coil output variables for Heating Coil Heating Rate. | ||
|
|
||
| \paragraph{VRF Heat Pump Compressor Rotating Speed {[}rev/min{]}}\label{vrf-heat-pump-compressor-rotating-speed-revmin} | ||
|
|
||
| This output only applies for the VRF-FluidTCtrl model. This is the rotating speed of the compressor, which indicates the loading index. | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -17346,7 +17346,7 @@ void ControlVRFIUCoil(EnergyPlusData &state, | |
| MaxSC = 20; | ||
| Garate = state.dataDXCoils->DXCoil(CoilIndex).RatedAirMassFlowRate(1); | ||
| // why always limit the minimum fan speed ratio to 0.65? | ||
| FanSpdRatioMin = min(max(OAMassFlow / Garate, 0.65), 1.0); // ensure that coil flow rate is higher than OA flow rate | ||
| FanSpdRatioMin = min(max(OAMassFlow / Garate, 0.0), 1.0); // ensure that coil flow rate is higher than OA flow rate | ||
|
||
|
|
||
| if (QCoil == 0) { | ||
| // No Heating or Cooling | ||
|
|
@@ -17481,12 +17481,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); | ||
| }; | ||
| General::SolveRoot(state, 1.0e-3, MaxIter, SolFla, Ratio1, f, FanSpdRatioMin, FanSpdRatioMax); | ||
|
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 |
||
| // 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; | ||
|
|
||
|
|
@@ -17767,6 +17775,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 |
|---|---|---|
|
|
@@ -11740,12 +11740,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 | ||
|
|
@@ -12235,7 +12237,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.
It thought this should say "sum of the individual zone terminal unit heating coil output variables for Heating Coil Heating Rate less any piping loss."
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.
It might just be the total of heating coil heating rate rather than total coil heating rate - piping loss.
in
CalcVRFCondenser,vrf.TotalHeatingCapacity(VRF Heat Pump Total Heating Rate output variable) is computed like thisAnd in
HeatingPLRis like thisFor normal cases where
TotalCondHeatingCapacity > 0.0,vrf.TotalHeatingCapacitywould just beTUHeatingLoad / vrf.PipingCorrectionHeatingwould be coil heating rate plus the piping loss.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.
Right, I meant coil heating rates plus piping loss is the output from the outdoor unit.
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.
I see. Sorry I misunderstood earlier. I will modify the description.