BESS GADS Performance

Prev Next

BESS GADS Performance

Bazefield Core automates NERC GADS Storage Group Performance tracking for Battery Energy Storage Systems (BESS). Rather than requiring operators to manually assign operating states, a built-in Script Service job continuously reads device-level status signals, applies NERC priority rules, and writes the resulting allocations — ready for direct export to NERC's GADS submission tool.

Regional applicability: NERC GADS reporting applies to North American generation owners and operators subject to NERC Reliability Standards or voluntary GADS reporting programs. For a full introduction to GADS in Bazefield, see GADS Reporting in Bazefield.


How it works

Bazefield models a BESS plant using a two-level hierarchy: each GADS Energy Storage Group (the NERC reporting unit) contains one or more Power Conversion System (PCS) child objects. Each PCS carries a set of seven boolean EVENT-* data points that are continuously updated from the SCADA/historian to reflect the current operating state of that unit.

The GADS Energy Storage Performance Script runs on a recurring schedule against every GADS Energy Storage Group in the system. On each run it:

  1. Reads the EVENT-* boolean tags for all PCS children of the group over the configured look-back window.

  2. Applies NERC priority rules to determine the dominant state at each time step (see Operating states and priority below).

  3. Creates or updates allocations in the ESS_GADS allocation type on the storage group, segmented by NERC category (e.g. Charging/ChgHrs, Forced/StorageFOH).

These allocations are what the GADS Reporting application reads when generating the monthly Performance submission file. No manual time-booking is required — the script keeps the allocation record continuously up to date.


Script schedule

The script is installed as a per-object Script Service job and runs on every GADS Energy Storage Group object independently.

Trigger

Look-back window

Purpose

Every 3 hours (continuous)

25 hours

Near-real-time allocation maintenance. Keeps the current day current and provides a 1-hour overlap to catch any late-arriving historian data.

Daily at midnight (00:00)

744 hours (31 days)

Monthly reconciliation pass. Re-processes the full rolling month to correct any gaps or restatements from delayed data.

Note: The cron expression is 25 10 */3 1/1 * ? * — runs at 10 minutes 25 seconds past the hour, every 3 hours. The midnight reconciliation is triggered by checking whether the run time falls at hour 0.


Operating states and priority

Each PCS unit reports its state through boolean data points. When multiple states are simultaneously active — or when different PCS units within a group report different states — the script resolves the conflict using the NERC-aligned priority table below. Lower priority number wins.

Data point

Priority

NERC category / GADS field

Description

EVENT-Charging

1

Charging/ChgHrs

System is actively charging energy from the grid or generation source.

EVENT-Discharging

1

Discharging/DisChgHrs

System is actively discharging energy to the grid.

EVENT-Idle

3

Idle

System is available but neither charging nor discharging (standby or ancillary service mode).

EVENT-InfoUnavailable

4

Information Unavailable

No reliable performance information is available for the group (e.g. communications loss).

EVENT-Forced

5

Forced/StorageFOH

Unplanned forced outage — the storage group is unavailable due to an unscheduled failure.

EVENT-Maintenance

5

Maintenance/StorageMOH

Scheduled maintenance outage — the group is out of service for planned maintenance.

EVENT-Planned

5

Planned/StoragePOH

Planned outage — the group is out of service for a pre-scheduled reason other than maintenance.

Priority resolution: Charging and Discharging share priority 1 because they are mutually exclusive operating states. When Forced, Maintenance, and Planned all share priority 5, the first active signal in the time window is used. Outage states only take effect when none of the higher-priority operational or idle states are active.


Data model components

All components listed below are installed by the Core GADS package.

Component

Installed on

Type

Purpose

GADS Energy Storage Group

Storage Group object (type 801)

Asset type

The NERC reporting unit. Carries storageGroupID, plantID, rated capacity, and time zone attributes. Groups one or more PCS child objects and hosts the ESS_GADS allocation type.

Core GADS ESG Calcs

GADS Energy Storage Group

Point template (CPT)

Provides the seven EVENT-* boolean points (mapped per-site to SCADA/historian state signals) plus ActivePower, ChargeGeneration, and DischargeGeneration calculated aggregates used in the performance export.

ESG Calc GADS Events

GADS Energy Storage Group

Event template

Maps each EVENT-* point to its corresponding ESS_GADS allocation category. Enables the Bazefield event engine to automatically raise and close allocation records when a tag transitions.

GADS Energy Storage Performance Script

GADS Energy Storage Group

Script Service job

Core automation. Runs on schedule, reads child PCS EVENT-* tags, resolves priority conflicts, and writes allocations to ESS_GADS on the storage group.

ESS_GADS allocation type

GADS Energy Storage Group

Allocation type

Holds the resolved performance allocations across the seven NERC categories. This is the data source consumed by the GADS Reporting export.

Calculated points on the storage group

The Core GADS ESG Calcs template installs three aggregate calculated points on the storage group that feed the performance export:

Point name

Unit

Interval

Description

ActivePower

MW

5 min

Sum of active power across all child PCS units (aggregated from kW). Negative values indicate charging; positive values indicate discharging.

ChargeGeneration

MWh

Monthly (daily sub-period)

Total energy charged into the storage group for the month. Sums ChargingEnergy from all child PCS objects.

DischargeGeneration

MWh

Monthly (daily sub-period)

Total energy discharged from the storage group for the month. Sums DischargingEnergy from all child PCS objects.


Prerequisites for submission

Before generating a BESS GADS Performance submission from the GADS Reporting application, confirm the following are in place:

  • Each BESS plant has a GADS Energy Storage Group object with storageGroupID, plantID, rated capacity, and time zone attributes populated.

  • Child PCS objects are linked to the storage group via the GADSStorageGrpId attribute.

  • The Core GADS ESG Calcs point template is installed on the storage group, and all seven EVENT-* boolean tags are mapped to the appropriate SCADA/historian source points for each PCS.

  • The GADS Energy Storage Performance Script is active in Script Service and has completed at least one successful run. Verify in the Script Service log that allocations were written without errors.

  • The ESS_GADS allocation type is present on the storage group and contains allocations covering the reporting month.

  • Historian data for ChargingEnergy and DischargingEnergy on each child PCS is available and flowing.


Generating the submission

Once the script has populated the ESS_GADS allocations, use the GADS Reporting application to export the monthly performance file. The application reads the ESS_GADS allocation hours and the calculated energy totals from the storage group, and formats them for direct submission to NERC.

For the step-by-step export workflow, see GADS Energy Storage Performance Submission.

For BESS event reporting (outage cause codes, system description, event files), see GADS Energy Storage Event Submission.


Troubleshooting

Symptom

What to check

No allocations in ESS_GADS for the reporting month

Confirm the GADS Energy Storage Performance Script is enabled and scheduled correctly in Script Service. Check the script run log for errors. Verify that child PCS objects have the GADSStorageGrpId attribute set and that the storage group object ID matches.

Hours do not add up to the full period

Check whether any EVENT-* tags have gaps or are flat-lined at zero for extended periods. The script only creates allocations for time windows where at least one boolean is active — gaps in the tag history appear as gaps in the allocation record.

ChargeGeneration or DischargeGeneration shows zero or NaN

Confirm that ChargingEnergy and DischargingEnergy historian points exist on each child PCS object and have data for the period. The calculated points aggregate across all children — if no valid children are found, the result is NaN.

Allocations look wrong after a data correction

The midnight run re-processes 31 days and overwrites stale allocations automatically. If an immediate correction is needed, trigger the script manually from Script Service or wait for the next scheduled run.