...
(7) OPCUA exposition using the opcua north plugin, the output is a OPCUA object.
draw.io Diagram | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Pivot object model
The pivot object model is based on 61850 semantic.
Pivot model representing a Tele Measurement:
PIVOT TM model, representation of a tele measurement
Attribute | Description | Expected values | Mandatory |
---|---|---|---|
PIVOT.GTIM.Beh.stVal | ? | ||
PIVOT.GTIM.Cause.stVal | Cause of transmission | COT Cause of Transmission - FledgePower - LF Energy | Yes |
PIVOT.GTIM.ChgValCnt.stVal | ? | ||
PIVOT.GTIM.ComingFrom | Source protocol name | IEC103, IEC104, TASE.2, OPCUA, 61850, etc... | Yes |
PIVOT.GTIM.Confirmation.stVal | Indicates positive or negative confirmation of activation | true, false, DEFAULT=false | |
PIVOT.GTIM.Identifier | Unique identifier of the pivot object | Any non-empty string | Yes |
PIVOT.GTIM.{CDC} | Common Data Class representing the information object | MVTyp | Yes |
PIVOT.GTIM.NormalSrc.stVal | ? | ||
PIVOT.GTIM.NormalVal.stVal | ? | ||
PIVOT.GTIM.TmOrg.stVal | Timestamp origin, genuine = source otherwise substituted | genuine, substituted, DEFAULT = genuine | Yes |
PIVOT.GTIM.TmValidity.stVal | Timestamp validity | valid, invalid, DEFAULT = valid | Yes |
Example of a pivot model instance representing a Tele Measurement:
Code Block | ||
---|---|---|
| ||
{
"@xmlns:xs": "http://www.w3.org/2001/XMLSchema",
"PIVOT": {
"GTIM": {
"Beh": {
"stVal": "on"
},
"Cause": {
"stVal": 1
},
"ChgValCnt": {
"stVal": 1
},
"ComingFrom": "String",
"Confirmation": {
"stVal": true
},
"Identifier": "String",
"MvTyp": {
"mag | ||
Code Block | ||
| ||
{ "@xmlns:xs": "http://www.w3.org/2001/XMLSchema", "PIVOTTM": { "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": { "FractionOfSecondf": 0.1, "SecondSinceEpochi": 1 }, "TimeQualityq": { "clockFailureDetailQuality": true,{ "clockNotSynchronizedbadReference": true, "leapSecondKnownfailure": true, "timeAccuracyinconsistent": 1true, } } "innacurate": true, }, "NormalSrcoldData": {true, "stValoscillatory": "TELEMETERED"true, }, "NormalValoutOfRange": {true, "stValoverflow": "NORMAL"true }, "OriginSource": {"process", "qValidity": {"good", "DetailQualityoperatorBlocked": {true, "badReferencetest": true }, "t": { "failureFractionOfSecond": true1, "inconsistentSecondSinceEpoch": true1, "innacurateTimeQuality": true,{ "oldDataclockFailure": true, "oscillatoryclockNotSynchronized": true, "outOfRangeleapSecondKnown": true, "overflowtimeAccuracy": true1 }, } }, "SourceNormalSrc": "process",{ "ValiditystVal": "goodTELEMETERED", }, "operatorBlockedNormalVal": true,{ "teststVal": true"NORMAL" }, "stValOrigin": "String",{ "tq": { "FractionOfSecondDetailQuality": 1,{ "SecondSinceEpochbadReference": 1true, "TimeQualityfailure": {true, "clockFailureinconsistent": true, "clockNotSynchronizedinnacurate": true, "leapSecondKnownoldData": true, "timeAccuracyoscillatory": 1true, } "outOfRange": true, } "overflow": true }, "TmOrgSource": {"process", "stValValidity": "genuinegood", } "operatorBlocked": true, "TmValiditytest": {true }, "stVal": "VALIDString", } "t": { } } } |
Pivot model representing a Tele Signal:
Code Block | ||
---|---|---|
| ||
{ "@xmlns:xs": "http://www.w3.org/2001/XMLSchema", "PIVOTTS "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "GTISclockFailure": {true, "BehclockNotSynchronized": {true, "stValleapSecondKnown": "on"true, }, "CausetimeAccuracy": {1 } "stVal": 1} }, "ChgValCntTmOrg": { "stVal": 1"genuine" }, "ComingFromTmValidity": "String", "Confirmation": {{ "stVal": true }, "DpsTyp": {"VALID" "q": {} } } } |
PIVOT TS model, representation of a tele signal
Attribute | Description | Expected values | Mandatory |
---|---|---|---|
PIVOT.GTIS.Beh.stVal | ? | ||
PIVOT.GTIS.Cause.stVal | Cause of transmission | COT Cause of Transmission - FledgePower - LF Energy | Yes |
PIVOT.GTIS.ChgValCnt.stVal | ? | ||
PIVOT.GTIS.ComingFrom | Source protocol name | IEC103, IEC104, TASE.2, OPCUA, 61850, etc... | Yes |
PIVOT.GTIS.Confirmation.stVal | Indicates positive or negative confirmation of activation | true, false, DEFAULT=false | |
PIVOT.GTIS.Identifier | Unique identifier of the pivot object | Any non-empty string | Yes |
PIVOT.GTIS.{CDC} | Common Data Class representing the information object | SPSTyp, DPSTyp, BSCTyp | Yes |
PIVOT.GTIS.NormalSrc.stVal | ? | ||
PIVOT.GTIS.NormalVal.stVal | ? | ||
PIVOT.GTIS.TmOrg.stVal | Timestamp origin, genuine = source otherwise substituted | genuine, substituted, DEFAULT = genuine | Yes |
PIVOT.GTIS.TmValidity.stVal | Timestamp validity | valid, invalid, DEFAULT = valid | Yes |
Example of a pivot model instance representing a Tele Signal:
Code Block | ||
---|---|---|
| ||
{ "@xmlns:xs": "http://www.w3.org/2001/XMLSchema", "PIVOT": { "GTIS": { "Beh": { "stVal": "on" }, "Cause": { "stVal": 1 }, "ChgValCnt": { "stVal": 1 }, "ComingFrom": "String", "Confirmation "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"true }, "OriginDpsTyp": { "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": "Stringintermediate-state", "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "SpsTypIdentifier": {"String", "qNormalSrc": { "DetailQualitystVal": {"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": true"String", "t": { "FractionOfSecond": 1, "SecondSinceEpoch": 1, "TimeQuality": { "clockFailure": true, "clockNotSynchronized": true, "leapSecondKnown": true, "timeAccuracy": 1 } } }, "TmOrgSpsTyp": { "stValq": "genuine"{ }, "TmValidityDetailQuality": { "stValbadReference": "VALID" true, }"failure": true, } } } |
Pivot model representing a Tele Command:
Code Block | ||
---|---|---|
| ||
{ "@xmlns:xs": "http://www.w3.org/2001/XMLSchema", "PIVOTTC": { "GTIC": { "Beh": { "inconsistent": true, "innacurate": true, "oldData": true, "stValoscillatory": "on"true, }, "CauseoutOfRange": {true, "stValoverflow": 1true }, "ComingFromSource": "Stringprocess", "DevIdValidity": {"good", "nameoperatorBlocked": "String"true, }, "DevSttest": {true }, "qstVal": {true, "DetailQualityt": { "badReferenceFractionOfSecond": true1, "failureSecondSinceEpoch": true1, "inconsistentTimeQuality": true,{ "innacurateclockFailure": true, "oldDataclockNotSynchronized": true, "oscillatoryleapSecondKnown": true, "outOfRangetimeAccuracy": true,1 "overflow": true } } }, "SourceTmOrg": "process",{ "ValiditystVal": "goodgenuine", }, "operatorBlockedTmValidity": true,{ "teststVal": true"VALID" }, } } } |
PIVOT TC model, representation of a tele command
Attribute | Description | Expected values | Mandatory |
---|---|---|---|
PIVOT.GTIC.Beh.stVal | 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 |
PIVOT.GTIC.DevId.name | ? | No | |
PIVOT.GTIC.{CDC} | Common Data Class representing the information object | SPCTyp, DPCTyp, INCTyp, APCTyp, BSCTyp | Yes |
PIVOT.GTIC.Identifier | Unique identifier of the pivot object | Any non-empty string | Yes |
PIVOT.GTIC.Qu.stVal | ? | No | |
PIVOT.GTIC.ServiceType.stVal | ? | No | |
PIVOT.GTIC.Tag.stVal | ? | No | |
PIVOT.GTIC.TagClass | ? | No | |
PIVOT.GTIC.TaggedReason | ? | No | |
PIVOT.GTIC.TmOrg | Timestamp origin, genuine = source otherwise substituted | genuine, substituted, DEFAULT = genuine | No |
PIVOT.GTIC.TmStamp | Timestamp | No |
Example of a pivot model instance representing a Tele Command:
Code Block | ||
---|---|---|
| ||
{ "@xmlns:xs": "http://www.w3.org/2001/XMLSchema", "PIVOT": { "GTIC": { "Beh": { "stVal": "dct-ctl-wes" }, "Cause": { "stVal": 1 }, "ComingFrom": "String", "DevId "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": { "FractionOfSecondname": 1,"String" }, "SecondSinceEpochDevSt": 1,{ "TimeQualityq": { "clockFailureDetailQuality": true,{ "clockNotSynchronizedbadReference": true, "leapSecondKnownfailure": true, "timeAccuracyinconsistent": 1true, }"innacurate": true, } "oldData": true, }, "Identifieroscillatory": "String"true, "QuoutOfRange": {true, "stValoverflow": 1true }, "ServiceTypeSource": {"process", "stValValidity": "selectgood", }, "SpcTypoperatorBlocked": {true, "ctlValtest": true }, "qstVal": {true, "DetailQualityt": { "badReferenceFractionOfSecond": true1, "failureSecondSinceEpoch": true1, "inconsistentTimeQuality": true,{ "innacurateclockFailure": true, "oldDataclockNotSynchronized": true, "oscillatoryleapSecondKnown": true, "outOfRangetimeAccuracy": true,1 "overflow": true } } }, "SourceDpcTyp": "process",{ "ValidityctlVal": "good"true, "operatorBlockedq": true,{ "testDetailQuality": true{ }, "stValbadReference": true, "t": { "FractionOfSecondfailure": 1true, "SecondSinceEpochinconsistent": 1true, "TimeQualityinnacurate": {true, "clockFailureoldData": true, "clockNotSynchronizedoscillatory": true, "leapSecondKnownoutOfRange": true, "timeAccuracyoverflow": 1true }, } }, "Source": "process", "TagValidity": {"good", "stValoperatorBlocked": "NO-TAG"true, }, "TagClasstest": {true }, "qstVal": { "intermediate-state", "DetailQualityt": { "badReferenceFractionOfSecond": true1, "failureSecondSinceEpoch": true1, "inconsistentTimeQuality": true,{ "innacurateclockFailure": true, "oldDataclockNotSynchronized": true, "oscillatoryleapSecondKnown": true, "outOfRangetimeAccuracy": true,1 "overflow": true } } }, "SourceIdentifier": "processString", "ValidityQu": "good",{ "operatorBlockedstVal": true,1 }, "testServiceType": true{ }, "stVal": true"select" }, "tSpcTyp": { "FractionOfSecondctlVal": 1true, "SecondSinceEpochq": 1,{ "TimeQualityDetailQuality": { "clockFailurebadReference": true, "clockNotSynchronizedfailure": true, "leapSecondKnowninconsistent": true, "timeAccuracyinnacurate": 1true, } } "oldData": true, }, "TaggedReasonoscillatory": "String"true, "TmOrgoutOfRange": {true, "stValoverflow": "genuine"true }, "TmStampSource": {"process", "qValidity": {"good", "DetailQualityoperatorBlocked": {true, "badReferencetest": true, }, "failurestVal": true, "inconsistentt": true,{ "innacurateFractionOfSecond": true1, "oldDataSecondSinceEpoch": true1, "oscillatoryTimeQuality": true,{ "outOfRangeclockFailure": true, "overflowclockNotSynchronized": true, }, "SourceleapSecondKnown": "process"true, "ValiditytimeAccuracy": "good",1 "operatorBlocked": true,} "test": true} }, "stValTag": { "FractionOfSecondstVal": 1,"NO-TAG" }, "SecondSinceEpochTagClass": 1,{ "q": { "TimeQualityDetailQuality": { "clockFailurebadReference": true, "clockNotSynchronizedfailure": true, "leapSecondKnowninconsistent": true, "timeAccuracyinnacurate": 1true, } "oldData": true, } "oscillatory": true, "toutOfRange": {true, "FractionOfSecondoverflow": 1true }, "SecondSinceEpochSource": 1"process", "TimeQualityValidity": {"good", "clockFailureoperatorBlocked": true, "clockNotSynchronizedtest": true, }, "leapSecondKnownstVal": true, "timeAccuracyt": 1{ }"FractionOfSecond": 1, } "SecondSinceEpoch": 1, } } } } |
Protocol translation process
draw.io Diagram | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
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.
Configuration JSON file structure
"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
}
}
}
}
}
} |
Protocol translation process
draw.io Diagram | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
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":[
{
| ||
Code Block | ||
| ||
{ "exchanged_data":{ "name":"SAMPLE", "version":"1.0", "datapoints":[ { "label":"TS1", "pivot_id":"ID114562", "pivot_type":"SpsTyp", "protocols":[ { "namelabel":"iec104TS1", "pivot_id":"ID114562", "addresspivot_type":"45-672SpsTyp", "typeid":"M_SP_TB_1""pivot_subtypes":[ },"transient" ], "operations":[ { "name":"tase2", "operation":"or", "input":[ "ID114562", "ID114563" ] } ], "addressprotocols":"S_114562", [ "typeid":"Data_StateQTimeTagExtended" } ] }, { "label":"TM1", "pivot_id":"ID99876", "pivot_type":"DpsTyp", "protocols":[ { "name":"iec104", "address_ca":"45-984", "typeid":"M_ME_NA_1" }, { "name":"tase2", "address":"S_114562", "typeid":"Data_RealQ" } ] } ] } } |
IEC 104 south plugin (client/master)
IEC 104 Protocol stack configuration
The IEC 104 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
...
IP address, machine's default IP for a given interface
...
maximum ASDU size in transmission direction, if set to "0" => maximum possible value is automatically used.
...
remove, process, default = remove
remove: the time stamp will be removed from the information object
process: the time stamp will be processed on regular basis and additionally marked as 'not synchronized'
...
Configuration JSON file structure
Code Block | ||
---|---|---|
| ||
{
"protocol_stack":{
"name":"iec104client",
"version":"1.0",
"transport_layer":{
"connection":{
"path":[
{
"srv_ip":"192.168.0.10",
"clt_ip":"",
"port":2404
},
{
"srv_ip":"192.168.0.11",
"clt_ip":"",
"port":2404
}
],
"tls":false
},
"k_value":12,
"w_value":8,
"t0_timeout":10,
"t1_timeout":15,
"t2_timeout":10,
"t3_timeout":20,
"conn_all":true,
"start_all":false,
"conn_passv":false
},
"application_layer":{
"orig_addr":0,
"ca_asdu_size":2,
"ioaddr_size":3,
"startup_time":180,
"asdu_size":0,
"gi_time":60,
"gi_cycle":false,
"gi_all_ca":false,
"gi_repeat_count":2,
"disc_qual":"NT",
"send_iv_time":0,
"tsiv":"REMOVE",
"utc_time":false,
"comm_wttag":false,
"comm_parallel":0,
"exec_cycl_test":false,
"startup_state":true,
"reverse":false,
"time_sync":false
}
}
} |
IEC 104 datapoint representation
This is the Datapoint representation of an IEC 104 ASDU.
Code Block | ||
---|---|---|
| ||
{
"data_object":{
"do_type":"type_id",
"do_ca":"ca",
"do_oa":"oa",
"do_cot":"cot",
"do_test":"istest",
"do_negative":"isnegative",
"do_ioa":"ioa",
"do_value":"value",
"do_quality":"quality_desc",
"do_ts":"time_marker",
"do_ts_qual":"isinvalid",
"do_ts_sum_time":"isSummerTime"
}
} |
Path exploration
draw.io Diagram | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
In redundant network configuration or generally in cases where several communication paths exist between one client and one server, the path checking exploration mechanism allows the client to try all the paths one by one without making any difference between them. The client uses the first available path. On disconnection this procedure starts again from the beginning.
TLS configuration
The CS 104 standard can also be used with TLS to realize secure and authenticated connections.
3 parameters are needed to set up the TLS secured connection:
- private key file
- server certificate
- root certificate (CA)
Fledge's certificate store allows certificates to be stored and used by the south plugins.
Code Block | ||
---|---|---|
| ||
{
"tls_conf:": {
"private_key": "server-key.pem",
"server_cert": "server.cer",
"ca_cert": "root.cer"
}
} |
IEC 104 north plugin (server/slave)
IEC 104 redundancy server modes
Multiple redundancy groups
The MZ Automation lib60870 server provides 3 different modes regarding the support of redundant connections and events queue handling:
- The default mode (CS104_MODE_SINGLE_REDUNDANCY_GROUP) allows only a single active client connection.
- The second mode (CS104_MODE_CONNECTION_IS_REDUNDANCY_GROUP) allows multiple active client connections.
- The third mode (CS104_MODE_MULTIPLE_REDUNDANCY_GROUPS) allows multiple active client connections while preserving events when no client is connected.
In the case of this design, the south plugin will be implemented with CS104_MODE_MULTIPLE_REDUNDANCY_GROUPS server mode.
This mode allows multiple active client connections while preserving events when no client is connected. In this mode clients can be assigned to specific redundancy groups. The assignment is based on the IP address of the client. A redundancy group can have multiple simultaneous connections but only one of these connections can be active. The number of activated connections is restricted by the number of redundancy groups. Each redundancy group has a dedicated event queue.
It can be set with the CS104_Slave_setServerMode function:
Code Block | ||
---|---|---|
| ||
CS104_Slave_setServerMode(slave, CS104_MODE_MULTIPLE_REDUNDANCY_GROUPS); |
Multiple redundancy groups example
draw.io Diagram | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
In this example, 2 control centers, center A and B, are establishing communication with the server.
Both centers have an active and a stand-by gateway for failover management.
Center A has two simultaneous connections, one active and one stand-by, assigned to redundancy group 1.
Center B has only one active connection, assigned to redundancy group 2.
IEC 104 Protocol stack configuration
The IEC 104 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
...
maximum ASDU size in transmission direction, if set to "0" => maximum possible value is automatically used.
...
ignore, process, default = ignore
ignore: the time stamp quality 'not synchronized' will be ignored and the time stamp will be processed on regular basis. IV-bit will remain 0
process: the time stamp will be send with IV-bit set to 1
...
Configuration JSON file structure
Code Block | ||
---|---|---|
| ||
{ "protocol_stack":{ "name":"iec104server", "version":"1.0", "transport_layer":{ "bind_on_ip":false, "srv_ip":"0.0.0.0", "port":2404, "tls":false, "name":"iec104", "address":"45-672", "typeid":"M_SP_TB_1", "gi_groups":"station", "alternate_mapping_rule":"func_name_1" }, { "name":"tase2", "address":"S_114562", "typeid":"Data_StateQTimeTagExtended" }, { "name":"opcua", "address":"ID114562", "typeid":"opcua_sps" }, { "name":"iec61850", "address":"simpleIOGenericIO/GGIO1.Ind1", "typeid":"SPS" } ] }, { "label":"TM1", "pivot_id":"ID99876", "pivot_type":"MVTyp", "tfid":"square_root", "params":[ 2.0, 49.5 ], "deadband":[ -0.02, 0.02 ], "protocols":[ { "k_valuename":12"iec104", "w_value":8, "t0_timeoutaddress":10"45-984", "t1_timeout":15, "t2_timeout":10,"typeid":"M_ME_NA_1" "t3_timeout":20 }, "application_layer":{ "orig_addr":"0",{ "ca_asdu_size":2, "ioaddr_sizename":3"tase2", "asdu_size":0, "time_syncaddress":false, "comm_exec_timeout":20000"S_114562", "comm_recv_timeout":5000, "tsivtypeid":"IGNORE", "reset":false,"Data_RealQ" "filter_orig":false, }, "filter_list":[ { "orig_addrname":1"opcua", }, "address":"ID99876", { "orig_addr":2"typeid":"opcua_mvf" } ]}, } } } |
IEC 104 datapoint representation
This is the Datapoint representation of an IEC 104 ASDU for a command.
Code Block | ||
---|---|---|
| ||
{ "command_object":{ "co_typename":"type_idiec61850", "co_ca "address":"casimpleIOGenericIO/GGIO1.AnIn1", "co_oa":"oa", "co_cottypeid":"cotMV", "co_test":"istest", "co_negative":"isnegative",} "co_ioa":"ioa", "co_value":"value", ] "co_qu":"pulse", } "co_se":"Select/Execute", "co_ts":"time_marker" ] } } |
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. |