Question-and-Answer Resource for the Building Energy Modeling Community
Get started with the Help page

I am using a PlantComponent:UserDefined (PCUD) object to model a sensible heat storage, used as central heating plant equipment. The device's maximum capacity in kW is dependent on its state of charge (SOC) which is a function of its charge temperature at each time step. As an example, at a maximum charging temperature of 800 °C the device can deliver a maximum of 75kW; at 100 °C a maximum of 10kW can be extracted, etc.

The PCUD object has an actuator called Maximum Loading Capacity. During initialization, when I set the actuator value to 75kW, this seems to permanently register the device's maximum capacity to 75kW. I believe the value of this actuator is captured once during the sizing phase by EnergyPlus. However, as mentionned, the maximum capacity of the device varies according to its storage temperature. As a consequence, during the run period simulation, the device is being loaded to its absolute maximum of 75kW even though its maximum capacity at a given timestep is below the absolute maximum of 75kW. This problem can also be seen when the load is being distributed between the storage device and another equipment, such as a boiler.

For example, say the storage device is operating alongside a NG boiler. The storage device has priority, and has a maximum capacity of 50kW at a given timestep. The total load on the demand side is 150kW. What happens is the storage device gets loaded to 75kW (instead of 50kW) and the remainder (75kW) is taken by the boiler. The device only delivers 50kW out of the 75kW that it's being asked to meet, resulting in 25kW of unmet load that could have been distributed and delivered by the boiler.

Is there a way to update the maximum loading capacity of the PCUD object at each timestep? In other words, override the absolute maximum value of 75kW that is read during initialization?

edit retag close merge delete

Sort by » oldest newest most voted

(definitely NOT an answer ... just too many chars for a comment).

@HoussemYounes, how do you associate storage capacity (J, or m3) to a PCUD? It seems to support only inlet/outlet state variables (°C, rho, Cp) or rates (W, kg/s). My understanding is that a loop-connected, heat storage device could be approximated using a WaterUse:Storage component that is either charged or discharged, possibly by 1x or 2x PCUDs (or similar EMS-enabled components) working in tandem. One can definitely link up a WaterUse storage component (I haven't experimented, my bad), although it's unclear if/how stored water temperature is tracked using EMS (not spotting it here).

In such a scenario, a charging PCUD would definitely have a fixed Maximum Loading Capacity, e.g. sized coil(s). One can imagine an EMS controller activating a charging event (similar to cooling storage), e.g. based on a combination of variables including predicted outdoor temperatures (brr!) over a 24h period. There would likely be a maximum storage temperature, but the target temperature for a given event could vary (e.g. discharge duration, required peak power). During discharging events, the SOC would be approximated by the temperature and volume of stored water. As it discharges at each time step, the SOC would diminish over the course of the event.

Of course this would be an approximation, as these devices hold high capacity materials that exceed water rho/Cp (likely requiring exaggerated storage volume and/or temperatures). Again, I have not experimented. Most of the variables can be EMS sensed/actuated, but likely not all of them. Hope this is somehow useful.

more

Thank you for the comment, Denis. You are right, I don't have a storage capacity (in J) directly associated with the PCUD. The storage capacity is tied to the storage medium (bricks) temperature. This is an EMS global variable that updates at each timestep based on an energy balance equation : T(t+1) = T(t) dt/C*[Pcharge(t) - Pdischarge(t) - Ploss(t)]. Where Pdischarge(t) is a minimum between Pmax(t) and Pdemand(t). The maximum discharge capacity Pmax(t) (W) is the maximum amount of heat that could be extracted from the unit at any given timestep, it is a function of the storage temperature T(t).

You are right on the money with your second part of the comment. I have a whole control logic that determines the Pcharge(t) part, based on schedules, peak limits, outdoor temperatures, DR event signals etc. It works very well so far, apart from times when some combination of user control inputs results in insufficient storage temperatures, resulting in unmet hours. The maximum loading capacity "communicated" to EnergyPlus by the unit should follow the storage temperature, but instead it seems to be permanently saved as the size of the PCUD (maximum capacity at the maximum storage temperature) during the initialization phase. I am essentially trying to find a creative way, using EMS to update the sizing (maximum capacity) of the equipment at each time step based on its last calculated storage temperature. I think this would correct the load distribution problem between the unit and a boiler, as explained in my post.

more

Thanks for clarifying. I hope there's eventually a paper or technical report describing the entire solution, preferably validated against experimental data. These technologies are becoming critical given current electrification trends. Your solution could constitute a good prototype for an actual EnergyPlus enhancement request (there's no reason these technologies aren't as well supported as TES for cooling, for instance), such as here. Bonne chance!

( 2023-06-09 07:14:47 -0500 )edit

Exactly, and that is the final goal. Currently, I have packaged the module as an Openstudio measure which should already be useful and should be made available once a documentation and paper are out, but ultimately it can be proposed as an enhancement to EP's library. Merci!

( 2023-06-09 09:29:25 -0500 )edit