Skip to content
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

PlantEquipmentOperation:OutdoorDryBulb does not work with some components #10634

Closed
1 of 3 tasks
jmarrec opened this issue Jul 31, 2024 · 1 comment · Fixed by #10653
Closed
1 of 3 tasks

PlantEquipmentOperation:OutdoorDryBulb does not work with some components #10634

jmarrec opened this issue Jul 31, 2024 · 1 comment · Fixed by #10653
Assignees
Labels
Defect Includes code to repair a defect in EnergyPlus LowComplexityApproved Used for subcontractor defect complexity requests

Comments

@jmarrec
Copy link
Contributor

jmarrec commented Jul 31, 2024

Issue overview

CoolingTower:SingleSpeed for eg does not care about the PlantEquipmentOperation.

Incidentally, CoolingTowerDryBulbRangeOp.idf does exhibit the problem. You can just run from 7/15 to 7/16 and see it in action.

The Condenser Loop has two CoolingTower:SingleSpeed BIG TOWER1 & BIG TOWER2, a PlantEquipmentOperation:OutdoorDryBulb that uses both towers until 27°C, and just BIG TOWER1 above (which makes zero sense, but whatever).

  CondenserEquipmentOperationSchemes,
    Tower Loop Operation,    !- Name
    PlantEquipmentOperation:OutdoorDryBulb,  !- Control Scheme 1 Object Type
    Year Round Tower Operation,  !- Control Scheme 1 Name
    PlantOnSched;            !- Control Scheme 1 Schedule Name

  PlantEquipmentOperation:OutdoorDryBulb,
    Year Round Tower Operation,  !- Name
    -50,                     !- Dry-Bulb Temperature Range 1 Lower Limit {C}
    27,                      !- Dry-Bulb Temperature Range 1 Upper Limit {C}
    All Towers,              !- Range 1 Equipment List Name
    27,                      !- Dry-Bulb Temperature Range 2 Lower Limit {C}
    70,                      !- Dry-Bulb Temperature Range 2 Upper Limit {C}
    One Tower;               !- Range 2 Equipment List Name

  CondenserEquipmentList,
    All Towers,              !- Name
    CoolingTower:SingleSpeed,!- Equipment 1 Object Type
    Big Tower1,              !- Equipment 1 Name
    CoolingTower:SingleSpeed,!- Equipment 2 Object Type
    Big Tower2;              !- Equipment 2 Name

  CondenserEquipmentList,
    One Tower,               !- Name
    CoolingTower:SingleSpeed,!- Equipment 1 Object Type
    Big Tower1;              !- Equipment 1 Name

I have changed the testfiles to report the output:variable in Detailed rather Hourly.

As can be seen, even when the OA temp is > 27°C, both tower are on.

image

Details

Some additional details for this issue (if relevant):

Checklist

Add to this list or remove from it as applicable. This is a simple templated set of guidelines.

  • Defect file added (list location of defect file here): testfiles/CoolingTowerDryBulbRangeOp.idf
  • Ticket added to EnergyPlus Defect Complexity (Github Project)
  • Pull request created (the pull request will have additional tasks related to reviewing changes that fix this defect)
@jmarrec
Copy link
Contributor Author

jmarrec commented Jul 31, 2024

Seems like the MyLoad is set correctly on the comps of the EquipmentList in PlantCondLoopOperation::ManagePlantLoadDistribution

case OpScheme::DryBulbRB: {
RangeVariable = state.dataEnvrn->OutDryBulbTemp;
break;
}
case OpScheme::WetBulbRB: {
RangeVariable = state.dataEnvrn->OutWetBulbTemp;
break;
}
case OpScheme::RelHumRB: {
RangeVariable = state.dataEnvrn->OutRelHum;
break;
}
case OpScheme::DewPointRB: {
RangeVariable = state.dataEnvrn->OutDewPointTemp;
break;
}
case OpScheme::DryBulbTDB:
case OpScheme::WetBulbTDB:
case OpScheme::DewPointTDB: {
RangeVariable = FindRangeVariable(state, plantLoc.loopNum, CurSchemePtr, CurSchemeType);
break;
}
default: {
// No controls specified. This is a fatal error
ShowFatalError(state,
format("Invalid Operation Scheme Type Requested={}, in ManagePlantLoadDistribution",
state.dataPlnt->PlantLoop(plantLoc.loopNum).OpScheme(CurSchemePtr).TypeOf));
}
}
switch (CurSchemeType) {
case OpScheme::Uncontrolled: {
//!***what else do we do with 'uncontrolled' equipment?
// There's an equipment list...but I think the idea is to just
// Set one component to run in an 'uncontrolled' way (whatever that means!)
break;
}
case OpScheme::CompSetPtBased: {
// check for EMS Control
TurnOnPlantLoopPipes(state, plantLoc.loopNum, plantLoc.loopSideNum);
FindCompSPLoad(state, plantLoc, CurCompLevelOpNum);
break;
}
case OpScheme::EMS: {
TurnOnPlantLoopPipes(state, plantLoc.loopNum, plantLoc.loopSideNum);
DistributeUserDefinedPlantLoad(state, plantLoc, CurCompLevelOpNum, CurSchemePtr, LoopDemand, RemLoopDemand);
break;
}
default: { // it's a range based control type with multiple equipment lists
CurListNum = 0;
for (ListNum = 1; ListNum <= NumEquipLists; ++ListNum) {
// setpointers to 'PlantLoop()%OpScheme()...'structure
ListPtr = this_component.OpScheme(CurCompLevelOpNum).EquipList(ListNum).ListPtr;
RangeHiLimit = this_op_scheme.EquipList(ListPtr).RangeUpperLimit;
RangeLoLimit = this_op_scheme.EquipList(ListPtr).RangeLowerLimit;
if (CurSchemeType == OpScheme::HeatingRB || CurSchemeType == OpScheme::CoolingRB) {
// these limits are stored with absolute values, but the LoopDemand can be negative for cooling
TestRangeVariable = std::abs(RangeVariable);
} else {
TestRangeVariable = RangeVariable;
}
// trying to do something where the last stage still runs the equipment but at the hi limit.
if (TestRangeVariable < RangeLoLimit || TestRangeVariable > RangeHiLimit) {
if ((TestRangeVariable > RangeHiLimit) && (ListPtr == this_op_scheme.EquipListNumForLastStage)) {
// let this go thru, later AdjustChangeInLoadForLastStageUpperRangeLimit will cap dispatch to RangeHiLimit
CurListNum = ListNum;
break;
} else {
continue;
}
} else {
CurListNum = ListNum;
break;
}
}
if (CurListNum > 0) {
// there could be equipment on another list that needs to be nulled out, it may have a load from earlier iteration
for (ListNum = 1; ListNum <= NumEquipLists; ++ListNum) {
if (ListNum == CurListNum) continue; // leave current one alone
NumCompsOnList = this_op_scheme.EquipList(ListNum).NumComps;
for (CompIndex = 1; CompIndex <= NumCompsOnList; ++CompIndex) {
EquipBranchNum = this_op_scheme.EquipList(ListNum).Comp(CompIndex).BranchNumPtr;
EquipCompNum = this_op_scheme.EquipList(ListNum).Comp(CompIndex).CompNumPtr;
loop_side.Branch(EquipBranchNum).Comp(EquipCompNum).MyLoad = 0.0;
}
}
if (this_op_scheme.EquipList(ListPtr).NumComps > 0) {
TurnOnPlantLoopPipes(state, plantLoc.loopNum, plantLoc.loopSideNum);
DistributePlantLoad(state, plantLoc.loopNum, plantLoc.loopSideNum, CurSchemePtr, ListPtr, LoopDemand, RemLoopDemand);
LoadDistributionWasPerformed = true;
}
}

But it's ignored. Merkel is the only cooling tower that takes a Load parameter apparently.

void calculateSingleSpeedTower(EnergyPlusData &state);
void calculateTwoSpeedTower(EnergyPlusData &state);
void calculateMerkelVariableSpeedTower(EnergyPlusData &state, Real64 &MyLoad);
void calculateVariableSpeedTower(EnergyPlusData &state);

@RKStrand RKStrand self-assigned this Aug 8, 2024
@RKStrand RKStrand added the Defect Includes code to repair a defect in EnergyPlus label Aug 8, 2024
@RKStrand RKStrand added this to the EnergyPlus 24.2 milestone Aug 8, 2024
@Myoldmopar Myoldmopar added the LowComplexityApproved Used for subcontractor defect complexity requests label Aug 14, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Defect Includes code to repair a defect in EnergyPlus LowComplexityApproved Used for subcontractor defect complexity requests
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants