This plugin can be used to convert IEC 104 ASDU objects to FledgePower pivot model objects.

The filter implements the Fledge Filter plugin interface (see filter_plugins).

Common rules

Filter configuration

See Plugins configuration design for examples and details.

The "config" parameter of  "plugin_init" call shall include :

Notes :

Filter interface

The "plugin_ingest" call will convert each "reading" of "reading_set" as follow:

The <Root> key of PIVOT object is:

Reading key

Content

PIVOTTS.GTISStatus Point
PIVOTTM.GTIMMeasurement
PIVOTTC.GTICCommand or Set Point

<type> conversion table:

RootCDC ClassIEC 104 Type IDType ID with timetagAlternative format type id
GTISSpsTypM_SP_NA_1M_SP_TA_1,M_SP_TB_1M_PS_NA_1
GTISDpsTypM_DP_NA_1M_DP_TA_1,M_DP_TB_1M_EP_TA_1,M_EP_TD_1
GTIMMvTypM_ME_NA_1M_ME_TA_1,M_ME_TD_1M_ME_ND_1
GTIMMvTypM_ME_NB_1M_ME_TB_1,M_ME_TE_1
GTIMMvTypM_ME_NC_1M_ME_TC_1,M_ME_TF_1
GTIMBscTypM_ST_NAM_ST_TA_1,M_ST_TB
GTICSpcTypC_SC_NA_1C_SC_TA_1
GTICDpcTypC_DC_NA_1C_DC_TA_1
GTICIncTypC_SE_NB_1C_SE_TB_1

GTIC

ApcTyp

C_SE_NA_1, C_SE_NC_1C_SE_TA_1, C_SE_TC_1

GTIC

BscTyp

C_RC_NA_1C_RC_TA_1

Converting monitoring data types

The content under <Root> will convert the IEC 104 data objet to a pivot object as follow:

Key

Type

Default Value

iec104.data_object.<...>

Note

<Root>.Cause.stValInteger
do_cotSee Cause of Transmission
<Root>.Confirmation.stValBooleanfalsedo_negative
<Root>.ComingFromString

This plugin should always use the value "iec104" when converting to pivot
<Root>.IdentifierString



The plugin will populate the "exchanged_data.datapoints.pivot_id" using the CA-IOA from the input iec104 data object and the "datapoints.protocols.address" from the exchanged_data configuration


<Root>.<type>{CDC}
do_type

The plugin will populate the "exchanged_data.datapoints.pivot_type" using the ASDU type from the input iec104 data object and the "datapoints.protocols.typeid" from the exchanged_data configuration

(see <type> conversion table above)

<Root>.<type>.q.Validity = "questionable"

<Root>.<type>.q.DetailQuality.overflow = true

Boolean

falsedo_quality_ov = true


<Root>.<type>.q.testBooleanfalsedo_test
<Root>.<type>.q.operatorBlockedBooleanfalsedo_quality_bl
<Root>.<type>.q.Source = "substituted"String"process"do_quality_sb = true"process" | "substituted"
<Root>.<type>.q.Validity = "invalid"String"good"do_quality_iv = true"good" | "invalid" | "reserved" | "questionable"
<Root>.<type>.t.SecondSinceEpochInteger
do_ts
<Root>.TmOrg.stValString
do_ts_org"genuine" |  "substituted"
<Root>.TmValidity.stVal = "invalid"String"good"do_ts_iv = true"good" | "invalid" | "reserved" | "questionable"

<Root>.<type>.q.Validity = "questionable"

<Root>.<type>.q.DetailQuality.oldData = true

String"good"do_quality_nt = true"good" | "invalid" | "reserved" | "questionable"
<Root>.SpsTyp.stValBoolean
do_value
<Root>.DpsTyp.stValString
do_valueintermediate-state | off | on | bad-state
<Root>.MvTyp.mag.fFloat
do_valueFloat 32
<Root>.MvTyp.mag.iInteger
do_valueInt 32
<Root>.BscTyp.valWTr.posValInteger
do_valueInt 8
<Root>.BscTyp.valWTr.transIndBoolean
do_valueBoolean

Filter rules

STATION => (ASDU) IEC104 SOUTH => (IEC104 DP) IEC104TOPIVOT =>(PIVOT DP) PIVOTTOIEC104 => (IEC104 DP) IEC104 NORTH => (ASDU) CENTER

Rule 1: if the incoming IEC104 data object has not the attribute or has the default value then we don't have to create the corresponding attribute in the pivot object.

Rule 2: If the received pivot object has not an expected attribute then we create the attribute of the protocol specific datapoint with default value.

Rule 3: Case when ASDU timestamp is not received:

A the IEC104TOPIVOT step:
If the received ASDU is without timestamp Then
    We create a pivot object With timestamp = current system time
    And <>.TmOrg.stVal = substituted

On the PIVOTTOIEC104 step:
We create an IEC104 datapoint with timestamp and do_ts_sub = true

IEC104 NORTH step:
If the Datapoint configured in the exchanged data has not IEC104 timestamp typeid
Then we create an ASDU with a typeid with no timestamp
If the Datapoint configured in the exchanged data has IEC104 timestamp typeid
Then we create an ASDU with a timestamp typeid, ASDU timestamp = do_ts And subtituted = do_ts_sub

Converting commands data types

The content under <Root> will convert the IEC 104 command objet to a pivot object as follow:

Key

Order

Type

Default Value

iec104.data_object.<...>

Note

<Root>.Cause.stVal
Integer
co_cotSee Cause of Transmission
<Root>.ComingFrom
String

This plugin should always use the value "iec104" when converting to pivot
<Root>.Identifier
String


The plugin will populate the "exchanged_data.datapoints.pivot_id" using the CA-IOA from the input iec104 command object and the "datapoints.protocols.address" from the exchanged_data configuration


<Root>.Select.stVal
Booleanfalseco_se

- 0 is mapped with false, for Execute

- 1 is mapped with true, for Select before Execute

<Root>.<type>
{CDC}
co_type

The plugin will populate the "exchanged_data.datapoints.pivot_type" using the ASDU type from the input iec104 command object and the "datapoints.protocols.typeid" from the exchanged_data configuration

(see <type> conversion table above)

<Root>.<type>.q.test
Booleanfalseco_test
<Root>.<type>.t.SecondSinceEpoch
Integer
co_ts
<Root>.SpcTyp.ctlVal
Boolean
co_value0 or 1
<Root>.DpcTyp.ctlVal
String
co_valueintermediate-state | off | on | bad-state
<Root>.IncTyp.ctlVal
Integer
co_valueInt 32
<Root>.ApcTyp.ctlVal
Float
co_valueFloat 32
<Root>.BscTyp.ctlVal
String
co_valuestop | lower | higher | reserved


Filter rules

CENTER => (ASDU) IEC104 NORTH => (IEC104 DP) IEC104TOPIVOT =>(PIVOT DP) PIVOTTOIEC104 => (IEC104 DP) IEC104 SOUTH=> (ASDU) STATION

Rule 1: if the incoming IEC104 command object has not the attribute or has the default value then we don't have to create the corresponding attribute in the pivot object.

Rule 2: If the received pivot object has not an expected attribute then we create the attribute of the protocol specific command with default value.

Rule 3: the timestamp of the original command issued by the Center must be transmitted as is to the Station.

Rule 4: Case when IEC104 command object timestamp is not received for ASDU type with timestamp, then IEC104 command object is rejected with error message.

Rule 5: Case when IEC104 command object for ASDU type without timestamp is received then:

A the IEC104TOPIVOT step:
If the received ASDU is without timestamp Then We create a pivot object With timestamp = current system time