...
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 |
| Yes |
datasets.dynamic | If dataset is dynamic, 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 | No | |
report_subscription.trgops | RCB trigger options | ["data_changed","quality_changed"] | No |
report_subscription.buftm | RCB buffer time in ms | No | |
report_subscription.intgpd | No | ||
Force GI 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 datapoint:
{"GTIC":{"ComingFrom":"iec61850", "SpcTyp":{"q":{"test":0}, "t":{"SecondSinceEpoch":1700566837, "FractionOfSecond":15921577}, "ctlVal":1}, "Identifier":"TS1", "Select":{"stVal":0}}}
...
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.
...