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 | ||
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:
|
| ||
| Boolean | false | |
| String | "process" | "process" | "substituted" |
| Boolean | false | |
| String | "good" | "good" | "invalid" | "reserved" | "questionable" |
| String | "good" | "good" | "invalid" | "reserved" | "questionable" |
| Boolean | false | |
| Integer | ||
| Integer | Int 8 | |
| Boolean | Boolean | |
| Integer | ||
| String | ||
| Boolean | false | |
| String | intermediate-state | off | on | bad-state | |
| String | exchanged_data.datapoints.pivot_id | |
| Float | Float 32 | |
| Integer | Int 32 | |
| Boolean | ||
| String | "genuine" | "substituted" | |
| String | "good" | "good" | "invalid" | "reserved" | "questionable" |
Control Direction:
Key | Type | Default Value | Notes |
---|---|---|---|
| Integer | ||
| String | This plugin should always use the value "iec104" when converting to pivot | |
| String | exchanged_data.datapoints.pivot_id | |
| Boolean | false |
|
|
| exchanged_data.datapoints.pivot_type (see | |
| Boolean | false | |
| Integer | ||
| Boolean | 0 or 1 | |
| String | intermediate-state | off | on | bad-state | |
| Integer | Int 32 | |
| Float | Float 32 | |
| 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}}}