Table of Contents |
---|
...
The pivot object model is based on 61850 semantic.
PIVOTTM PIVOT TM model, representation of a tele measurement
Attribute | Description | Expected values | Mandatory | |
---|---|---|---|---|
PIVOTTMPIVOT.GTIM.Beh.stVal | ? | |||
PIVOTTMPIVOT.GTIM.Cause.stVal | Cause of transmission | COT Cause of Transmission - FledgePower - LF Energy | Yes | |
PIVOTTMPIVOT.GTIM.ChgValCnt.stVal | ? | |||
PIVOTTMPIVOT.GTIM.ComingFrom | Source protocol name | IEC103, IEC104, TASE.2, OPCUA, 61850, etc... | Yes | |
PIVOTTMPIVOT.GTIM.Confirmation.stVal | ? | PIVOTTMIndicates positive or negative confirmation of activation | true, false, DEFAULT=false | |
PIVOT.GTIM.Identifier | Unique identifier of the pivot object | Any non-empty string | Yes | |
PIVOTTMPIVOT.GTIM.{CDC} | Common Data Class representing the information object | MVTyp | Yes | |
PIVOTTMPIVOT.GTIM.NormalSrc.stVal | ? | |||
PIVOTTMPIVOT.GTIM.NormalVal.stVal | ? | |||
PIVOTTMPIVOT.GTIM.TmOrg.stVal | Timestamp origin, genuine = source otherwise substituted | genuine, substituted, DEFAULT = genuine | Yes | |
PIVOTTMPIVOT.GTIM.TmValidity.stVal | Timestamp validity | valid, invalid, DEFAULT = valid | Yes |
...
Code Block | ||
---|---|---|
| ||
{ "@xmlns:xs": "http://www.w3.org/2001/XMLSchema", "PIVOTTMPIVOT": { "GTIM": { "Beh": { "stVal": "on" }, "Cause": { "stVal": 1 }, "ChgValCnt": { "stVal": 1 }, "ComingFrom": "String", "Confirmation": { "stVal": true }, "Identifier": "String", "MvTyp": { "mag": { "f": 0.1, "i": 1 }, "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "NormalSrc": { "stVal": "TELEMETERED" }, "NormalVal": { "stVal": "NORMAL" }, "Origin": { "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "stVal": "String", "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "TmOrg": { "stVal": "genuine" }, "TmValidity": { "stVal": "VALID" } } } } |
PIVOTTS PIVOT TS model, representation of a tele signal
Attribute | Description | Expected values | Mandatory | |
---|---|---|---|---|
PIVOTTSPIVOT.GTIS.Beh.stVal | ? | |||
PIVOTTSPIVOT.GTIS.Cause.stVal | Cause of transmission | COT Cause of Transmission - FledgePower - LF Energy | Yes | |
PIVOTTSPIVOT.GTIS.ChgValCnt.stVal | ? | |||
PIVOTTSPIVOT.GTIS.ComingFrom | Source protocol name | IEC103, IEC104, TASE.2, OPCUA, 61850, etc... | Yes | |
PIVOTTSPIVOT.GTIS.Confirmation.stVal | ? | PIVOTTSIndicates positive or negative confirmation of activation | true, false, DEFAULT=false | |
PIVOT.GTIS.Identifier | Unique identifier of the pivot object | Any non-empty string | Yes | |
PIVOTTSPIVOT.GTIS.{CDC} | Common Data Class representing the information object | SPSTyp, DPSTyp, BSCTyp | Yes | |
PIVOTTSPIVOT.GTIS.NormalSrc.stVal | ? | |||
PIVOTTSPIVOT.GTIS.NormalVal.stVal | ? | |||
PIVOTTSPIVOT.GTIS.TmOrg.stVal | Timestamp origin, genuine = source otherwise substituted | genuine, substituted, DEFAULT = genuine | Yes | |
PIVOTTSPIVOT.GTIS.TmValidity.stVal | Timestamp validity | valid, invalid, DEFAULT = valid | Yes |
...
Code Block | ||
---|---|---|
| ||
{ "@xmlns:xs": "http://www.w3.org/2001/XMLSchema", "PIVOTTSPIVOT": { "GTIS": { "Beh": { "stVal": "on" }, "Cause": { "stVal": 1 }, "ChgValCnt": { "stVal": 1 }, "ComingFrom": "String", "Confirmation": { "stVal": true }, "DpsTyp": { "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "stVal": "intermediate-state", "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "Identifier": "String", "NormalSrc": { "stVal": "TELEMETERED" }, "NormalVal": { "stVal": "NORMAL" }, "Origin": { "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "stVal": "String", "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "SpsTyp": { "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "stVal": true, "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "TmOrg": { "stVal": "genuine" }, "TmValidity": { "stVal": "VALID" } } } } |
PIVOTTC PIVOT TC model, representation of a tele command
Attribute | Description | Expected values | Mandatory | |
---|---|---|---|---|
PIVOTTCPIVOT.GTIC.Beh.stVal | ? | |||
PIVOTTC.GTIC.Cause.stVal | Cause of transmission | COT Cause of Transmission - FledgePower - LF Energy | Yes | |
PIVOTTC.GTIC.ComingFrom | Source protocol name | IEC103,defines different behaviours of a control object: - Direct control with normal security: dct-ctl-wns | enum: dct-ctl-wns, dct-ctl-wes, sbo-ctl-wns, sbo-ctl-wes, DEFAULT = dct-ctl-wes | No |
PIVOT.GTIC.Cause.stVal | Cause of transmission | COT Cause of Transmission - FledgePower - LF Energy | No | |
PIVOT.GTIC.ComingFrom | Source protocol name | IEC103, IEC104, TASE.2, OPCUA, 61850, etc... | Yes | |
PIVOTTCPIVOT.GTIC.DevId.name | ? | No | ||
PIVOTTCPIVOT.GTIC.{CDC} | Common Data Class representing the information object | SPCTyp, DPCTyp, INCTyp, APCTyp, BSCTyp | Yes | |
PIVOTTCPIVOT.GTIC.Identifier | Unique identifier of the pivot object | Any non-empty string | Yes | |
PIVOTTCPIVOT.GTIC.Qu.stVal | ? | No | ||
PIVOTTCPIVOT.GTIC.ServiceType.stVal | ? | No | ||
PIVOTTCPIVOT.GTIC.Tag.stVal | ? | No | ||
PIVOTTCPIVOT.GTIC.TagClass | ? | No | ||
PIVOTTCPIVOT.GTIC.TaggedReason | ? | No | ||
PIVOTTCPIVOT.GTIC.TmOrg | Timestamp origin, genuine = source otherwise substituted | genuine, substituted, DEFAULT = genuine | YesNo | |
PIVOTTCPIVOT.GTIC.TmStamp | Timestamp | YesNo |
Example of a pivot model instance representing a Tele Command:
Code Block | ||
---|---|---|
| ||
{ "@xmlns:xs": "http://www.w3.org/2001/XMLSchema", "PIVOTTCPIVOT": { "GTIC": { "Beh": { "stVal": "ondct-ctl-wes" }, "Cause": { "stVal": 1 }, "ComingFrom": "String", "DevId": { "name": "String" }, "DevSt": { "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "stVal": true, "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "DpcTyp": { "ctlVal": true, "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "stVal": "intermediate-state", "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "Identifier": "String", "Qu": { "stVal": 1 }, "ServiceType": { "stVal": "select" }, "SpcTyp": { "ctlVal": true, "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "stVal": true, "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "Tag": { "stVal": "NO-TAG" }, "TagClass": { "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "stVal": true, "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "TaggedReason": "String", "TmOrg": { "stVal": "genuine" }, "TmStamp": { "q": { "DetailQuality": { "badReference": true, "failure": true, "inconsistent": true, "innacurate": true, "oldData": true, "oscillatory": true, "outOfRange": true, "overflow": true }, "Source": "process", "Validity": "good", "operatorBlocked": true, "test": true }, "stVal": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } }, "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } } } } } |
...
Drawio | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Protocol translation configuration
Code Block | ||
---|---|---|
| ||
{
"protocol_translation":{
"name":"SAMPLE",
"version":"1.0",
"mapping_rules":[
{
"input_type":"M_SP_TB_1",
"output_type":"SpsTyp",
"mapping_rule":"104toP_1"
},
{
"input_type":"M_DP_TB_1",
"output_type":"DpsTyp",
"mapping_rule":"104toP_2"
},
{
"input_type":"M_ME_NA_1",
"output_type":"MvTyp",
"mapping_rule":"104toP_3"
},
{
"input_type":"M_ME_NC_1",
"output_type":"MvTyp",
"mapping_rule":"104toP_4"
},
{
"input_type":"SpsTyp",
"output_type":"M_SP_TB_1",
"mapping_rule":"Pto104_1"
},
{
"input_type":"DpsTyp",
"output_type":"M_DP_TB_1",
"mapping_rule":"Pto104_2"
},
{
"input_type":"MvTyp",
"output_type":"M_ME_NA_1",
"mapping_rule":"Pto104_3"
},
{
"input_type":"MvTyp",
"output_type":"M_ME_NC_1",
"mapping_rule":"Pto104_4"
},
{
"input_type":"SpsTyp",
"output_type":"Data_StateQTimeTagExtended",
"mapping_rule":"PtoT2_1"
},
{
"input_type":"DpsTyp",
"output_type":"Data_DiscreteQTimeTagExtended",
"mapping_rule":"PtoT2_2"
},
{
"input_type":"MvTyp",
"output_type":"Data_RealQ",
"mapping_rule":"PtoT2_3"
}
]
}
} |
Exchanged data configuration
In this chapter we will describe the configuration of the exchanged data. This configuration allow to specify a list of supported data objects. The protocol plugin is expected to make some controls against each entry of the configuration to check:
- if CA of ASDU is known otherwise throw an error message.
- if IOA is known otherwise throw an error message.
- if type of ASDU is known otherwise an error message.
- The label attribute shall be used to populate the Fledge's DataPoint Asset Name attribute.
Attributes definition
...
Configuration JSON structure
...
language | js |
---|
...
Exchanged data configuration
In this chapter we will describe the configuration of the exchanged data. This configuration allow to specify a list of supported data objects. The protocol plugin is expected to make some controls against each entry of the configuration to check:
- if protocol message address or reference is known otherwise throw an error message.
- if protocol type of message is known otherwise throw an error message.
- The label attribute shall be used to populate the Fledge's DataPoint Asset Name attribute.
Attributes definition
Attribute | Description | Expected values | Mandatory |
---|---|---|---|
name | this identifies the exchanged data configuration | Yes | |
version | this is the version number of the configuration | x.y where x represents a major version and y a minor change | Yes |
datapoints | array of datapoints that needs to be managed by the instance of the gateway | Yes | |
datapoints.label | label of the datapoint | any non empty string | Yes |
datapoints.pivot_id | unique identifier of the datapoint, this is used to create a pivot object | any non empty string | Yes |
datapoints.pivot_type | type of Common Data Class (CDC), this is used to create a pivot object | enum SpsTyp | DpsTyp | MvTyp | SpcTyp | DpcTyp | ... | Yes |
datapoints.pivot_subtypes | array of additional types of the pivot object | [transient, ...] | No |
datapoints.tfid | identifies the math function to transform the input value | enum "normal" | "square_root" | "quadratic" | "transparent" | No |
datapoints.params | array of parameters for the math function | array of float 32 [a, b, c, ...] | No |
datapoints.deadband | band of input values where the output is zero | array of 2 float 32 [min, max] | No |
datapoints.protocols | array of protocols that needs to be managed for a datapoint | Yes | |
datapoints.protocols.name | name of the protocol | enum "iec104" | "iec103" | "tase2" | "hnz" | "61850" | "opcua" | ... | Yes |
datapoints.protocols.address | address of the datapoint in the given protocol | any non empty string | Yes |
datapoints.protocols.typeid | type id of the datapoint in the given protocol | any non empty string representing a valid protocol type id | Yes |
datapoints.protocols.gi_groups | GI request status for north plugins, if "station" then datapoint is send for south plugins, it determines whether a datapoint is expected in the GI response | enum station | 1 | 2 | ... | No |
datapoints.protocols.alternate_mapping_rule | Alternate mapping rule to convert datapoint from protocol model to pivot or pivot to protocol model, if not specified then default conversion rule is applied | any non empty string representing a function name | No |
datapoints.operations | array of operations applied to produce a value for the current datapoint out of one or more input datapoints | No | |
datapoints.operations.operation | type of operation to perform | enum "or" | No |
datapoints.operations.input | array of Pivot ID of datapoints to use as inputs for the operation | array of Pivot ID strings | No |
Configuration JSON structure
Code Block | ||
---|---|---|
| ||
{ "exchanged_data":{ "name":"SAMPLE", "version":"1.0", "datapoints":[ { "label":"TS1", "pivot_id":"ID114562", "pivot_type":"SpsTyp", "pivot_subtypes":[ "transient" ], "operations":[ { "operation":"or", "input":[ "ID114562", "ID114563" ] } ], "protocols":[ { "name":"SAMPLEiec104", "version "address":"1.045-672", "datapoints":[ {"typeid":"M_SP_TB_1", "labelgi_groups":"TS1station", "pivot_id":"ID114562", "alternate_mapping_rule":"func_name_1" }, "pivot_type":"SpsTyp",{ "pivot_subtypes":[ "name":"tase2", "transient" "address":"S_114562", ], "protocolstypeid":["Data_StateQTimeTagExtended" {}, { "name":"iec104", "addressname":"45-672opcua", "typeidaddress":"M_SP_TB_1ID114562", "gi_groupstypeid":"stationopcua_sps" }, { "name":"tase2iec61850", "address":"S_114562simpleIOGenericIO/GGIO1.Ind1", "typeid":"Data_StateQTimeTagExtendedSPS", } "gi_groups":"station" ] }, }, { "namelabel":"opcuaTM1", "address"pivot_id":"ID114562ID99876", "typeid"pivot_type":"opcua_spsMVTyp", "tfid":"square_root", } "params":[ ] }, 2.0, { "label":"TM1",49.5 "pivot_id":"ID99876"], "pivot_typedeadband":"DpsTyp",[ "tfid":"square_root"-0.02, "params":[ 0.02 2.0], "protocols":[ 49.5 { ], "deadbandname":["iec104", -0.02"address":"45-984", 0.02 "typeid":"M_ME_NA_1" ], }, "protocols":[ { "name":"iec104tase2", "address":"45-984S_114562", "typeid":"M_ME_NA_1Data_RealQ" }, { "name":"tase2opcua", "address":"S_114562ID99876", "typeid":"Dataopcua_RealQmvf" }, { "name":"opcuaiec61850", "address":"ID99876simpleIOGenericIO/GGIO1.AnIn1", "typeid":"opcua_mvfMV" } ] } ] } } |
Warning |
---|
Do not use the name "IEC104Command" as a datapoint name in the exchanged data configuration. Doing so could potentially lead to conflicts when trying to read readings from both the South and Dispatcher components. |