Skip to content

DISPATCHLOAD_BNC

DISPATCHLOAD_BNC was discontinued on 30 September 2009. Prior: DISPATCHLOAD_BNC gives binding intra-regional network constraints (BNC) re-run dispatch results for all scheduled generating units. DISPATCHLOAD_BNC has a similar structure to DISPATCHLOAD but does not repeat input type data (e.g. InitialMW, AGCStatus) since these values are available from DISPATCHLOAD.

Deprecation Warning

This table is in the HISTORICAL TABLES package, so is likely deprecated.

DISPATCHLOAD_BNC was discontinued on 30 September 2009.

In accordance with the "Arrangements for Managing Risks Associated with Transmission Network Congestion" set of rule changes the Dispatch Binding Network Constraints re-run was discontinued on September 30, 2009.

Source

The occurrences of Over-constrained dispatch (OCD) or binding intra-regional network constraints (BNC) re-runs are ad hoc, with significant dependencies on the configuration or events in the physical power system. Potentially updated every 5 minutes.

DISPATCHLOAD_BNC shows data produced every 5 minutes for all units when they have over-constrained dispatch, with own data being confidential until the next day.

Volume

Rows per day: ~14000

Mb per month: 25% of DISPATCHLOAD

The basis of estimation on the number of rows is on a 25% occurrence rate for BNC runs

Note

A flag exists for each ancillary service type such that a unit trapped or stranded in one or more service type can be immediately identified. The flag is defined as follows:

Flag Name Bit Description Field value
Enabled 0 The unit is enabled to provide this ancillary service type. >1
Trapped 1 The unit is enabled to provide this ancillary service type, however the profile for this service type is causing the unit to be trapped in the energy market. 3
Stranded 2 The unit is bid available to provide this ancillary service type, however, the unit is operating in the energy market outside of the profile for this service type and is stranded from providing this service. 4

Tip

1 second, 6 second, 5 minute, 60 second and regulation refer to types of FCAS markets.

Column Schema

DUID

Dispatchable unit identifier

Warning

This column may contain funny characters such as / (slash) or # (hash). This may break hive-style partitioning.

For more information, see the dedicated documentation page.

SQL Type: VARCHAR2(10) Polars Type: pl.Categorical

This column is mandatory, and a primary key.

Example: W/HOE#2

INTERVENTION

Intervention flag if intervention run

For more information, see the dedicated documentation page.

SQL Type: NUMBER(2,0) Polars Type: pl.Boolean

This column is mandatory, and a primary key.

SETTLEMENTDATE

End date and time of the dispatch interval

Warning

Despite what the name suggests, this is a datetime, not a date.

SQL Type: DATE Polars Type: pl.Datetime()

This column is mandatory, and a primary key.

Example: 2026/01/20 00:05:00

RUNNO

Dispatch run no; always 1

This column only ever takes one value: 1

(The SQL type is NUMBER(3,0).)

AEMO marked this column as mandatory, and a primary key. However, since it only ever takes one value, you can ignore it.

CONNECTIONPOINTID

Connection point identifier for DUID

SQL Type: VARCHAR2(12) Polars Type: pl.Categorical

This column is not mandatory.

DISPATCHMODE

Dispatch mode for fast start plant (0 to 4).

SQL Type: NUMBER(2,0) Polars Type: pl.Int8

This column is not mandatory.

LASTCHANGED

Last date and time record changed

For more information, see the dedicated documentation page.

SQL Type: DATE Polars Type: pl.Datetime()

This column is not mandatory.

Example: 2026/01/20 00:05:00

LOWER5MIN

Lower 5 min reserve target

SQL Type: NUMBER(15,5) Polars Type: pl.Float64

This column is not mandatory.

LOWER5MINFLAGS

Lower 5min status flag

SQL Type: NUMBER(3,0) Polars Type: pl.Boolean

This column is not mandatory.

LOWER6SEC

Lower 6 sec reserve target

SQL Type: NUMBER(15,5) Polars Type: pl.Float64

This column is not mandatory.

LOWER6SECFLAGS

Lower 6sec status flag

SQL Type: NUMBER(3,0) Polars Type: pl.Boolean

This column is not mandatory.

LOWER60SEC

Lower 60 sec reserve target

SQL Type: NUMBER(15,5) Polars Type: pl.Float64

This column is not mandatory.

LOWER60SECFLAGS

Lower 60sec status flag

SQL Type: NUMBER(3,0) Polars Type: pl.Boolean

This column is not mandatory.

LOWERREG

Lower Regulation reserve target

SQL Type: NUMBER(15,5) Polars Type: pl.Float64

This column is not mandatory.

LOWERREGFLAGS

Lower Reg status flag

SQL Type: NUMBER(3,0) Polars Type: pl.Boolean

This column is not mandatory.

RAISE5MIN

Raise 5 min reserve target

SQL Type: NUMBER(15,5) Polars Type: pl.Float64

This column is not mandatory.

RAISE5MINFLAGS

Raise 5min status flag

SQL Type: NUMBER(3,0) Polars Type: pl.Boolean

This column is not mandatory.

RAISE6SEC

Raise 6 sec reserve target

SQL Type: NUMBER(15,5) Polars Type: pl.Float64

This column is not mandatory.

RAISE6SECFLAGS

Raise 6sec status flag

SQL Type: NUMBER(3,0) Polars Type: pl.Boolean

This column is not mandatory.

RAISE60SEC

Raise 60 sec reserve target

SQL Type: NUMBER(15,5) Polars Type: pl.Float64

This column is not mandatory.

RAISE60SECFLAGS

Raise 60sec status flag

SQL Type: NUMBER(3,0) Polars Type: pl.Boolean

This column is not mandatory.

RAISEREG

Raise Regulation reserve target

SQL Type: NUMBER(15,5) Polars Type: pl.Float64

This column is not mandatory.

RAISEREGFLAGS

Raise Reg status flag

SQL Type: NUMBER(3,0) Polars Type: pl.Boolean

This column is not mandatory.

TOTALCLEARED

Target MW for end of period

SQL Type: NUMBER(15,5) Polars Type: pl.Float64

This column is not mandatory.

Code Examples

Polars

Casting is enums, categoricals etc is not essential, but may speed up parsing. Swapping int for pl.UInt16, pl.Int32 would also speed up parsing. However some of the datatypes are inferred, so they may be wrong.

This code deduplicates for you. Deduplication is normally only required across multiple months.

This code assumes that all columns are present, which may not be true for older files.

import polars as pl
import polars.selectors as cs

# e.g. "2029/03/15 00:05:00"
dt_s_fmt = "%Y/%m/%d %H:%M:%S"

csv_paths = ["SOMEFILE.CSV", "OTHERFILE.CSV"]

lf = (
    pl.concat(
        [
            pl.scan_csv(
                csv_path,  # must be unzipped beforehand
                skip_rows=1,  # skip the header
                infer_schema=False,  # much faster
            )
            .filter(cs.by_index(0) == "D")  # drop the footer
            .select(~cs.by_index(range(4)))  # drop metadata columns
            for csv_path in csv_paths
        ],
        how="diagonal_relaxed",
    )
    .with_columns(
        pl.col("SETTLEMENTDATE", "LASTCHANGED").str.strptime(pl.Datetime, dt_s_fmt),
    )
    # Polars can't cast string straight to bool. Need to go via something else.
    .cast(
        {
            "INTERVENTION": pl.UInt8,
            "LOWER5MINFLAGS": pl.UInt8,
            "LOWER6SECFLAGS": pl.UInt8,
            "LOWER60SECFLAGS": pl.UInt8,
            "LOWERREGFLAGS": pl.UInt8,
            "RAISE5MINFLAGS": pl.UInt8,
            "RAISE6SECFLAGS": pl.UInt8,
            "RAISE60SECFLAGS": pl.UInt8,
            "RAISEREGFLAGS": pl.UInt8,
        }
    )
    .cast(
        {
            "DUID": pl.Categorical,
            "INTERVENTION": pl.Boolean,
            "RUNNO": pl.Enum(["1"]),
            "CONNECTIONPOINTID": pl.Categorical,
            "DISPATCHMODE": int,  # or pl.Int8
            "LOWER5MIN": pl.Float64,
            "LOWER5MINFLAGS": pl.Boolean,
            "LOWER6SEC": pl.Float64,
            "LOWER6SECFLAGS": pl.Boolean,
            "LOWER60SEC": pl.Float64,
            "LOWER60SECFLAGS": pl.Boolean,
            "LOWERREG": pl.Float64,
            "LOWERREGFLAGS": pl.Boolean,
            "RAISE5MIN": pl.Float64,
            "RAISE5MINFLAGS": pl.Boolean,
            "RAISE6SEC": pl.Float64,
            "RAISE6SECFLAGS": pl.Boolean,
            "RAISE60SEC": pl.Float64,
            "RAISE60SECFLAGS": pl.Boolean,
            "RAISEREG": pl.Float64,
            "RAISEREGFLAGS": pl.Boolean,
            "TOTALCLEARED": pl.Float64,
        }
    )
    # Drop deprecated/unused columns
    .drop("RUNNO")
    # Deduplicate
    # We want one row per ['DUID', 'INTERVENTION', 'RUNNO', 'SETTLEMENTDATE']
    # Tie-breaker: greatest value of ['LASTCHANGED']
    .sort(["LASTCHANGED"], descending=False)
    .unique(subset=["DUID", "INTERVENTION", "RUNNO", "SETTLEMENTDATE"], keep="last")
)

Nemosis

This table is not yet available in Nemosis.

Availability

AEMO's documentation states that this table's visibility is "Private & Public Next-Day". However, it is not available in the public monthly MMSDM archive. AEMO probably call this public because it is available to all market participants over private FTP.

There is a chance that is is still public to non-participants. It may only be available for some months; or (rarely) it may be available in a non-standard location.

Deduplication and PDR Loader Configuration

The primary keys are:

The transaction type is "insert", which means that you will usually not see duplicate data. If you do, you can deduplicate based on the primary keys, without sorting first. Rows from different files with the same primary keys should have the same values.

PDR Loader configuration is:

Report Name Report Subtype Version
DISPATCHBNC UNITSOLUTION 1
DISPATCHBNC UNIT_SOLUTION 1

This means that the CSV files start with metadata columns:

I,DISPATCHBNC,UNITSOLUTION,1,...
D,DISPATCHBNC,UNITSOLUTION,1,...

or

I,DISPATCHBNC,UNIT_SOLUTION,1,...
D,DISPATCHBNC,UNIT_SOLUTION,1,...

Indexes

There is more than one index.

Index 1:

Index 2:

This page as JSON (schema documented here, but may change)

Download a JSON Schema specification for this table.

Official AEMO schema documentation

Other Information

Package: HISTORICAL TABLES