dpinney / omf

The Open Modeling Framework for smart grid cost-benefit analysis.
https://omf.coop
GNU General Public License v2.0
112 stars 60 forks source link

Better battery charge controllers. #66

Closed dpinney closed 10 years ago

dpinney commented 11 years ago

USE CASES Single battery use cases implemented at inverter:

Multi-battery use cases: only peak shaving and line load relief.

NOTES GLD doesn't support islanding. It's a 4.0 feature.

TODO

dpinney commented 11 years ago

I need to gather better requirements here.

dpinney commented 10 years ago

We followed Gridlab team's lead on suitable controls. Relevant ticket: http://sourceforge.net/apps/trac/gridlab-d/ticket/730. Ugh, sourceforge deleted the bug tracker. New ticket location?

jcfuller1 commented 10 years ago

Initial documentation available at: http://gridlabd.me.uvic.ca/wiki/index.php?title=Spec:central_dg_control

Most of this was implemented in ticket 730, then migrated to v3.1 release branch. Additional user documentation will be added.

trevorhardy commented 10 years ago

I've pushed up the battery.py module which allows batteries to be added to a feeder. Right now only Load-Following and Constant_PQ mode are supported.

dpinney commented 10 years ago

Hmm. I'm not sure this is ready for production. Could you move it to a new folder /omf/scratch/batteryChargeControllers/?

trevorhardy commented 10 years ago

Sure.

trevorhardy commented 10 years ago

David, what else would you like done on this battery-adding script? Are there specific bugs or problems with how it works that I can be working on for you?

dpinney commented 10 years ago

I'm not sure what the battery-adding script is for. It's not in the todo list in this issue. I thought you were working in the GLD code base on the central_dg_controller.

trevorhardy commented 10 years ago

It sounds like there may have been some miscommunication. The script that I uploaded here is used to add batteries to specified nodes in a feeder model. As part of adding those batteries the control method is specified along with any relevant parameters. These control methods are not a part of a centralized DG controller but rather individual inverter control methods that are driven by the specified control parameters which may include a specific node in the network to monitor.

In addition to this Python script, I'm also working on expanding the list of relevant control methods that are supported in Gridlab-D itself. Before I began this part of the work, the only working method (more or less) was a load-following routine. Since then I have debugged the constant PQ control mode and added a power-factor regulating mode as specified in the remarks when this ticket was opened. I was going to ask you questions about the other two methods (line-load relief and voltage regulation) but it sounds like we need to make sure we're on the same page before going any further. Is this making sense?

dpinney commented 10 years ago

The Gridlab-D constant PQ and PF work on the inverter/battery object sounds great. Exactly what we're looking for.

You're currently focusing on the inverter/battery objects in GLD and will work on the central_dg_controller later?

trevorhardy commented 10 years ago

OK, David. I talked with Andy and he was able to remove my confusion.

Thus far I have been focused on bringing functionality to the individual inverter objects so that if a single battery was added to a model it could accomplish our wish list (load-following, pf correction, line load relief, etc.).

Once we have all of these functions up and running on individual devices, I am going to be implementing a coordinated control scheme that will allow these distributed devices to to work together to achieve the goal of these same control modes (load-following, etc.). Andy and I were discussing the details conceptually this afternoon and I'm still ironing them out but it looks like this will end up as a more decentralized but coordinated scheme. All of the inverters in a feeder will use one of their existing control modes but their final output will be regulated based on the outputs of the other participating inverters. Like I said, still working on the details.

The battery.py script I wrote will still be used to populate a feeder model with batteries set up to operate in whichever mode is desired. I don't expect that script will need significant (if any) alteration based on the development we are doing in Gridlab-D itself. Its functionality is pretty straight-forward and mostly ignorant of the objects it is adding to the model.

Until then, though, I'd like to double-check the modes of operation for the batteries and make sure we get those all working before moving on. Here is the status of the Gridlab-D support so far for the control modes you have requested:

Let me know what you think of this; we can discuss it over the phone as needed.

dpinney commented 10 years ago

TODO list in top comment updated.

Simple Market System model in OMF repository in directory /omf/scratch/simpleMarket/

trevorhardy commented 10 years ago

Here's an update on my progress over the past week.

Most of my time has been spent working on getting the group pf regulation working in a stable and at least semi-effective manner. As of this morning, I'm feeling pretty good about the functionality of this controller and have completed my internal testing and evaluation. I'll be updating our code base on Sourceforge later today (hopefully), making these new operating modes available to all.

If I remember correctly, we were going to pass on the voltage regulation via an inverter and, assuming this is still the case, my next step will be to implement the new inverter control modes on the simpleMarketModel as a demonstration of how they are used and how they perform.

Unfortunately, between some time-off this week and a last-minute urgent project, I don't expect to get back to working on this until next week. With the updated code-base, it should be very possible for somebody else to pick this up if its completion becomes urgent. Otherwise, I look forward to getting back to it next week.

trevorhardy commented 10 years ago

I ended up with a little more time this week and was able to push the example simpleMarketModels with the new inverter/battery objects along with a spreadsheet with the results of those examples up to the repository. They can be found at:

/omf/scratch/batteryChargeControllers/

As discussed on the phone with David, the most problematic operation mode is group PF regulation due to the lack of information sharing between the inverters. I've done a lot of testing trying to refine the code and I think I've got it stabilized; if anybody finds cases where the inverters misbehave, let me know and I'll look into it.

dpinney commented 10 years ago

Thanks Trevor, this looks great.

I looked through /omf/scratch/batteryCharge and the .xlsx and had a few questions:

  1. Is it possible to do group line load relief?
  2. For line load relief, are the inverter settings the same as peak shaving just with a different sense_object? Actually, flipping back and forth between single_batt_line_relief... and single_batt_peak_shaving..., it appears they have the same sense node just slightly different threshold settings. Is this intended?
  3. That spike on all the peak-shaving charts around 7 PM*--could that be avoided with different threshold settings? For a utility trying to reduce their demand charges, highest daily peak is the one that needs shaving.
  4. For the group switching, what communications does the model assume? For example, do we assume all inverters can exchange data with each other? I hope no faster-than-light communication is assumed. :wink:
  5. How much effort would it take to do the voltage support use case (single inverter, not group)?

*Spike: image

trevorhardy commented 10 years ago

1 - Yes, it is possible to group load-line relief. I didn't include it in the demonstration as the simpleMarketModel doesn't really have a common line that both batteries would feed up into. I've tested it on another system and it works just fine.

2 - This is another limitation of the simpleMarketModel as the only node upstream of any line happens to be the same node as used in the peak-shaving demo. Again, the functionality of using the inverter/battery is identical (both operating in LOAD_FOLLOWING); its just a matter of whether you make your sense object that of a meter directly upstream of a line or at the head of a feeder. The difference in settings was more to make the behavior of the system more interesting rather than a necessity of the inverter/battery's operation.

3 - The spike there gets through because the battery has run out of charge and is no longer able to effectively limit the power flow at the feeder head by discharging. It is possible to clip that spike by changing the thresholds to less aggressively discharge (move the "discharge.." settings higher) and/or more aggressively charge (move the "charge.." settings higher). You could also just use a bigger battery but some may or may not consider that cheating.

4 - There is no actual real-time communication assumed. All that is assumed is that each inverter knows the total installed capacity for the group it is in, something that is assumed would not change during normal operation. It is easy to imagine ways in which this setting could become inaccurate (outages, batteries added to feeder in phases rather than all at once,...) but the assumption (of knowing the total size of the group) is not unreasonable (particularly for utility-owned assets) and it provides a demonstration of just how effective control could be with no communication infrastructure.

5 - I will defer to Jason and Andy to see how difficult it would be to add voltage regulation.

trevorhardy commented 10 years ago

I've chatted with Jason and Andy and it seems like the basic framework for doing voltage regulation shouldn't be too hard to implement. Like the power-factor regulation, though, getting a good control system in place will probably be a bit tricky. There are a few specific complications we anticipate:

We should probably discuss more in depth what you have in mind and where you think the effort/results sweet spot is. My time to work on this is limited for a week or so but I should at least have time to talk it over in the near future. Let me know what you're thinking.

dpinney commented 10 years ago

Nice. I'll send a meeting request so we can figure out:

  1. A clearer use case for voltage support and estimated level of effort. (I think the use case should probably be PV system at the end of a long line--can power injection reduce spikes?)
  2. Moving the simple market system examples to a bigger feeder. I should do this to check my understanding of the work you did.
  3. Could you send me any Gridlab bug tracker tickets you opened as part of this work?
trevorhardy commented 10 years ago

3 - I think these are the only ones I've opened for this effort: https://sourceforge.net/p/gridlab-d/tickets/896/ https://sourceforge.net/p/gridlab-d/tickets/900/ https://sourceforge.net/p/gridlab-d/tickets/904/

dpinney commented 10 years ago

Final todo (voltage control test) updated in top comment.

Hypothetical output we might expect from voltage control test: image

trevorhardy commented 10 years ago

(Eventually) got a model put together that will work for us and ran a few simulations on it. Annotated feeder model: battery voltage support feeder model

Voltage at circled nodes: real power feeder end battery performance

As you can see, the performance is roughly like the sketch in the previous comment guessed it might be. A couple of interesting notes:

So batteries definitely can help voltage by providing real power output and the effect is local and not overwhelming. Interestingly, I ran the same study using reactive power only and the effects on voltage are definitely more noticeable: reactive power feeder end battery performance

It wouldn't make sense, though, to install energy storage to simply supply reactive power since this is mainly a function of the inverter and no real power (that is, power from the battery) is used. The inverter acts like a distribution-level FACTS device or an expensive variable capacitor.

We could implement the voltage control function in GLD like we did the power factor regulation function; the inverter's reactive power output is defined by a voltage regulation function and is subordinate to the real power function of the inverter (load-following, line relief,...). This makes the voltage regulation function a second-class function and thus may prevent it from accomplishing its goal (as is also the case for power factor regulation). It is also unclear to me if we could use the same sense object as in the real power function as it is often far upstream of the energy storage device. Reactive power provides a local effect that may or may not reach that sense point and improve the voltage to a specific level.

Another option is to not explicitly support voltage regulation but offer the existing power factor regulation function as a good alternative. Improving the power factor on the feeder as a whole will improve the voltage profile. We already have this function implemented and though it won't guarantee any specific voltage level, it will raise the voltage near the energy storage device.

In summary:

Options for our next step in terms of GLD:

  1. Implement voltage regulation as a real power function.
  2. Implement voltage regulation as a first-class function using reactive power.
  3. Implement voltage regulation as a second-class function using reactive power (like we've done with PF correction) using the real power sense object.
  4. Implement voltage regulation as a second-class function using reactive power (like we've done with PF correction) using a separate reactive power sense object.
  5. Don't implement voltage regulation and suggest users achieve voltage support with the existing power factor regulation. (A checkbox in OMF?)

If the OMF users have a strong felt need for using energy storage for voltage regulation, I would say we need to do 4. As a bonus, a reactive power sense object could also have some benefits in the power factor regulation function.

Maybe the real problem for co-ops, though, isn't reactive power per se but long lines with relatively high resistances. If this is case, real power may be necessary; I don't know enough about the co-op world to offer an informed opinion. If real power is necessary, we should do 1.

If this voltage regulation is not a strong felt need but a "nice to have" we should do 5 and throw a graph up in the OMF interface showing the effects of power-factor regulation on the feeder voltage profile.

dpinney commented 10 years ago

These tests were excellently done, fast, well-documented, and the results surprise me a little in how effective the end-of-line-sense-substation approach worked.

Let's do option 5.

I think we will need real power injection later. We don't need a Gridlab code change for this yet, since we can fake it with 2 inverters at the end of the line.

Could you commit these graphs and glms in the /omf/om/scratch/batteryChargeControllers/ directory?

What did you use to draw the annotated feeder diagram?

trevorhardy commented 10 years ago

Graphs are on their way up.

The feeder diagrams I found at: http://emac.berkeley.edu/gridlabd/taxonomy_graphs/

Any Grildlab-D Taxonomy Feeder graph is kind of fake because the model they are based on only defines distances between two connected nodes (line length) and not direction. These are nice in that they look "realistic" (that is, like we expect a distribution feeder should look) and allow you to get some sense of where the significant branches of the feeder are.

For the annotation I used my Mac's built-in PDF viewer, Preview. It has annotation tools to add highlights, circles, text boxes, that kind of stuff. I'm sure there is an equivalent in the Window's world but you'll have to find it for yourself.

dpinney commented 10 years ago

I see the graphs in fee2442fd7ed6f6f9cb15094bec52a7f53bdd388. Nice.

You've met all the needs, so the issue is closed.

Congratulations on closing issue #66. This has been open for a long time.