Add Plant Manager dynamic operating capacity calls to Chiller:Electric:EIR - #11727
Add Plant Manager dynamic operating capacity calls to Chiller:Electric:EIR#11727rraustad wants to merge 7 commits into
Conversation
| Real64 capacityModifierFuncTemp = Curve::CurveValue(state, this->ChillerCapFTIndex, loadSideOutletSetpointTemp, sourceInletTemp); | ||
| return this->RefCap * capacityModifierFuncTemp; | ||
| } | ||
|
|
There was a problem hiding this comment.
I added this new function, wrote a unit test that tested this function, and then tried to prove the value using a test file. I found no changes at all between develop and this branch and then realized that the Plant Manager was not calling the getDynamicMaxCapacity function in places that mattered. The new calls were added to PlantCondLoopOperation such that the plant manager now knows the dynamic capacity of the EIR chiller.
| "Curve:Biquadratic, Air cooled CentCapFT, 0.257896, 0.0389016, -0.00021708, 0.0468684, -0.00094284, -0.00034344, 5, 10, 24, 35, , , , , ;", | ||
| "Curve:Biquadratic, Air cooled CentEIRFT, 0.933884, -0.058212, 0.00450036, 0.00243, 0.000486, -0.001215, 5, 10, 24, 35, , , , , ;", | ||
| "Curve:Biquadratic, Air cooled CentCapFT, 0.257896, 0.0389016, -0.00021708, 0.0468684, -0.00094284, -0.00034344, 5, 10, 5, 35, , , , , ;", | ||
| "Curve:Biquadratic, Air cooled CentEIRFT, 0.933884, -0.058212, 0.00450036, 0.00243, 0.000486, -0.001215, 5, 10, 5, 35, , , , , ;", |
There was a problem hiding this comment.
The minimum input limit for OAT in these curves was not providing the change expected when calling getDynamicMaxCapacity, because OAT was 12C and 5C in this unit test, so the minimum OAT limit for the curve object was expanded.
|
A test file shows the impact of this change. Starting with test file ElectricEIRChiller, the plant components were changed to have 2 equally sized chillers but the CAPFT curve was adjusted for 1 of the chillers so that chiller had slightly higher capacity. The plant loop was set to use UniformPLR as the Load Distribution Scheme: ElectricEIRChiller_2Chillers.idf.txt The results show that this branch dispatches the chillers in a uniform manner based on PLR. In develop, the Plant Manager believes the chillers are the same size and so dispatches the load equally between the chillers (top row). This results in different PLRs for the chillers because they have different real time capacities. In this branch the Plant Manager knows a more accurate representation of instantaneous chiller capacity such that the chillers can be dispatched correctly to yield the same PLR (UniformPLR) for each chiller.
|
|
|
|
@mitchute there were 2 integration failures. Neither of these files have Chiller:Electric:EIR yet both were calling the new function (actually these 2 flles were calling getDynamicMaxCapacity in PlantLoopHeatPumpEIR and ElectricChillers, respectively). in ChillerElectricEIR.cc when I think they should not have (wrong plant component type). I am not sure what is causing that so am asking for some guidance. |
|
|
|
Ah, so this is the reason. Maybe this is OK as-is since it appears to return the correct RefCap (both test files) which is what it was doing before this new function was added. I am just not sure how to calculate a CapFT for this chiller type, or how to discern what chiller type is calling (e.g., Chiller:Electric:ASHRAE205 or Chiller:Electric:EIR). The CapFT index being 0 for these 2 files that failed is a clue to something that needs fixing, I'm just not sure what that is although the same answer as before is being passed back to the plant so this issue does not pose an immediate problem. |
|
|
964634b to
aa691a9
Compare
|
|
| ChangeInLoad = min(ChangeInLoad, dynamicMaxLoad); | ||
| } | ||
| } else if (hasDynamicMaxLoad) { | ||
| ChangeInLoad = min(dynamicMaxLoad, std::abs(RemLoopDemand)); |
There was a problem hiding this comment.
We need to discuss this on the call tomorrow.
|
|
Use current component capacity across plant loading schemes without overwriting the static design maximum. Treat zero dynamic capacity as a valid result and fall back to the static maximum for components without a dynamic-capacity implementation. Scale optimum load with available capacity and add regression coverage for zero and reduced dynamic capacities.
Return component capacity and availability status from getDynamicMaxCapacity as a tuple. This distinguishes valid zero dynamic capacity from components that do not define a maximum load. Apply known dynamic limits across plant loading schemes, preserve legacy unrestricted dispatch for unknown capacities, and scale optimal loading using current available capacity. Add regression coverage for zero and reduced dynamic capacities.
618f3b8 to
2fcaec6
Compare
|
|

Pull request overview
Description of the purpose of this PR
The plant loop Plant Manager dispatches load to plant components according to the PlantLoop Load Distribution Scheme. In order for the Plant Manager to accurately dispatch plant components the Plant Manager must have accurate knowledge of instantaneous operating capacity. For equipment that changes operating capacity based on, for example, leaving water temperature or outdoor air conditions, the instantaneous operating capacity changes as operating conditions change. Fro this reason, a worker function was added to reports back to the Plant Manager the instantaneous operating capacity of the Chiller:Electric:EIR object.
Pull Request Author
Reviewer