Battery storage system serving 2 distinct roles within a 24-hour cycle

I plan to develop a scenario in SAInt where a battery storage system serves two distinct roles within a 24-hour cycle, depending on the time of day:

  1. From 12:00 to 16:00, the battery should function as a spinning reserve provider only—not charging or discharging for arbitrage, but reserved to respond to contingencies.
  2. During the remaining hours, the battery should behave as a market participant for arbitrage—charging when prices are low, discharging when prices are high.

The aim is to study both operational behavior and revenue stacking under a hybrid service schedule, including the interaction with grid price signals and system needs.

Questions:

  1. Revenue Stacking
    Can SAInt report separate revenue streams for a single storage asset—specifically, revenue from:
  • Spinning reserve provision, and
  • Energy arbitrage?

If yes, I’d appreciate guidance on where these outputs can be extracted and whether any specific report or post-processing setup is required to differentiate them clearly.


  1. Modeling Framework & Workflow Sequencing
    To implement the above scenario, I would like to understand the correct modeling sequence:
  • Should I run a Capacity Expansion Model (CEM) first to generate the price profile based on the selected generation mix and load scenarios, and then use those outputs in a Production Cost Model (PCM) to study the detailed dispatch and reserve behavior of the battery?
  • Or can I directly run a PCM with assumed or historic price profiles to simulate this behavior?

Additionally, if I want to test multiple scenarios (e.g., different load profiles or VRE penetration levels), what is the recommended way to:

  • Incorporate scenario-specific price signals or constraints?
  • Control the storage behavior dynamically across those scenarios?

In short, what should I do first to properly structure this hybrid operational behavior under multiple conditions?


  1. Market Price Input
    How can I input or reference hourly market prices in SAInt to enable arbitrage simulation? Should these come from the market object, a custom time-series file, or another source?

  1. Approach Validation
    Here’s the general workflow I’m considering:
  • Enable both energy and reserve participation in the battery object.
  • Apply time-dependent operational constraints (or availability settings) to restrict when each service is active.
  • Provide a price profile to support market-based dispatch decisions.
  • Enable co-optimization of energy and reserves at the system level.

Could you confirm if this approach is valid, or suggest a better practice to ensure time-based service switching and proper valuation?


If there are any sample models or documentation that demonstrate similar configurations especially for hybrid operational logic or scenario switching based on load profiles, that would be greatly appreciated.

Thank you very much for your support!

1 Like

Hello @izzuddinsmy,

Thank you for your email and the clearly structured questions. It’s great to see how thoroughly you’re planning to engage with SAInt’s modeling capabilities. Please find our detailed responses below. We hope they provide a solid foundation for your modeling work.

Revenue Stacking

Yes, SAInt can report separate revenue streams for a single storage asset participating in multiple services.

Revenue from spinning reserve (modeled as an ancillary service) can be calculated. One of the way is to use the following table expression in the Command Window:

table("ASVCX.{Name}.Val * ASVC.{Name}.PSHDW")

  • ASVC is the Ancillary Service object.
  • ASVCX is the external contributor to the ancillary service (e.g., the storage asset).
  • Val indicates the amount contributed to the ancillary service.
  • PSHDW represents the shadow price of meeting the ancillary service requirement.

Note that the reserve requirements will be defined by the MinVal property of all ASVC objects.

Revenue from energy arbitrage can be calculated using the following table expression:

table("ESTR.{Name}.P * ENO.{Name}.PSHDW")

  • ESTR is the storage object.
  • P represents the storage active power output.
  • ENO is the node where the storage object is installed.
  • PSHDW here is the shadow price of nodal active power balance (energy market clearing price).

Additionally, note that each ASVCX object can have a defined bid price for reserve market participation. This can be:

  • Set statically at the network level using ASVCPriceDef, or
  • Made time-dependent at the scenario level using an ASVCPrice Event with a Profile.

Modeling Framework & Workflow Sequencing

You can use a Production Cost Model (PCM) alone to model the hybrid battery behavior described. A Capacity Expansion Model (CEM) is not necessary unless your study includes long-term system planning or generation investment.

Scenario-Specific Modeling:

  • Price Signals: Implement Scenario-specific prices using different Profiles, which can be assigned directly per Scenario and linked to Events for time-based or conditional activation.
  • Constraints:
    • Use Events to apply Scenario-specific operational constraints.
    • Apply custom Constraints at the Network level. These can be activated selectively per Scenario using either the Inservice property or through an OFF Scenario Event.

Storage Behavior Control

There are multiple ways to model a hybrid service schedule for electric battery storage in SAInt:

  • Use the PGMAX (maximum discharge) and/or PDMAX (maximum charge) Event properties to dynamically control the available capacity for both energy market participation and reserve services.
  • Alternatively, define a custom constraint using electric variables:
    • PG (active power discharge) and PD (active power charge) to control the battery’s participation in the energy market.
    • VAL to control the battery’s contribution to spinning reserve.

Market Price Input:

To simulate arbitrage behavior based on hourly prices:

  1. Create an XGEN object to provide energy at the market price.
  2. Assign a Profile containing your time-series price data to the Scenario.
  3. Link the Profile to the XGEN using a VOMPrice Event.

Workflow Suggestion

We recommend first constructing a “Base Case” Scenario, where the battery participates freely in both energy and reserve markets without restrictions. From this base, you can create additional “clones” Scenario to simulate time-restricted behavior. For example, disabling energy arbitrage between 12:00 and 16:00 while still allowing reserve provision.

Approach Validation

Your proposed modeling approach is valid. Here’s a quick summary:

  • You should use a “Base Case” Sceanrio where the battery can participate in both markets.
  • Time-dependent operational constraints can be used to restrict when each service is active.
  • The price profile can be implemented as described above.
  • Co-optimization of energy and reserves will be performed by default. Energy demand will be specified by the PSET property of all EDEM objects.
1 Like