IEC 61850 south plugin
IEC 61850 Protocol stack 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
Transport layer
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 | iec104client, iec104server, tase2client, tase2server, 61850client, 61850server, etc... | Yes |
ied_name | IED name | any non empty string | Yes |
connections.srv_ip | IP address to remote IED server | IP address | Yes |
connections.port | port number to remote IED server | default = 102 | Yes |
connections.osi.remote_tsel | remote transport layer address | valid TSelector | No |
connections.osi.remote_ssel | remote session layer address | valid SSelector | No |
connections.osi.remote_psel | remote presentation layer address | valid PSelector | No |
connections.osi.remote_ap_title | remote OSI AP Title | any non empty string following the format "int0,int1,int2,int3", ex: 1,3,9999,23 | No |
connections.osi.remote_ae_qualifier | remote OSI AE Qualifier | integer | No |
connections.osi.local_tsel | local transport layer address | valid TSelector | No |
connections.osi.local_ssel | local session layer address | valid SSelector | No |
connections.osi.local_psel | local presentation layer address | valid PSelector | No |
connections.osi.local_ap_title | local OSI AP Title | any non empty string following the format "int0,int1,int2,int3", ex: 1,3,9999,23 | No |
connections.osi.local_ae_qualifier | local OSI AE Qualifier | integer | No |
connections | array of connections to IED | Yes | |
connections.tls | Use TLS | false | No |
Application Layer
Attributes | Definition | Example | Required |
---|---|---|---|
polling_interval | defines the polling interval in ms (0 = no polling) | 100 | Yes |
datasets | Array of datasets | No | |
datasets.dataset_ref | Dataset reference | Yes | |
datasets.entries | Array of dataset entries, each entry is build using this pattern: iedName+ldInst/prefix+lnClass+lnInst+doName NB: prefix is optional | "entries": [ "simpleIOGenericIO/GGIO1.AnIn1[MX]", "simpleIOGenericIO/GGIO1.AnIn2[MX]", "simpleIOGenericIO/GGIO1.AnIn3[MX]" ] This entry in the CID file: <FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="mag.f" /> should be translated to: simpleIOGenericIO/GGIO1.AnIn1[MX] | Yes |
datasets.dynamic | If dataset is set to dynamic = true then the client would try to create the dataset on the server, default is false (Static) | No | |
report_subscriptions | Array of report subscriptions | No | |
report_subscriptions.rcb_ref | Report Control Block Reference | Yes | |
report_subscriptions.dataset_ref | RCB dataset reference | Yes | |
report_subscription.trgops | RCB trigger options | "dchg": data_changed "qchg": quality_changed "dupd": data updated "period": data sent periodically "gi": general interrogation | : No |
report_subscription.buftm | RCB buffer time in ms, time to wait before sending value after event occured | No | |
report_subscription.intgpd | RCB integrity period in ms, report is periodically send for the period defined (this requires the trgops to be set to "integrity") | No | |
report_subscription.gi | Force GI (General Interrogation) when the RCB is enabled | No |
Configuration JSON structure
{ "protocol_stack": { "name": "iec61850client", "version": "0.0.1", "transport_layer": { "ied_name" : "IED1", "connections":[ { "ip_addr":"127.0.0.1", "port": 102, "osi": { "local_ap_title":"1,3,9999.13", "local_ae_qualifier":12, "remote_ap_title":"1,2,1200,15,3", "remote_ae_qualifier":1, "local_psel":"0x12,0x34,0x56,0x78", "local_ssel":"0,1,2,3,4", "local_tsel":"0x00,0x01,0x02", "remote_psel":"0x87,0x65,0x43,0x21", "remote_ssel":"0,1", "remote_tsel":"0x00,0x01" }, "tls" : false } ] }, "application_layer": { "polling_interval": 0, "datasets": [ { "dataset_ref": "simpleIOGenericIO/LLN0.AnalogueValues", "entries": [ "simpleIOGenericIO/GGIO1.AnIn1[MX]", "simpleIOGenericIO/GGIO1.AnIn2[MX]", "simpleIOGenericIO/GGIO1.AnIn3[MX]" ], "dynamic": true }, { "dataset_ref": "simpleIOGenericIO/LLN0.CustomDataset", "entries": [ "simpleIOGenericIO/GGIO1.AnIn1.mag.f[MX]", "simpleIOGenericIO/GGIO1.AnIn2.q[MX]", "simpleIOGenericIO/GGIO1.AnIn3.t[MX]" ], "dynamic": false } ], "report_subscriptions": [ { "rcb_ref" : "simpleIOGenericIO/LLN0.RP.EventsRCB", "dataset_ref" : "simpleIOGenericIO/LLN0.AnalogueValues", "trgops" : ["data_changed","quality_changed"], "buftm" : 10, "intgpd" : 23, "gi" : true }, { "rcb_ref" : "simpleIOGenericIO/LLN0.RP.EventsRCB", "dataset_ref" : "simpleIOGenericIO/LLN0.AnalogueValues", "trgops" : ["data_changed","quality_changed"], "buftm" : 10, "intgpd" : 23, "gi" : true } ] } } }
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:
<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 | ||
<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 | ||
<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 |
|
<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 of Datapoint:
{ "GTIC":{ "ComingFrom":"iec61850", "SpcTyp":{ "q":{ "test":0 }, "t":{ "SecondSinceEpoch":1700566837, "FractionOfSecond":15921577 }, "ctlVal":1 }, "Identifier":"TS1", "Select":{ "stVal":0 } } }
TLS configuration
The IEC61850 standard can also be used with TLS to realize secure and authenticated connections.
Parameters are needed to set up the TLS secured connection:
private_key | client private key | valid private key | YES |
own_cert | client certificate | valid certificate | YES |
ca_certs | allows to specify the ca certificates if not included in the owner certificate | list of valid certificates | NO |
remote_certs | allows to specify the server certificates, so if specified, only these certificates are accepted | list of valid certificates | NO |
Fledge's certificate store allows certificates to be stored and used by the south plugins.
{ "private_key":"iec104_client.key", "own_cert":"iec104_client.cer", "ca_certs":[ { "cert_file":"iec104_ca.cer" }, { "cert_file":"iec104_ca2.cer" } ], "remote_certs":[ { "cert_file":"iec104_server.cer" } ] }
Certificates and keys:
The certificates should be a .cert, .cer, .crt, .pem, .p12, .der file.
The keys should be a .key or .pem file.
Certificate store
Certificates and keys can be added by clicking the “Import” button in the Certificate Store tab in the Fledge GUI.
TLS Parameters
Set the key and certificate values in the TLS parameters section of the plugin configuration.