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).

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.GTISTele Signal
PIVOTTM.GTIMTele Measurement
PIVOTTC.GTICNot supported yet

<type> conversion table:

CDC ClassIEC 104 Type IDType ID with timetagAlternative format type id
SpsTypM_SP_NA_1M_SP_TA_1,M_SP_TB_1M_PS_NA_1
DpsTypM_DP_NA_1M_DP_TA_1,M_DP_TB_1M_EP_TA_1,M_EP_TD_1
MvTypM_ME_NA_1M_ME_TA_1,M_ME_TD_1M_ME_ND_1
MvTypM_ME_NB_1M_ME_TB_1,M_ME_TE_1
MvTypM_ME_NC_1M_ME_TC_1,M_ME_TF_1

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"iec104"do_comingfromiec104
<Root>.IdentifierString

do_id


exchanged_data.datapoints.pivot_id


<Root>.<type>{CDC}
do_type

exchanged_data.datapoints.pivot_type

(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>.TmOrgString
do_ts_org"genuine" |  "substituted"
<Root>.TmValidity = "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

Filter rules

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:

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

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