IEC 61850 Protocol stack configuration
...
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 |
No
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
Code Block | ||
---|---|---|
| ||
{ "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:
Code Block | ||
---|---|---|
| ||
{ "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
...
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:
...
Code Block | ||
---|---|---|
| ||
{ "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.
Code Block | ||
---|---|---|
| ||
{
"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.
...