DER Scheduler North Plugin

The DER Scheduler North Plugin combines a general purpose IEC 61850 server with a DER (Distributed Energy Resources) scheduler according to IEC TR 61850-90-10. 


It uses libiec61850 to implement an IEC 61850 server and DER-Scheduling to implement the IEC TR 61850-90-10 compliant scheduler.


The plugin can send operations to the south using the FledgePower pivot data format. It can also send schedule forecasts (as a time series of setpoints for a configurable time period) as operations to the south.


From the south the plugin can receive reading in the FledgePower pivot data format to update data in the IEC 61850 server data model.

Configuration

The IEC 61850 protocol stack configuration specifies communication parameters and is a collection of entries containing information about OSI Transport and OSI Application layers objects.

Each entry is comprised of attributes that describe the object. All the configuration data are structured using JSON.

Each entry shall be mapped with the corresponding configuration function in the chosen implementation protocol library.

Attributes definition 

Protocol stack parameters:


Attributes

Definition

Example

Required

version

version number of the configuration file

2 digits x.y => x = major change, y = minor change

Yes

name

this identifies the protocol stack

iec61850scheduler

Yes

transport_layer.srv_ip

IP address of the server

0.0.0.0

127.0.0.1

?





transport_layer.port

TCP port of the server

102

No (default is 102)

transport_layer.use_scheduler

Enable the scheduler

true

No (default is “false”)

Path of file

This specifies the path to the data model configuration file.


Scheduler configuration:


Attributes

Definition

Example

Required

targets

array of “targets” of the scheduler. A target refers to a scheduler controller LN (FSCC)


Optional

target.schedCtrlRef

object reference of the schedule controller LN

@Control/InjctP_FSCC1

Yes

target.forwardOutput

Enable or disable forwarding the schedule output to the south

true (false)

default: true

target.forwardSchedule

Enable or disable forwarding resulting schedule to the south

false (true)

default: false

target.forwardSchedulePeriod

forecast period for the result schedule in seconds

86400

No (default is 102)

schedules

array of configuration object for schedules. Allows to change settings for specific schedule LNs (FSCH)


Optional

schedules.scheduleRef

object reference of the schedule LN

@Control/InjctP_ResFSCH01

Yes

schedules.enableScheduleControl

Allows client to enable/disable schedule online

true (false)

default: true

schedules.enabled

Enables schedule on startup

false(true)

default: false

schedules.parameters

Specify access rights to specific schedule attributes


Optional

schedules.parameters.parameter

schedule attribute

One of SCHED_PARAM_STR_TMSCHED_PARAM_SCHD_PRIO, SCHED_PARAM_SCHD_REUSE



schedules.parameters.enableWriteAccess

enable or disable write access to a specific schedule attribute

true/false



Configuration structure


{
  "scheduler_conf": {
    "targets": [
      {
        "schedCtrlRef": "@Control/InjctP_FSCC1",
        "forwardOutput": false,
        "forwardSchedule": true,
        "forwardScheduleInterval": 5,
        "forwardSchedulePeriod": 86400
      },
      {
        "schedCtrlRef": "@Control/WthdrwP_FSCC1",
        "forwardOutput": false,
        "forwardSchedule": true,
        "forwardScheduleInterval": 5,
        "forwardSchedulePeriod": 86400
      }
    ],
    "schedules": [
      {
        "scheduleRef": "@Control/InjctP_ResFSCH01",
        "enableScheduleControl": false,
        "enabled": true,
        "parameters": [
          {
            "parameter": "SCHED_PARAM_STR_TM",
            "enableWriteAccess": false
          },
          {
            "parameter": "SCHED_PARAM_SCHD_PRIO",
            "enableWriteAccess": false
          }
        ]
      },
      {
        "scheduleRef": "@Control/WthdrwP_ResFSCH01",
        "enableScheduleControl": false,
        "enabled": true,
        "parameters": [
          {
            "parameter": "SCHED_PARAM_STR_TM",
            "enableWriteAccess": false
          },
          {
            "parameter": "SCHED_PARAM_SCHD_PRIO",
            "enableWriteAccess": false
          }
        ]
      }
    ],
    "storage": {
      "databaseUri": "scheduler-db.json",
      "parameters": []
    }
  }
}


Exchanged Data:


Attributes

Definition

Example

Required

datapoints

Exchange data object array


Yes

datapoints.pivot_id

Pivot_id used in filters


Yes

datapoints.label

Datapoint label


Yes

datapoints.protocols



Yes

datapoints.protocols.name

Protocol name (iec61850)


Yes

datapoints.protocols.objref

Data object’s object reference


Yes

datapoints.protocols.cdc

Pivot CDC class

“SpcTyp”

Yes

Datapoints in exchanged data must be data objects and not attributes, otherwise they won’t work, specific data attributes are chosen in dataset configuration


Example:

{
 "exchanged_data": {
  "datapoints": [
   {
    "pivot_id": "TS1",
    "label": "TS1",
    "protocols": [
     {
      "name": "iec61850",
      "objref": "simpleIOGenericIO/GGIO1.SPCSO1",
      "cdc": "SpcTyp"
     }
    ]
   },
   {
    "pivot_id": "TS2",
    "label": "TS2",
    "protocols": [
     {
      "name": "iec61850",
      "objref": "simpleIOGenericIO/GGIO1.SPCSO2",
      "cdc": "SpcTyp"
     }
    ]
   },
   {
    "pivot_id": "TS3",
    "label": "TS3",
    "protocols": [
     {
      "name": "iec61850",
      "objref": "simpleIOGenericIO/GGIO1.SPCSO3",
      "cdc": "SpcTyp"
     }
    ]
   },
   {
    "pivot_id": "TS4",
    "label": "TS4",
    "protocols": [
     {
      "name": "iec61850",
      "objref": "simpleIOGenericIO/GGIO1.SPCSO4",
      "cdc": "SpcTyp"
     }
    ]
   },
   {
    "pivot_id": "TM1",
    "label": "TM1",
    "protocols": [
     {
      "name": "iec61850",
      "objref": "simpleIOGenericIO/GGIO1.AnIn1",
      "cdc": "MvTyp"
     }
    ]
   },
   {
    "pivot_id": "TM2",
    "label": "TM2",
    "protocols": [
     {
      "name": "iec61850",
      "objref": "simpleIOGenericIO/GGIO1.AnIn2",
      "cdc": "MvTyp"
     }
    ]
   },
   {
    "pivot_id": "TM3",
    "label": "TM3",
    "protocols": [
     {
      "name": "iec61850",
      "objref": "simpleIOGenericIO/GGIO1.AnIn3",
      "cdc": "MvTyp"
     }
    ]
   },
   {
    "pivot_id": "TM4",
    "label": "TM4",
    "protocols": [
     {
      "name": "iec61850",
      "objref": "simpleIOGenericIO/GGIO1.AnIn4",
      "cdc": "MvTyp"
     }
    ]
   }
  ]
 }
}

PIVOT datapoint representation

This plugin uses the PIVOT datapoint representation, check it out here:

Here are the supported CDC Classes:

CDC Class

Pivot CDC

SPS

SpsTyp

DPS

DpsTyp

INS

InsTyp

ENS

EnsTyp

MV

MvTyp

BSC

BscTyp

SPC

SpcTyp

DPC

DpcTyp

APC

ApcTyp

INC

IncTyp


Monitoring direction: 

<Root>.<type>

{CDC}



<Root>.<type>.q.operatorBlocked

Boolean

false


<Root>.<type>.q.Source = "substituted"

String

"process"

"process" | "substituted"

<Root>.<type>.q.test

Boolean

false


<Root>.<type>.q.Validity = "invalid"

String

"good"

"good" | "invalid" | "reserved" | "questionable"

<Root>.<type>.q.Validity = "questionable"

<Root>.<type>.q.DetailQuality.oldData = true

String

"good"

"good" | "invalid" | "reserved" | "questionable"

<Root>.<type>.q.Validity = "questionable"

<Root>.<type>.q.DetailQuality.overflow = true

Boolean

false


<Root>.<type>.t.SecondSinceEpoch

Integer



<Root>.BscTyp.valWTr.posVal

Integer


Int 8

<Root>.BscTyp.valWTr.transInd

Boolean


Boolean

<Root>.Cause.stVal

Integer


See Cause of Transmission

<Root>.ComingFrom

String



<Root>.Confirmation.stVal

Boolean

false


<Root>.DpsTyp.stVal

String


intermediate-state | off | on | bad-state

<Root>.Identifier

String


exchanged_data.datapoints.pivot_id


<Root>.MvTyp.mag.f

Float


Float 32

<Root>.MvTyp.mag.i

Integer


Int 32

<Root>.SpsTyp.stVal

Boolean



<Root>.TmOrg.stVal

String


"genuine" |  "substituted"

<Root>.TmValidity.stVal = "invalid"

String

"good"

"good" | "invalid" | "reserved" | "questionable"

Control Direction:

Key

Type

Default Value

Notes

<Root>.Cause.stVal

Integer


See Cause of Transmission

<Root>.ComingFrom

String


This plugin should always use the value "iec104" when converting to pivot

<Root>.Identifier

String


exchanged_data.datapoints.pivot_id


<Root>.Select.stVal

Boolean

false

  • 0 is mapped with false, for Execute

  • 1 is mapped with true, for Select before Execute

<Root>.<type>

{CDC}


exchanged_data.datapoints.pivot_type

(see <type> conversion table above)

<Root>.<type>.q.test

Boolean

false


<Root>.<type>.t.SecondSinceEpoch

Integer



<Root>.SpcTyp.ctlVal

Boolean


0 or 1

<Root>.DpcTyp.ctlVal

String


intermediate-state | off | on | bad-state

<Root>.IncTyp.ctlVal

Integer


Int 32

<Root>.ApcTyp.ctlVal

Float


Float 32

<Root>.BscTyp.ctlVal

String


stop | lower | higher | reserved

Example datapoint:

 {"GTIC":{"ComingFrom":"iec61850", "SpcTyp":{"q":{"test":0}, "t":{"SecondSinceEpoch":1700566837, "FractionOfSecond":15921577}, "ctlVal":1}, "Identifier":"TS1", "Select":{"stVal":0}}}