Merge branch 'v1.6_develop_tools' into v1.6_d

v1.6
Maxson Ramon dos Anjos Medeiros 3 months ago
commit 4011845372

@ -1,3 +1,9 @@
Changes to version 1.6.1
------------------------
-.NET Tools: in the Tools folder you can find the .net project to generate Static and Dynamic Models
- SCLParser: also available on tools, you can load your SCL model and use it with our library
Changes to version 1.6.0
------------------------

@ -6,6 +6,7 @@ add_subdirectory(server_example_control)
add_subdirectory(server_example_dynamic)
add_subdirectory(server_example_config_file)
add_subdirectory(server_example_complex_array)
add_subdirectory(server_example_SMV)
add_subdirectory(server_example_threadless)
add_subdirectory(server_example_61400_25)
add_subdirectory(server_example_setting_groups)

@ -15,6 +15,7 @@ EXAMPLE_DIRS += server_example_control
EXAMPLE_DIRS += server_example_config_file
EXAMPLE_DIRS += server_example_dynamic
EXAMPLE_DIRS += server_example_complex_array
EXAMPLE_DIRS += server_example_SMV
EXAMPLE_DIRS += server_example_61400_25
EXAMPLE_DIRS += server_example_threadless
EXAMPLE_DIRS += server_example_setting_groups

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example_SMV_SRCS
server_example_SMV.c
static_model.c
)
IF(MSVC)
set_source_files_properties(${server_example_SMV_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(MSVC)
add_executable(server_example_SMV
${server_example_SMV_SRCS}
)
target_link_libraries(server_example_SMV
iec61850
)

@ -0,0 +1,26 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example_SMV
PROJECT_SOURCES = server_example_SMV.c
PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = sampleModel.cid
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
model: $(PROJECT_ICD_FILE)
java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE)
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

@ -0,0 +1,313 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" nameStructure="IEDName">
</Header>
<Communication>
<SubNetwork name="subnetwork1" type="8-MMS">
<ConnectedAP iedName="test" apName="accessPoint1">
<Address>
<P type="IP">0.0.0.0</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">192.168.2.1</P>
<P type="OSI-AP-Title">1,3,9999,33</P>
<P type="OSI-AE-Qualifier">33</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
<P type="OSI-TSEL">0001</P>
<P type="MMS-Port">102</P>
</Address>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="test">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="ComplexArray">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="">
<DOI name="PhyHealth">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
</DAI>
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="Beh">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
<DOI name="Health">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
<DOI name="SPCSO1">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO2">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO3">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO4">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MHAI" lnType="MHAI1" inst="1" prefix="">
<DataSet name="TestMHAI">
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(7)" ix="7"/>
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(8)" ix="8"/>
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(9).cVal" ix="9"/>
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(10).cVal.mag" ix="10"/>
<FCDA ldInst="ComplexArray" lnClass="MHAI" lnInst="1" doName="HA" fc="MX" daName="phsAHar(11).cVal.mag.f" ix="11"/>
</DataSet>
<ReportControl name="MHAIRCB" confRev="1" datSet="TestMHAI" rptID="TestMHAI" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<DOI name="HA">
<DAI name="numHar">
<Val>16</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_2_Health" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="ENS_2_Health" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_2_Health" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="AnIn1" type="MV_1_AnIn1" />
<DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_1_SPCSO1" />
<DO name="SPCSO2" type="SPC_2" />
<DO name="SPCSO3" type="SPC_2" />
<DO name="SPCSO4" type="SPC_2" />
<DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" />
<DO name="Ind4" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="MHAI1" lnClass="MHAI">
<DO name="HA" type="HWYE_1_HA" />
</LNodeType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="stVal" bType="Enum" type="Beh" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="Enum" type="Beh" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="ENS_2_Health" cdc="ENS">
<DA name="stVal" bType="Enum" type="HealthKind" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="HWYE_1_HA" cdc="HWYE">
<SDO name="phsAHar" type="CMV_1_phsAHar" count="16" />
<DA name="numHar" bType="INT16U" fc="CF" dchg="true" />
<DA name="numCyc" bType="INT16U" fc="CF" dchg="true" />
<DA name="evalTm" bType="INT16U" fc="CF" dchg="true" />
<DA name="frequency" bType="FLOAT32" fc="CF" dchg="true" />
</DOType>
<DOType id="CMV_1_phsAHar" cdc="CMV">
<DA name="cVal" bType="Struct" type="Vector" fc="MX" dchg="true" dupd="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="dU" fc="DC" bType="Unicode255"/>
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="MV_1_AnIn1" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="origin" fc="ST" type="Originator_1" bType="Struct" />
<DA name="ctlNum" fc="ST" bType="INT8U" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
</DOType>
<DOType id="SPC_2" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DAType id="Vector">
<BDA name="mag" bType="Struct" type="AnalogueValue_1" />
<BDA name="ang" bType="Struct" type="AnalogueValue_1" />
</DAType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Originator_1">
<BDA name="orCat" type="OrCat" bType="Enum" />
<BDA name="orIdent" bType="Octet64" />
</DAType>
<DAType id="SPCOperate_1">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
<BDA name="Check" bType="Check" />
</DAType>
<EnumType id="Beh">
<EnumVal ord="1">on</EnumVal>
<EnumVal ord="2">blocked</EnumVal>
<EnumVal ord="3">test</EnumVal>
<EnumVal ord="4">test/blocked</EnumVal>
<EnumVal ord="5">off</EnumVal>
</EnumType>
<EnumType id="HealthKind">
<EnumVal ord="1">ok</EnumVal>
<EnumVal ord="2">warning</EnumVal>
<EnumVal ord="3">alarm</EnumVal>
</EnumType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="OrCat">
<EnumVal ord="0">not-supported</EnumVal>
<EnumVal ord="1">bay-control</EnumVal>
<EnumVal ord="2">station-control</EnumVal>
<EnumVal ord="3">remote-control</EnumVal>
<EnumVal ord="4">automatic-bay</EnumVal>
<EnumVal ord="5">automatic-station</EnumVal>
<EnumVal ord="6">automatic-remote</EnumVal>
<EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,193 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" />
<Communication>
<SubNetwork name="Subnetwork">
<ConnectedAP iedName="SampleIED" apName="accessPoint1">
<GSE cbName="NewGSEControl" ldInst="Device1">
<Address>
<P type="MAC-Address">01-0C-CD-04-00-01</P>
<P type="APPID">4000</P>
<P type="VLAN-PRIORITY">4</P>
<P type="VLAN-ID">123</P>
</Address>
</GSE>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="SampleIED">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<FileHandling />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="Device1">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DataSet name="dataset1" desc="">
<FCDA ldInst="Device1" lnClass="LLN0" fc="ST" doName="Mod" daName="q" />
<FCDA ldInst="Device1" lnClass="MMXU" fc="ST" lnInst="1" doName="Mod" daName="q" />
<FCDA ldInst="Device1" lnClass="MMXU" fc="CF" lnInst="1" doName="Mod" daName="ctlModel" />
</DataSet>
<ReportControl name="LLN0_Events_BuffRep" rptID="LLN0$RP$brcbEV1" datSet="dataset1" confRev="1" buffered="true" desc="Events brcb buffered report" intgPd="900000" bufTime="50">
<TrgOps dchg="true" qchg="false" dupd="false" period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" dataRef="false" entryID="true" configRef="true" bufOvfl="true" />
<RptEnabled max="1" />
</ReportControl>
<GSEControl name="NewGSEControl" appID="NewGSEControl" />
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="DGEN" lnType="DGEN1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="DSCH" lnType="DSCH1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU2" inst="2" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="MMXU2" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="TotW" type="MV_1_TotWh" />
</LNodeType>
<LNodeType id="DGEN1" lnClass="DGEN" desc="DER unit generator">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="OpTmh" type="INS_1_Beh" />
<DO name="GnOpSt" type="ENS_1_Beh" />
<DO name="OpTmsRs" type="INS_1_Beh" />
<DO name="TotWh" type="MV_1_TotWh" />
</LNodeType>
<LNodeType id="DSCH1" lnClass="DSCH" desc="DER energy and/or ancillary services schedule">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="SchdSt" type="INS_1_Beh" />
<DO name="SchdId" type="ING_1_SchdId" />
<DO name="SchdCat" type="ING_1_SchdId" />
<DO name="SchdTyp" type="ING_1_SchdId" />
<DO name="SchdAbsTm" type="SCA_1_SchdAbsTm" />
</LNodeType>
<LNodeType id="MMXU1" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="MV_1_TotWh" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SCA_1_SchdAbsTm" cdc="SCA">
<DA name="val" bType="FLOAT32" count="255" fc="SP" dchg="true" />
<DA name="time" bType="Timestamp" count="255" fc="SP" dchg="true" />
</DOType>
<DOType id="ING_1_SchdId" cdc="ING" />
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,136 @@
/*
* server_example_SMV.c
*
* This example shows how to handle complex arrays (arrays of data objects).
*/
#include "iec61850_server.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include "static_model.h"
#include <assert.h>
static int running = 0;
static void
sigint_handler(int signalId)
{
running = 0;
}
static void
updateCMVArrayElement(IedServer server, DataObject* phsAHar, int idx, float magnitude, float angle, Quality quality, Timestamp timestamp)
{
DataObject* phsAHarArrayElem = (DataObject*)ModelNode_getChildWithIdx((ModelNode*)phsAHar, idx);
if (phsAHarArrayElem) {
DataAttribute* mag = (DataAttribute*)ModelNode_getChild((ModelNode*)phsAHarArrayElem, "cVal.mag.f");
DataAttribute* ang = (DataAttribute*)ModelNode_getChild((ModelNode*)phsAHarArrayElem, "cVal.ang.f");
DataAttribute* q = (DataAttribute*)ModelNode_getChild((ModelNode*)phsAHarArrayElem, "q");
DataAttribute* t = (DataAttribute*)ModelNode_getChild((ModelNode*)phsAHarArrayElem, "t");
if (mag && ang && q && t) {
IedServer_updateQuality(server, q, quality);
IedServer_updateTimestampAttributeValue(server, t, &timestamp);
IedServer_updateFloatAttributeValue(server, mag, magnitude);
IedServer_updateFloatAttributeValue(server, ang, angle);
}
else {
printf("one of mag, ang, q, t not found\n");
}
}
else {
printf("Element with index %i not found\n", idx);
}
}
int
main(int argc, char **argv)
{
int tcpPort = 102;
if (argc > 1) {
tcpPort = atoi(argv[1]);
}
IedServer iedServer = IedServer_create(&iedModel);
LogicalDevice* logicalDevice = iedModel.firstChild;
LogicalNode* logicalNode = LogicalDevice_getLogicalNode(logicalDevice, "666LLN051");
SVControlBlock* sMVcontrolBlock =
(SVControlBlock*)IedModel_getSVControlBlock(&iedModel, logicalNode, "NewSMVControl");
///* Get access to the MHAI1.HA data object handle - for static and dynamic model*/
//DataObject* mhai1_ha_phsAHar = (DataObject*)
// IedModel_getModelNodeByShortObjectReference(&iedModel, "ComplexArray/MHAI1.HA.phsAHar");
///* assuming the array has 16 elements */
//float mag = 200.f;
//float angle = 0.01f;
/*Quality quality = QUALITY_VALIDITY_GOOD;
Timestamp timestamp;
Timestamp_setTimeInMilliseconds(&timestamp, Hal_getTimeInMs());
int i;
for (i = 0; i < 16; i++) {
updateCMVArrayElement(iedServer, mhai1_ha_phsAHar, i, mag, angle, quality, timestamp);
mag += 1.f;
angle += 0.01f;
}*/
/* MMS server will be instructed to start listening to client connections. */
IedServer_start(iedServer, tcpPort);
if (!IedServer_isRunning(iedServer)) {
printf("Starting server failed! Exit.\n");
IedServer_destroy(iedServer);
exit(-1);
}
running = 1;
signal(SIGINT, sigint_handler);
int counter = 0;
while (running) {
Thread_sleep(1000);
//Timestamp_setTimeInMilliseconds(&timestamp, Hal_getTimeInMs());
IedServer_lockDataModel(iedServer);
/*for (i = 0; i < 16; i++) {
updateCMVArrayElement(iedServer, mhai1_ha_phsAHar, i, mag, angle, quality, timestamp);
mag += 0.1f;
angle += 0.05f;
}*/
IedServer_unlockDataModel(iedServer);
//if (counter == 10) {
// /* Now a problem occurs - measurements are invalid */
// quality = QUALITY_VALIDITY_INVALID | QUALITY_DETAIL_FAILURE;
//}
//counter++;
}
/* stop MMS server - close TCP server socket and all client sockets */
IedServer_stop(iedServer);
/* Cleanup - free all resources */
IedServer_destroy(iedServer);
return 0;
} /* main() */

@ -0,0 +1,371 @@
/*
* static_model.c
*
* automatically generated from ICDFiles/simpleIO_smv.icd
*/
#include "static_model.h"
static void initializeValues();
LogicalDevice iedModel_GenericIO = {
LogicalDeviceModelType,
"GenericIO",
(ModelNode*) &iedModel,
NULL,
(ModelNode*) &iedModel_GenericIO_666LLN051,
NULL
};
LogicalNode iedModel_GenericIO_666LLN051 = {
LogicalNodeModelType,
"666LLN051",
(ModelNode*) &iedModel_GenericIO,
NULL,
(ModelNode*) &iedModel_GenericIO_666LLN051_Mod
};
DataObject iedModel_GenericIO_666LLN051_Mod = {
DataObjectModelType,
"Mod",
(ModelNode*) &iedModel_GenericIO_666LLN051,
(ModelNode*) &iedModel_GenericIO_666LLN051_Beh,
(ModelNode*) &iedModel_GenericIO_666LLN051_Mod_stVal,
0,
-1
};
DataAttribute iedModel_GenericIO_666LLN051_Mod_stVal = {
DataAttributeModelType,
"stVal",
(ModelNode*) &iedModel_GenericIO_666LLN051_Mod,
(ModelNode*) &iedModel_GenericIO_666LLN051_Mod_q,
NULL,
0,
-1,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE + TRG_OPT_QUALITY_CHANGED,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_Mod_q = {
DataAttributeModelType,
"q",
(ModelNode*) &iedModel_GenericIO_666LLN051_Mod,
(ModelNode*) &iedModel_GenericIO_666LLN051_Mod_t,
NULL,
0,
-1,
IEC61850_FC_ST,
IEC61850_QUALITY,
0,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_Mod_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_666LLN051_Mod,
(ModelNode*) &iedModel_GenericIO_666LLN051_Mod_ctlModel,
NULL,
0,
-1,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_Mod_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_666LLN051_Mod,
NULL,
NULL,
0,
-1,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0
};
DataObject iedModel_GenericIO_666LLN051_Beh = {
DataObjectModelType,
"Beh",
(ModelNode*) &iedModel_GenericIO_666LLN051,
(ModelNode*) &iedModel_GenericIO_666LLN051_Health,
(ModelNode*) &iedModel_GenericIO_666LLN051_Beh_stVal,
0,
-1
};
DataAttribute iedModel_GenericIO_666LLN051_Beh_stVal = {
DataAttributeModelType,
"stVal",
(ModelNode*) &iedModel_GenericIO_666LLN051_Beh,
(ModelNode*) &iedModel_GenericIO_666LLN051_Beh_q,
NULL,
0,
-1,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE + TRG_OPT_QUALITY_CHANGED,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_Beh_q = {
DataAttributeModelType,
"q",
(ModelNode*) &iedModel_GenericIO_666LLN051_Beh,
(ModelNode*) &iedModel_GenericIO_666LLN051_Beh_t,
NULL,
0,
-1,
IEC61850_FC_ST,
IEC61850_QUALITY,
0,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_Beh_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_666LLN051_Beh,
NULL,
NULL,
0,
-1,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0
};
DataObject iedModel_GenericIO_666LLN051_Health = {
DataObjectModelType,
"Health",
(ModelNode*) &iedModel_GenericIO_666LLN051,
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt,
(ModelNode*) &iedModel_GenericIO_666LLN051_Health_stVal,
0,
-1
};
DataAttribute iedModel_GenericIO_666LLN051_Health_stVal = {
DataAttributeModelType,
"stVal",
(ModelNode*) &iedModel_GenericIO_666LLN051_Health,
(ModelNode*) &iedModel_GenericIO_666LLN051_Health_q,
NULL,
0,
-1,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE + TRG_OPT_QUALITY_CHANGED,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_Health_q = {
DataAttributeModelType,
"q",
(ModelNode*) &iedModel_GenericIO_666LLN051_Health,
(ModelNode*) &iedModel_GenericIO_666LLN051_Health_t,
NULL,
0,
-1,
IEC61850_FC_ST,
IEC61850_QUALITY,
0,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_Health_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_666LLN051_Health,
NULL,
NULL,
0,
-1,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0
};
DataObject iedModel_GenericIO_666LLN051_NamPlt = {
DataObjectModelType,
"NamPlt",
(ModelNode*) &iedModel_GenericIO_666LLN051,
NULL,
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt_vendor,
0,
-1
};
DataAttribute iedModel_GenericIO_666LLN051_NamPlt_vendor = {
DataAttributeModelType,
"vendor",
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt,
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt_swRev,
NULL,
0,
-1,
IEC61850_FC_DC,
IEC61850_VISIBLE_STRING_255,
0,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_NamPlt_swRev = {
DataAttributeModelType,
"swRev",
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt,
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt_d,
NULL,
0,
-1,
IEC61850_FC_DC,
IEC61850_VISIBLE_STRING_255,
0,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_NamPlt_d = {
DataAttributeModelType,
"d",
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt,
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt_configRev,
NULL,
0,
-1,
IEC61850_FC_DC,
IEC61850_VISIBLE_STRING_255,
0,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_NamPlt_configRev = {
DataAttributeModelType,
"configRev",
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt,
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt_ldNs,
NULL,
0,
-1,
IEC61850_FC_DC,
IEC61850_VISIBLE_STRING_255,
0,
NULL,
0
};
DataAttribute iedModel_GenericIO_666LLN051_NamPlt_ldNs = {
DataAttributeModelType,
"ldNs",
(ModelNode*) &iedModel_GenericIO_666LLN051_NamPlt,
NULL,
NULL,
0,
-1,
IEC61850_FC_EX,
IEC61850_VISIBLE_STRING_255,
0,
NULL,
0
};
extern SettingGroupControlBlock iedModel_GenericIO_666LLN051_sgcb;
SettingGroupControlBlock iedModel_GenericIO_666LLN051_sgcb = {
&iedModel_GenericIO_666LLN051,
98,
77,
0,
false,
0,
0,
NULL,
};
extern SVControlBlock iedModel_GenericIO_666LLN051_smv0;
extern SVControlBlock iedModel_GenericIO_666LLN051_smv1;
static PhyComAddress iedModel_GenericIO_666LLN051_smv0_address = {
4,
123,
4000,
{0x1, 0xc, 0xcd, 0x4, 0x0, 0x1}
};
SVControlBlock iedModel_GenericIO_666LLN051_smv0 = {
&iedModel_GenericIO_666LLN051,
"NewSMVControl",
"666655dd",
"Events2",
23,
1,
555,
5,
&iedModel_GenericIO_666LLN051_smv0_address,
true,
98,
&iedModel_GenericIO_666LLN051_smv1
};
static PhyComAddress iedModel_GenericIO_666LLN051_smv1_address = {
4,
123,
4000,
{0x1, 0xc, 0xcd, 0x4, 0x0, 0x1}
};
SVControlBlock iedModel_GenericIO_666LLN051_smv1 = {
&iedModel_GenericIO_666LLN051,
"NewSMVControl1",
NULL,
"Events2",
0,
NULL,
-1,
-1,
&iedModel_GenericIO_666LLN051_smv1_address,
false,
-1,
NULL
};
IedModel iedModel = {
"simpleIO",
&iedModel_GenericIO,
NULL,
NULL,
NULL,
&iedModel_GenericIO_666LLN051_smv0,
&iedModel_GenericIO_666LLN051_sgcb,
NULL,
NULL,
initializeValues
};
static void
initializeValues()
{
iedModel_GenericIO_666LLN051_Mod_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_666LLN051_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0);
iedModel_GenericIO_666LLN051_Beh_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_666LLN051_Health_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_666LLN051_NamPlt_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation");
iedModel_GenericIO_666LLN051_NamPlt_swRev.mmsValue = MmsValue_newVisibleString("1.3.0");
iedModel_GenericIO_666LLN051_NamPlt_d.mmsValue = MmsValue_newVisibleString("libiec61850 server example");
}

@ -0,0 +1,62 @@
/*
* static_model.h
*
* automatically generated from ICDFiles/simpleIO_smv.icd
*/
#ifndef STATIC_MODEL_H_
#define STATIC_MODEL_H_
#include <stdlib.h>
#include "iec61850_model.h"
extern IedModel iedModel;
extern LogicalDevice iedModel_GenericIO;
extern LogicalNode iedModel_GenericIO_666LLN051;
extern DataObject iedModel_GenericIO_666LLN051_Mod;
extern DataAttribute iedModel_GenericIO_666LLN051_Mod_stVal;
extern DataAttribute iedModel_GenericIO_666LLN051_Mod_q;
extern DataAttribute iedModel_GenericIO_666LLN051_Mod_t;
extern DataAttribute iedModel_GenericIO_666LLN051_Mod_ctlModel;
extern DataObject iedModel_GenericIO_666LLN051_Beh;
extern DataAttribute iedModel_GenericIO_666LLN051_Beh_stVal;
extern DataAttribute iedModel_GenericIO_666LLN051_Beh_q;
extern DataAttribute iedModel_GenericIO_666LLN051_Beh_t;
extern DataObject iedModel_GenericIO_666LLN051_Health;
extern DataAttribute iedModel_GenericIO_666LLN051_Health_stVal;
extern DataAttribute iedModel_GenericIO_666LLN051_Health_q;
extern DataAttribute iedModel_GenericIO_666LLN051_Health_t;
extern DataObject iedModel_GenericIO_666LLN051_NamPlt;
extern DataAttribute iedModel_GenericIO_666LLN051_NamPlt_vendor;
extern DataAttribute iedModel_GenericIO_666LLN051_NamPlt_swRev;
extern DataAttribute iedModel_GenericIO_666LLN051_NamPlt_d;
extern DataAttribute iedModel_GenericIO_666LLN051_NamPlt_configRev;
extern DataAttribute iedModel_GenericIO_666LLN051_NamPlt_ldNs;
#define IEDMODEL_GenericIO (&iedModel_GenericIO)
#define IEDMODEL_GenericIO_666LLN051 (&iedModel_GenericIO_666LLN051)
#define IEDMODEL_GenericIO_666LLN051_Mod (&iedModel_GenericIO_666LLN051_Mod)
#define IEDMODEL_GenericIO_666LLN051_Mod_stVal (&iedModel_GenericIO_666LLN051_Mod_stVal)
#define IEDMODEL_GenericIO_666LLN051_Mod_q (&iedModel_GenericIO_666LLN051_Mod_q)
#define IEDMODEL_GenericIO_666LLN051_Mod_t (&iedModel_GenericIO_666LLN051_Mod_t)
#define IEDMODEL_GenericIO_666LLN051_Mod_ctlModel (&iedModel_GenericIO_666LLN051_Mod_ctlModel)
#define IEDMODEL_GenericIO_666LLN051_Beh (&iedModel_GenericIO_666LLN051_Beh)
#define IEDMODEL_GenericIO_666LLN051_Beh_stVal (&iedModel_GenericIO_666LLN051_Beh_stVal)
#define IEDMODEL_GenericIO_666LLN051_Beh_q (&iedModel_GenericIO_666LLN051_Beh_q)
#define IEDMODEL_GenericIO_666LLN051_Beh_t (&iedModel_GenericIO_666LLN051_Beh_t)
#define IEDMODEL_GenericIO_666LLN051_Health (&iedModel_GenericIO_666LLN051_Health)
#define IEDMODEL_GenericIO_666LLN051_Health_stVal (&iedModel_GenericIO_666LLN051_Health_stVal)
#define IEDMODEL_GenericIO_666LLN051_Health_q (&iedModel_GenericIO_666LLN051_Health_q)
#define IEDMODEL_GenericIO_666LLN051_Health_t (&iedModel_GenericIO_666LLN051_Health_t)
#define IEDMODEL_GenericIO_666LLN051_NamPlt (&iedModel_GenericIO_666LLN051_NamPlt)
#define IEDMODEL_GenericIO_666LLN051_NamPlt_vendor (&iedModel_GenericIO_666LLN051_NamPlt_vendor)
#define IEDMODEL_GenericIO_666LLN051_NamPlt_swRev (&iedModel_GenericIO_666LLN051_NamPlt_swRev)
#define IEDMODEL_GenericIO_666LLN051_NamPlt_d (&iedModel_GenericIO_666LLN051_NamPlt_d)
#define IEDMODEL_GenericIO_666LLN051_NamPlt_configRev (&iedModel_GenericIO_666LLN051_NamPlt_configRev)
#define IEDMODEL_GenericIO_666LLN051_NamPlt_ldNs (&iedModel_GenericIO_666LLN051_NamPlt_ldNs)
#endif /* STATIC_MODEL_H_ */

File diff suppressed because it is too large Load Diff

@ -0,0 +1,567 @@
/*
* static_model.h
*
* automatically generated from mhai_array.cid
*/
#ifndef STATIC_MODEL_H_
#define STATIC_MODEL_H_
#include <stdlib.h>
#include "iec61850_model.h"
extern IedModel iedModel;
extern LogicalDevice iedModel_ComplexArray;
extern LogicalNode iedModel_ComplexArray_LLN0;
extern DataObject iedModel_ComplexArray_LLN0_Mod;
extern DataAttribute iedModel_ComplexArray_LLN0_Mod_stVal;
extern DataAttribute iedModel_ComplexArray_LLN0_Mod_q;
extern DataAttribute iedModel_ComplexArray_LLN0_Mod_t;
extern DataAttribute iedModel_ComplexArray_LLN0_Mod_ctlModel;
extern DataObject iedModel_ComplexArray_LLN0_Beh;
extern DataAttribute iedModel_ComplexArray_LLN0_Beh_stVal;
extern DataAttribute iedModel_ComplexArray_LLN0_Beh_q;
extern DataAttribute iedModel_ComplexArray_LLN0_Beh_t;
extern DataObject iedModel_ComplexArray_LLN0_Health;
extern DataAttribute iedModel_ComplexArray_LLN0_Health_stVal;
extern DataAttribute iedModel_ComplexArray_LLN0_Health_q;
extern DataAttribute iedModel_ComplexArray_LLN0_Health_t;
extern DataObject iedModel_ComplexArray_LLN0_NamPlt;
extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_vendor;
extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_swRev;
extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_d;
extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_configRev;
extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_ldNs;
extern LogicalNode iedModel_ComplexArray_LPHD1;
extern DataObject iedModel_ComplexArray_LPHD1_PhyNam;
extern DataAttribute iedModel_ComplexArray_LPHD1_PhyNam_vendor;
extern DataObject iedModel_ComplexArray_LPHD1_PhyHealth;
extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_stVal;
extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_q;
extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_t;
extern DataObject iedModel_ComplexArray_LPHD1_Proxy;
extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_stVal;
extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_q;
extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_t;
extern LogicalNode iedModel_ComplexArray_GGIO1;
extern DataObject iedModel_ComplexArray_GGIO1_Mod;
extern DataAttribute iedModel_ComplexArray_GGIO1_Mod_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_Mod_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_Mod_t;
extern DataAttribute iedModel_ComplexArray_GGIO1_Mod_ctlModel;
extern DataObject iedModel_ComplexArray_GGIO1_Beh;
extern DataAttribute iedModel_ComplexArray_GGIO1_Beh_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_Beh_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_Beh_t;
extern DataObject iedModel_ComplexArray_GGIO1_Health;
extern DataAttribute iedModel_ComplexArray_GGIO1_Health_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_Health_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_Health_t;
extern DataObject iedModel_ComplexArray_GGIO1_NamPlt;
extern DataAttribute iedModel_ComplexArray_GGIO1_NamPlt_vendor;
extern DataAttribute iedModel_ComplexArray_GGIO1_NamPlt_swRev;
extern DataAttribute iedModel_ComplexArray_GGIO1_NamPlt_d;
extern DataAttribute iedModel_ComplexArray_GGIO1_NamPlt_dU;
extern DataObject iedModel_ComplexArray_GGIO1_AnIn1;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn1_mag;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn1_mag_f;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn1_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn1_t;
extern DataObject iedModel_ComplexArray_GGIO1_AnIn2;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn2_mag;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn2_mag_f;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn2_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn2_t;
extern DataObject iedModel_ComplexArray_GGIO1_AnIn3;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn3_mag;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn3_mag_f;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn3_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn3_t;
extern DataObject iedModel_ComplexArray_GGIO1_AnIn4;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn4_mag;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn4_mag_f;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn4_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_AnIn4_t;
extern DataObject iedModel_ComplexArray_GGIO1_SPCSO1;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_origin;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_origin_orCat;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_origin_orIdent;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_ctlNum;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_t;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_ctlModel;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_ctlVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin_orCat;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin_orIdent;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_ctlNum;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_T;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_Test;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO1_Oper_Check;
extern DataObject iedModel_ComplexArray_GGIO1_SPCSO2;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_ctlVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin_orCat;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin_orIdent;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_ctlNum;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_T;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_Test;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_Oper_Check;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_ctlModel;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO2_t;
extern DataObject iedModel_ComplexArray_GGIO1_SPCSO3;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_ctlVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin_orCat;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin_orIdent;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_ctlNum;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_T;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_Test;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_Oper_Check;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_ctlModel;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO3_t;
extern DataObject iedModel_ComplexArray_GGIO1_SPCSO4;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_ctlVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin_orCat;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin_orIdent;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_ctlNum;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_T;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_Test;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_Oper_Check;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_ctlModel;
extern DataAttribute iedModel_ComplexArray_GGIO1_SPCSO4_t;
extern DataObject iedModel_ComplexArray_GGIO1_Ind1;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind1_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind1_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind1_t;
extern DataObject iedModel_ComplexArray_GGIO1_Ind2;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind2_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind2_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind2_t;
extern DataObject iedModel_ComplexArray_GGIO1_Ind3;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind3_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind3_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind3_t;
extern DataObject iedModel_ComplexArray_GGIO1_Ind4;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind4_stVal;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind4_q;
extern DataAttribute iedModel_ComplexArray_GGIO1_Ind4_t;
extern LogicalNode iedModel_ComplexArray_MHAI1;
extern DataObject iedModel_ComplexArray_MHAI1_HA;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_0;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_0_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_1;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_1_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_2;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_2_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_3;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_3_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_4;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_4_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_5;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_5_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_6;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_6_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_7;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_7_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_8;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_8_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_9;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_9_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_10;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_10_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_11;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_11_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_12;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_12_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_13;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_13_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_14;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_14_t;
extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar_15;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang_f;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_q;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_15_t;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numHar;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_evalTm;
extern DataAttribute iedModel_ComplexArray_MHAI1_HA_frequency;
#define IEDMODEL_ComplexArray (&iedModel_ComplexArray)
#define IEDMODEL_ComplexArray_LLN0 (&iedModel_ComplexArray_LLN0)
#define IEDMODEL_ComplexArray_LLN0_Mod (&iedModel_ComplexArray_LLN0_Mod)
#define IEDMODEL_ComplexArray_LLN0_Mod_stVal (&iedModel_ComplexArray_LLN0_Mod_stVal)
#define IEDMODEL_ComplexArray_LLN0_Mod_q (&iedModel_ComplexArray_LLN0_Mod_q)
#define IEDMODEL_ComplexArray_LLN0_Mod_t (&iedModel_ComplexArray_LLN0_Mod_t)
#define IEDMODEL_ComplexArray_LLN0_Mod_ctlModel (&iedModel_ComplexArray_LLN0_Mod_ctlModel)
#define IEDMODEL_ComplexArray_LLN0_Beh (&iedModel_ComplexArray_LLN0_Beh)
#define IEDMODEL_ComplexArray_LLN0_Beh_stVal (&iedModel_ComplexArray_LLN0_Beh_stVal)
#define IEDMODEL_ComplexArray_LLN0_Beh_q (&iedModel_ComplexArray_LLN0_Beh_q)
#define IEDMODEL_ComplexArray_LLN0_Beh_t (&iedModel_ComplexArray_LLN0_Beh_t)
#define IEDMODEL_ComplexArray_LLN0_Health (&iedModel_ComplexArray_LLN0_Health)
#define IEDMODEL_ComplexArray_LLN0_Health_stVal (&iedModel_ComplexArray_LLN0_Health_stVal)
#define IEDMODEL_ComplexArray_LLN0_Health_q (&iedModel_ComplexArray_LLN0_Health_q)
#define IEDMODEL_ComplexArray_LLN0_Health_t (&iedModel_ComplexArray_LLN0_Health_t)
#define IEDMODEL_ComplexArray_LLN0_NamPlt (&iedModel_ComplexArray_LLN0_NamPlt)
#define IEDMODEL_ComplexArray_LLN0_NamPlt_vendor (&iedModel_ComplexArray_LLN0_NamPlt_vendor)
#define IEDMODEL_ComplexArray_LLN0_NamPlt_swRev (&iedModel_ComplexArray_LLN0_NamPlt_swRev)
#define IEDMODEL_ComplexArray_LLN0_NamPlt_d (&iedModel_ComplexArray_LLN0_NamPlt_d)
#define IEDMODEL_ComplexArray_LLN0_NamPlt_configRev (&iedModel_ComplexArray_LLN0_NamPlt_configRev)
#define IEDMODEL_ComplexArray_LLN0_NamPlt_ldNs (&iedModel_ComplexArray_LLN0_NamPlt_ldNs)
#define IEDMODEL_ComplexArray_LPHD1 (&iedModel_ComplexArray_LPHD1)
#define IEDMODEL_ComplexArray_LPHD1_PhyNam (&iedModel_ComplexArray_LPHD1_PhyNam)
#define IEDMODEL_ComplexArray_LPHD1_PhyNam_vendor (&iedModel_ComplexArray_LPHD1_PhyNam_vendor)
#define IEDMODEL_ComplexArray_LPHD1_PhyHealth (&iedModel_ComplexArray_LPHD1_PhyHealth)
#define IEDMODEL_ComplexArray_LPHD1_PhyHealth_stVal (&iedModel_ComplexArray_LPHD1_PhyHealth_stVal)
#define IEDMODEL_ComplexArray_LPHD1_PhyHealth_q (&iedModel_ComplexArray_LPHD1_PhyHealth_q)
#define IEDMODEL_ComplexArray_LPHD1_PhyHealth_t (&iedModel_ComplexArray_LPHD1_PhyHealth_t)
#define IEDMODEL_ComplexArray_LPHD1_Proxy (&iedModel_ComplexArray_LPHD1_Proxy)
#define IEDMODEL_ComplexArray_LPHD1_Proxy_stVal (&iedModel_ComplexArray_LPHD1_Proxy_stVal)
#define IEDMODEL_ComplexArray_LPHD1_Proxy_q (&iedModel_ComplexArray_LPHD1_Proxy_q)
#define IEDMODEL_ComplexArray_LPHD1_Proxy_t (&iedModel_ComplexArray_LPHD1_Proxy_t)
#define IEDMODEL_ComplexArray_GGIO1 (&iedModel_ComplexArray_GGIO1)
#define IEDMODEL_ComplexArray_GGIO1_Mod (&iedModel_ComplexArray_GGIO1_Mod)
#define IEDMODEL_ComplexArray_GGIO1_Mod_stVal (&iedModel_ComplexArray_GGIO1_Mod_stVal)
#define IEDMODEL_ComplexArray_GGIO1_Mod_q (&iedModel_ComplexArray_GGIO1_Mod_q)
#define IEDMODEL_ComplexArray_GGIO1_Mod_t (&iedModel_ComplexArray_GGIO1_Mod_t)
#define IEDMODEL_ComplexArray_GGIO1_Mod_ctlModel (&iedModel_ComplexArray_GGIO1_Mod_ctlModel)
#define IEDMODEL_ComplexArray_GGIO1_Beh (&iedModel_ComplexArray_GGIO1_Beh)
#define IEDMODEL_ComplexArray_GGIO1_Beh_stVal (&iedModel_ComplexArray_GGIO1_Beh_stVal)
#define IEDMODEL_ComplexArray_GGIO1_Beh_q (&iedModel_ComplexArray_GGIO1_Beh_q)
#define IEDMODEL_ComplexArray_GGIO1_Beh_t (&iedModel_ComplexArray_GGIO1_Beh_t)
#define IEDMODEL_ComplexArray_GGIO1_Health (&iedModel_ComplexArray_GGIO1_Health)
#define IEDMODEL_ComplexArray_GGIO1_Health_stVal (&iedModel_ComplexArray_GGIO1_Health_stVal)
#define IEDMODEL_ComplexArray_GGIO1_Health_q (&iedModel_ComplexArray_GGIO1_Health_q)
#define IEDMODEL_ComplexArray_GGIO1_Health_t (&iedModel_ComplexArray_GGIO1_Health_t)
#define IEDMODEL_ComplexArray_GGIO1_NamPlt (&iedModel_ComplexArray_GGIO1_NamPlt)
#define IEDMODEL_ComplexArray_GGIO1_NamPlt_vendor (&iedModel_ComplexArray_GGIO1_NamPlt_vendor)
#define IEDMODEL_ComplexArray_GGIO1_NamPlt_swRev (&iedModel_ComplexArray_GGIO1_NamPlt_swRev)
#define IEDMODEL_ComplexArray_GGIO1_NamPlt_d (&iedModel_ComplexArray_GGIO1_NamPlt_d)
#define IEDMODEL_ComplexArray_GGIO1_NamPlt_dU (&iedModel_ComplexArray_GGIO1_NamPlt_dU)
#define IEDMODEL_ComplexArray_GGIO1_AnIn1 (&iedModel_ComplexArray_GGIO1_AnIn1)
#define IEDMODEL_ComplexArray_GGIO1_AnIn1_mag (&iedModel_ComplexArray_GGIO1_AnIn1_mag)
#define IEDMODEL_ComplexArray_GGIO1_AnIn1_mag_f (&iedModel_ComplexArray_GGIO1_AnIn1_mag_f)
#define IEDMODEL_ComplexArray_GGIO1_AnIn1_q (&iedModel_ComplexArray_GGIO1_AnIn1_q)
#define IEDMODEL_ComplexArray_GGIO1_AnIn1_t (&iedModel_ComplexArray_GGIO1_AnIn1_t)
#define IEDMODEL_ComplexArray_GGIO1_AnIn2 (&iedModel_ComplexArray_GGIO1_AnIn2)
#define IEDMODEL_ComplexArray_GGIO1_AnIn2_mag (&iedModel_ComplexArray_GGIO1_AnIn2_mag)
#define IEDMODEL_ComplexArray_GGIO1_AnIn2_mag_f (&iedModel_ComplexArray_GGIO1_AnIn2_mag_f)
#define IEDMODEL_ComplexArray_GGIO1_AnIn2_q (&iedModel_ComplexArray_GGIO1_AnIn2_q)
#define IEDMODEL_ComplexArray_GGIO1_AnIn2_t (&iedModel_ComplexArray_GGIO1_AnIn2_t)
#define IEDMODEL_ComplexArray_GGIO1_AnIn3 (&iedModel_ComplexArray_GGIO1_AnIn3)
#define IEDMODEL_ComplexArray_GGIO1_AnIn3_mag (&iedModel_ComplexArray_GGIO1_AnIn3_mag)
#define IEDMODEL_ComplexArray_GGIO1_AnIn3_mag_f (&iedModel_ComplexArray_GGIO1_AnIn3_mag_f)
#define IEDMODEL_ComplexArray_GGIO1_AnIn3_q (&iedModel_ComplexArray_GGIO1_AnIn3_q)
#define IEDMODEL_ComplexArray_GGIO1_AnIn3_t (&iedModel_ComplexArray_GGIO1_AnIn3_t)
#define IEDMODEL_ComplexArray_GGIO1_AnIn4 (&iedModel_ComplexArray_GGIO1_AnIn4)
#define IEDMODEL_ComplexArray_GGIO1_AnIn4_mag (&iedModel_ComplexArray_GGIO1_AnIn4_mag)
#define IEDMODEL_ComplexArray_GGIO1_AnIn4_mag_f (&iedModel_ComplexArray_GGIO1_AnIn4_mag_f)
#define IEDMODEL_ComplexArray_GGIO1_AnIn4_q (&iedModel_ComplexArray_GGIO1_AnIn4_q)
#define IEDMODEL_ComplexArray_GGIO1_AnIn4_t (&iedModel_ComplexArray_GGIO1_AnIn4_t)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1 (&iedModel_ComplexArray_GGIO1_SPCSO1)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_origin (&iedModel_ComplexArray_GGIO1_SPCSO1_origin)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_origin_orCat (&iedModel_ComplexArray_GGIO1_SPCSO1_origin_orCat)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_origin_orIdent (&iedModel_ComplexArray_GGIO1_SPCSO1_origin_orIdent)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_ctlNum (&iedModel_ComplexArray_GGIO1_SPCSO1_ctlNum)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_stVal (&iedModel_ComplexArray_GGIO1_SPCSO1_stVal)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_q (&iedModel_ComplexArray_GGIO1_SPCSO1_q)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_t (&iedModel_ComplexArray_GGIO1_SPCSO1_t)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_ctlModel (&iedModel_ComplexArray_GGIO1_SPCSO1_ctlModel)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_Oper (&iedModel_ComplexArray_GGIO1_SPCSO1_Oper)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_Oper_ctlVal (&iedModel_ComplexArray_GGIO1_SPCSO1_Oper_ctlVal)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_Oper_origin (&iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_Oper_origin_orCat (&iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin_orCat)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_Oper_origin_orIdent (&iedModel_ComplexArray_GGIO1_SPCSO1_Oper_origin_orIdent)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_Oper_ctlNum (&iedModel_ComplexArray_GGIO1_SPCSO1_Oper_ctlNum)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_Oper_T (&iedModel_ComplexArray_GGIO1_SPCSO1_Oper_T)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_Oper_Test (&iedModel_ComplexArray_GGIO1_SPCSO1_Oper_Test)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO1_Oper_Check (&iedModel_ComplexArray_GGIO1_SPCSO1_Oper_Check)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2 (&iedModel_ComplexArray_GGIO1_SPCSO2)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_stVal (&iedModel_ComplexArray_GGIO1_SPCSO2_stVal)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_q (&iedModel_ComplexArray_GGIO1_SPCSO2_q)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_Oper (&iedModel_ComplexArray_GGIO1_SPCSO2_Oper)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_Oper_ctlVal (&iedModel_ComplexArray_GGIO1_SPCSO2_Oper_ctlVal)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_Oper_origin (&iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_Oper_origin_orCat (&iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin_orCat)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_Oper_origin_orIdent (&iedModel_ComplexArray_GGIO1_SPCSO2_Oper_origin_orIdent)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_Oper_ctlNum (&iedModel_ComplexArray_GGIO1_SPCSO2_Oper_ctlNum)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_Oper_T (&iedModel_ComplexArray_GGIO1_SPCSO2_Oper_T)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_Oper_Test (&iedModel_ComplexArray_GGIO1_SPCSO2_Oper_Test)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_Oper_Check (&iedModel_ComplexArray_GGIO1_SPCSO2_Oper_Check)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_ctlModel (&iedModel_ComplexArray_GGIO1_SPCSO2_ctlModel)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO2_t (&iedModel_ComplexArray_GGIO1_SPCSO2_t)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3 (&iedModel_ComplexArray_GGIO1_SPCSO3)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_stVal (&iedModel_ComplexArray_GGIO1_SPCSO3_stVal)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_q (&iedModel_ComplexArray_GGIO1_SPCSO3_q)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_Oper (&iedModel_ComplexArray_GGIO1_SPCSO3_Oper)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_Oper_ctlVal (&iedModel_ComplexArray_GGIO1_SPCSO3_Oper_ctlVal)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_Oper_origin (&iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_Oper_origin_orCat (&iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin_orCat)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_Oper_origin_orIdent (&iedModel_ComplexArray_GGIO1_SPCSO3_Oper_origin_orIdent)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_Oper_ctlNum (&iedModel_ComplexArray_GGIO1_SPCSO3_Oper_ctlNum)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_Oper_T (&iedModel_ComplexArray_GGIO1_SPCSO3_Oper_T)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_Oper_Test (&iedModel_ComplexArray_GGIO1_SPCSO3_Oper_Test)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_Oper_Check (&iedModel_ComplexArray_GGIO1_SPCSO3_Oper_Check)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_ctlModel (&iedModel_ComplexArray_GGIO1_SPCSO3_ctlModel)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO3_t (&iedModel_ComplexArray_GGIO1_SPCSO3_t)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4 (&iedModel_ComplexArray_GGIO1_SPCSO4)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_stVal (&iedModel_ComplexArray_GGIO1_SPCSO4_stVal)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_q (&iedModel_ComplexArray_GGIO1_SPCSO4_q)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_Oper (&iedModel_ComplexArray_GGIO1_SPCSO4_Oper)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_Oper_ctlVal (&iedModel_ComplexArray_GGIO1_SPCSO4_Oper_ctlVal)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_Oper_origin (&iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_Oper_origin_orCat (&iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin_orCat)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_Oper_origin_orIdent (&iedModel_ComplexArray_GGIO1_SPCSO4_Oper_origin_orIdent)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_Oper_ctlNum (&iedModel_ComplexArray_GGIO1_SPCSO4_Oper_ctlNum)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_Oper_T (&iedModel_ComplexArray_GGIO1_SPCSO4_Oper_T)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_Oper_Test (&iedModel_ComplexArray_GGIO1_SPCSO4_Oper_Test)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_Oper_Check (&iedModel_ComplexArray_GGIO1_SPCSO4_Oper_Check)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_ctlModel (&iedModel_ComplexArray_GGIO1_SPCSO4_ctlModel)
#define IEDMODEL_ComplexArray_GGIO1_SPCSO4_t (&iedModel_ComplexArray_GGIO1_SPCSO4_t)
#define IEDMODEL_ComplexArray_GGIO1_Ind1 (&iedModel_ComplexArray_GGIO1_Ind1)
#define IEDMODEL_ComplexArray_GGIO1_Ind1_stVal (&iedModel_ComplexArray_GGIO1_Ind1_stVal)
#define IEDMODEL_ComplexArray_GGIO1_Ind1_q (&iedModel_ComplexArray_GGIO1_Ind1_q)
#define IEDMODEL_ComplexArray_GGIO1_Ind1_t (&iedModel_ComplexArray_GGIO1_Ind1_t)
#define IEDMODEL_ComplexArray_GGIO1_Ind2 (&iedModel_ComplexArray_GGIO1_Ind2)
#define IEDMODEL_ComplexArray_GGIO1_Ind2_stVal (&iedModel_ComplexArray_GGIO1_Ind2_stVal)
#define IEDMODEL_ComplexArray_GGIO1_Ind2_q (&iedModel_ComplexArray_GGIO1_Ind2_q)
#define IEDMODEL_ComplexArray_GGIO1_Ind2_t (&iedModel_ComplexArray_GGIO1_Ind2_t)
#define IEDMODEL_ComplexArray_GGIO1_Ind3 (&iedModel_ComplexArray_GGIO1_Ind3)
#define IEDMODEL_ComplexArray_GGIO1_Ind3_stVal (&iedModel_ComplexArray_GGIO1_Ind3_stVal)
#define IEDMODEL_ComplexArray_GGIO1_Ind3_q (&iedModel_ComplexArray_GGIO1_Ind3_q)
#define IEDMODEL_ComplexArray_GGIO1_Ind3_t (&iedModel_ComplexArray_GGIO1_Ind3_t)
#define IEDMODEL_ComplexArray_GGIO1_Ind4 (&iedModel_ComplexArray_GGIO1_Ind4)
#define IEDMODEL_ComplexArray_GGIO1_Ind4_stVal (&iedModel_ComplexArray_GGIO1_Ind4_stVal)
#define IEDMODEL_ComplexArray_GGIO1_Ind4_q (&iedModel_ComplexArray_GGIO1_Ind4_q)
#define IEDMODEL_ComplexArray_GGIO1_Ind4_t (&iedModel_ComplexArray_GGIO1_Ind4_t)
#define IEDMODEL_ComplexArray_MHAI1 (&iedModel_ComplexArray_MHAI1)
#define IEDMODEL_ComplexArray_MHAI1_HA (&iedModel_ComplexArray_MHAI1_HA)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar (&iedModel_ComplexArray_MHAI1_HA_phsAHar)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_0_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_0_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_1_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_1_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_2_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_2_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_3_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_3_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_4_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_4_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_5_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_5_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_6_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_6_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_7_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_7_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_8_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_8_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_9_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_9_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_10_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_10_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_11_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_11_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_12_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_12_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_13_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_13_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_14_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_14_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_mag_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_cVal_ang_f)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_q)
#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_15_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_15_t)
#define IEDMODEL_ComplexArray_MHAI1_HA_numHar (&iedModel_ComplexArray_MHAI1_HA_numHar)
#define IEDMODEL_ComplexArray_MHAI1_HA_numCyc (&iedModel_ComplexArray_MHAI1_HA_numCyc)
#define IEDMODEL_ComplexArray_MHAI1_HA_evalTm (&iedModel_ComplexArray_MHAI1_HA_evalTm)
#define IEDMODEL_ComplexArray_MHAI1_HA_frequency (&iedModel_ComplexArray_MHAI1_HA_frequency)
#endif /* STATIC_MODEL_H_ */

@ -0,0 +1,103 @@
#!/bin/bash
###### Function to replace tabs with spaces in all .cs files################
format_cs_files() {
echo "Formatting .cs files: Replacing tabs with spaces..."
find . -type f -name "*.cs" -exec sed -i 's/\t/ /g' {} +
echo "Formatting completed!"
}
###### Function to replace tabs with spaces in all .cs files################
format_c_files() {
echo "Formatting .c files: Replacing tabs with spaces..."
find . -type f -name "*.c" -exec sed -i 's/\t/ /g' {} +
echo "Formatting completed!"
}
#########Clean directory#########################
clean_build_directories()
{
echo "Removing .vs/, bin/, obj/ folders, any .git directories or files, and doxydoc.NET folder..."
find "$FOLDER_NAME" -type d \( -name "vs" -o -name "bin" -o -name "obj" -o -name "doxydoc.NET" -o -name ".git" \) -exec rm -rf {} +
find "$FOLDER_NAME" -type f -name ".git" -exec rm -f {} +
echo "Cleanup completed!"
}
##########Create release folder#####################
create_release_folder()
{
# Print the value
echo "Creating folder: $FOLDER_NAME"
# Create the folder
mkdir -p "$FOLDER_NAME"
echo "Folder '$FOLDER_NAME' created successfully!"
cp -rf config $FOLDER_NAME
cp -rf demos $FOLDER_NAME
cp -rf dotnet $FOLDER_NAME
cp -rf examples $FOLDER_NAME
cp -rf fuzz $FOLDER_NAME
cp -rf hal $FOLDER_NAME
cp -rf pyiec61850 $FOLDER_NAME
cp -rf src $FOLDER_NAME
cp -rf tools $FOLDER_NAME
cp -rf CHANGELOG $FOLDER_NAME
cp -rf CMakeLists.txt $FOLDER_NAME
cp -rf Makefile $FOLDER_NAME
cp -rf COPYING $FOLDER_NAME
cp -rf mingw-w64-x86_64.cmake $FOLDER_NAME
cp -rf README.md $FOLDER_NAME
cp -rf SECURITY.md $FOLDER_NAME
}
################ Function to create a tar.gz archive############################
compress_to_tar() {
ARCHIVE_NAME="$FOLDER_NAME.tar.gz"
echo "Creating archive: $ARCHIVE_NAME"
tar -czf "$ARCHIVE_NAME" -C "$(dirname "$FOLDER_NAME")" "$(basename "$FOLDER_NAME")"
echo "Archive '$ARCHIVE_NAME' created successfully!"
}
# Wait for user input if arguments are missing
while [ -z "$1" ]; do
read -p "Enter version: " VERSION_NAME_INPUT
set -- "$VERSION_NAME_INPUT" "$2"
done
while [ -z "$2" ]; do
read -p "Enter option ([1]release/[2]formatFiles/[3]all): " OPTION_INPUT
set -- "$1" "$OPTION_INPUT"
done
# Store arguments
PREFIX="../libiec61850-"
FOLDER_NAME="${PREFIX}${1}"
OPTION="$2"
# Execute option case
case "$OPTION" in
1)
create_release_folder
;;
2)
format_cs_files
format_c_files
;;
3)
format_cs_files
format_c_files
create_release_folder
clean_build_directories
compress_to_tar
;;
*)
echo "Invalid option. Use 'prepare', 'release', or 'delete'."
exit 1
;;
esac
#####################################################

@ -0,0 +1,59 @@
using IEC61850.SCL;
using IEC61850.SCL.DataModel;
using System;
using System.IO;
using System.Linq;
using System.Xml;
namespace DynamicModel
{
public class DynamicModel
{
public DynamicModel(string fileName, FileStream stream,
string iedName, string accessPointName)
{
try
{
SclDocument sclParser = new SclDocument(fileName);
SclIED ied = null;
if (iedName == null)
ied = sclParser.IEDs.First();
else
ied = sclParser.IEDs.Find(x => x.Name == iedName);
if (ied == null)
{
throw new Exception("IED model not found in SCL file! Exit.");
}
SclAccessPoint accessPoint = null;
if (accessPointName == null)
accessPoint = ied.AccessPoints.First();
else
accessPoint = ied.AccessPoints.Find(x => x.Name == accessPointName);
if (accessPoint == null)
{
throw new Exception("AccessPoint not found in SCL file! Exit.");
}
IEDDataModel iedModel = sclParser.GetDataModel(ied.Name, accessPoint.Name);
using (StreamWriter writer = new StreamWriter(stream))
{
DynamicModelGenerator dynamicModelGenerator = new DynamicModelGenerator(sclParser, writer, iedModel, accessPoint);
}
}
catch (Exception ex)
{
Console.Write(ex.ToString());
}
}
}
}

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\SCLParser\SCLParser.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,11 @@
This tool can be accessed from both the command line of visual studio.
To run the tool from the command line a command of the following format has to be generated:
<generator option> <ICD file> -ied <ied-name> -ap <access-point-name> -out <output-name> -modelprefix <model-prefix>
The values in <> have to be replaced with the values corresponding to an arbitrary ICD file.
To run this command completely the command should look like this:
Example:
dotnet Tools.dll 1 ICDFiles/genericIO.icd -ied simpleIO -ap accessPoint1 -out static_model -modelprefix iedModel

@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>

@ -0,0 +1,161 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System.Collections.Generic;
namespace IEC61850.SCL
{
public enum CDCAttributeTrgOp
{
NONE,
DCHG,
QCHG,
DUPD
}
public enum CDCAttributeOptionality
{
M,
O,
PICS_SUBST,
AC_DLNDA_M,
AC_DLN_M
}
public class CDCAttribute
{
private string name;
private AttributeType bType;
private string type = null;
private SclFC fc;
CDCAttributeTrgOp trgOp;
CDCAttributeOptionality optionality;
public string Name
{
get
{
return name;
}
}
public AttributeType BType
{
get
{
return bType;
}
}
public string Type
{
get
{
return type;
}
}
public SclFC Fc
{
get
{
return fc;
}
}
public CDCAttributeTrgOp TrgOp
{
get
{
return trgOp;
}
}
public CDCAttribute(string name, AttributeType bType, string type, SclFC fc, CDCAttributeTrgOp trgOp, CDCAttributeOptionality optionality)
{
this.name = name;
this.bType = bType;
this.type = type;
this.fc = fc;
this.trgOp = trgOp;
this.optionality = optionality;
}
}
public class CommonDataClass
{
private string name;
public string Name
{
get
{
return name;
}
}
public List<CDCAttribute> Attributes
{
get
{
return attributes;
}
}
List<CDCAttribute> attributes = new List<CDCAttribute>();
public CommonDataClass(string name, CDCAttribute[] attributes)
{
this.name = name;
foreach (CDCAttribute cdcAttribute in attributes)
this.attributes.Add(cdcAttribute);
}
}
public class StandardCommonDataClasses
{
private List<CommonDataClass> cdcs = new List<CommonDataClass>();
public StandardCommonDataClasses()
{
cdcs.Add(new CommonDataClass("SPS", new CDCAttribute[] {
new CDCAttribute("stVal", AttributeType.BOOLEAN, null, SclFC.ST, CDCAttributeTrgOp.DCHG, CDCAttributeOptionality.M),
new CDCAttribute("q", AttributeType.QUALITY, null, SclFC.ST, CDCAttributeTrgOp.QCHG, CDCAttributeOptionality.M),
new CDCAttribute("t", AttributeType.TIMESTAMP, null, SclFC.ST, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.M),
new CDCAttribute("subEna", AttributeType.BOOLEAN, null, SclFC.SV, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.PICS_SUBST),
new CDCAttribute("subVal", AttributeType.BOOLEAN, null, SclFC.SV, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.PICS_SUBST),
new CDCAttribute("subQ", AttributeType.QUALITY, null, SclFC.SV, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.PICS_SUBST),
new CDCAttribute("subID", AttributeType.VISIBLE_STRING_64, null, SclFC.SV, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.PICS_SUBST),
new CDCAttribute("blkEna", AttributeType.BOOLEAN, null, SclFC.BL, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.O),
new CDCAttribute("d", AttributeType.VISIBLE_STRING_255, null, SclFC.DC, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.O),
new CDCAttribute("dU", AttributeType.UNICODE_STRING_255, null, SclFC.DC, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.O),
new CDCAttribute("cdcNs", AttributeType.VISIBLE_STRING_255, null, SclFC.EX, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.AC_DLNDA_M),
new CDCAttribute("cdcName", AttributeType.VISIBLE_STRING_255, null, SclFC.EX, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.AC_DLNDA_M),
new CDCAttribute("dataNs", AttributeType.VISIBLE_STRING_255, null, SclFC.EX, CDCAttributeTrgOp.NONE, CDCAttributeOptionality.AC_DLN_M)
}));
}
public CommonDataClass GetByName(string cdcName)
{
foreach (CommonDataClass cdc in cdcs)
{
if (cdc.Name.Equals(cdcName))
return cdc;
}
return null;
}
}
}

@ -0,0 +1,852 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System.Collections.Generic;
namespace IEC61850
{
namespace SCL
{
namespace DataModel
{
public class IEDModelNode
{
protected string name;
protected string objRef;
private IEDModelNode parent;
public IEDModelNode Parent
{
get
{
return parent;
}
}
public string ObjRef
{
get
{
return objRef;
}
}
public string Name
{
get
{
return name;
}
set
{
name = value;
//change objRef;
int index = objRef.LastIndexOf(".");
if (index >= 0)
objRef = objRef.Substring(0, index + 1) + value;
}
}
public string IedName
{
get
{
if (this is IEDDataModel)
return Name;
else
return parent.IedName;
}
}
public IEDModelNode(string name, IEDModelNode parent)
{
this.name = name;
this.parent = parent;
}
}
public class IEDDataModel : IEDModelNode
{
private List<LogicalDevice> logicalDevices = new List<LogicalDevice>();
public List<LogicalDevice> LogicalDevices
{
get
{
return logicalDevices;
}
}
public IEDDataModel(string name) : base(name, null)
{
}
private IEDModelNode GetChildNode(IEDModelNode node, string objRefPart)
{
string[] tokens = objRefPart.Split(new char[] { '.' }, 2);
if (tokens.Length > 0)
{
if (node is LogicalDevice)
{
LogicalDevice ld = node as LogicalDevice;
foreach (LogicalNode ln in ld.LogicalNodes)
{
if (ln.Name.Equals(tokens[0]))
{
if (tokens.Length == 1)
return ln;
else
{
return GetChildNode(ln, tokens[1]);
}
}
}
}
else if (node is LogicalNode)
{
LogicalNode ln = node as LogicalNode;
foreach (DataObject dobj in ln.DataObjects)
{
if (dobj.Name.Equals(tokens[0]))
{
if (tokens.Length == 1)
return dobj;
else
{
return GetChildNode(dobj, tokens[1]);
}
}
}
}
else if (node is DataObject)
{
DataObject dobj = node as DataObject;
foreach (DataObjectOrAttribute doa in dobj.DataObjectsAndAttributes)
{
if (doa.Name.Equals(tokens[0]))
{
if (tokens.Length == 1)
return doa;
else
{
return GetChildNode(doa, tokens[1]);
}
}
}
}
else if (node is DataAttribute)
{
DataAttribute da = node as DataAttribute;
foreach (DataAttribute sda in da.SubDataAttributes)
{
if (sda.Name.Equals(tokens[0]))
{
if (tokens.Length == 1)
return sda;
else
{
return GetChildNode(sda, tokens[1]);
}
}
}
}
return null;
}
else
return null;
}
/// <summary>
/// Get the model node with the provided object reference
/// </summary>
/// <param name="objRef">object reference in the format LD/LN.DO[.SDO].DA[.SDA]</param>
/// <returns></returns>
public IEDModelNode GetModelNode(string objRef)
{
string[] tokens = objRef.Split(new char[] { '/' }, 2);
if (tokens.Length > 0)
{
foreach (LogicalDevice ld in logicalDevices)
{
if (ld.ObjRef.Equals(tokens[0]))
{
if (tokens.Length == 1)
return ld;
else
{
return GetChildNode(ld, tokens[1]);
}
}
}
return null;
}
else
return null;
}
}
public class LogicalDevice : IEDModelNode
{
private SclDocument SclDocument = null;
private List<LogicalNode> logicalNodes = new List<LogicalNode>();
private SclLDevice sclLDevice;
private Namespace nameSpace = null;
private string inst;
public void UpdateName()
{
string name = "";
if (IedName != null)
name += IedName;
if (inst != null)
name += inst;
this.name = name;
objRef = name;
}
public SclLDevice SclLDevice
{
get => sclLDevice; set => sclLDevice = value;
}
public string Inst
{
get
{
return inst;
}
set
{
inst = value;
UpdateName();
}
}
public List<LogicalNode> LogicalNodes
{
get
{
return logicalNodes;
}
}
public Namespace NameSpace { get => nameSpace; set => nameSpace = value; }
public LogicalNode AddLogicalNode(SclLN ln)
{
LogicalNode logicalNode = new LogicalNode(ln, this);
SclDocument.AddDataObjectsToLogicalNode(logicalNode, ln);
LogicalNodes.Add(logicalNode);
return logicalNode;
}
public LogicalDevice(SclDocument sclDocument, SclLDevice sclLDevice, string name, string inst, IEDModelNode parent) : base(name, parent)
{
SclDocument = sclDocument;
this.name = name;
this.inst = inst;
objRef = this.name;
this.sclLDevice = sclLDevice;
}
}
public class LogicalNode : IEDModelNode
{
private string prefix;
private string lnClass;
private string inst;
private Namespace nameSpace = null;
private SclLN sclElement = null;
private List<DataSet> dataSets = null;
private List<Log> logs = null;
private List<ReportControl> reportControls = null;
private List<GSEControl> gseControls = null;
private List<SMVControl> sMVControls = null;
private List<LogControl> logControls = null;
private List<DataObject> dataObjects = new List<DataObject>();
private Inputs inputs = null;
private SclSettingControl settingControl = null;
public SclLN SclElement { get => sclElement; set => sclElement = value; }
public void UpdateName()
{
string name = "";
if (prefix != null)
name += prefix;
name += lnClass;
if (inst != null)
name += inst;
this.name = name;
}
public string Prefix
{
get
{
return prefix;
}
set
{
prefix = value;
}
}
public string LnClass
{
get
{
return lnClass;
}
set
{
lnClass = value;
}
}
public string Inst
{
get
{
return inst;
}
set
{
inst = value;
}
}
public List<DataSet> DataSets
{
get
{
if (dataSets == null)
{
dataSets = new List<DataSet>();
if (sclElement != null)
{
foreach (SclDataSet sclDataSet in sclElement.DataSets)
{
dataSets.Add(new DataSet(sclDataSet, this));
}
}
}
return dataSets;
}
}
public List<Log> Logs
{
get
{
if (logs == null)
{
logs = new List<Log>();
if (sclElement != null)
{
foreach (SclLog sclLog in sclElement.Logs)
{
logs.Add(new Log(sclLog, this));
}
}
}
return logs;
}
}
public List<ReportControl> ReportControlBlocks
{
get
{
if (reportControls == null)
{
reportControls = new List<ReportControl>();
if (sclElement != null)
{
foreach (SclReportControl sclReportControl in sclElement.ReportControls)
{
reportControls.Add(new ReportControl(sclReportControl, this));
}
}
}
return reportControls;
}
}
public List<GSEControl> GSEControls
{
get
{
if (gseControls == null)
{
gseControls = new List<GSEControl>();
if (sclElement != null)
{
foreach (SclGSEControl sclGSEControl in sclElement.GSEControls)
{
gseControls.Add(new GSEControl(sclGSEControl, this));
}
}
}
return gseControls;
}
}
public List<SMVControl> SMVControls
{
get
{
if (sMVControls == null)
{
sMVControls = new List<SMVControl>();
if (sclElement != null)
{
foreach (SclSMVControl sclSMVControl in sclElement.SclSMVControls)
{
sMVControls.Add(new SMVControl(sclSMVControl, this));
}
}
}
return sMVControls;
}
}
public List<LogControl> LogControls
{
get
{
if (logControls == null)
{
logControls = new List<LogControl>();
if (sclElement != null)
{
foreach (SclLogControl sclLogControl in sclElement.LogControls)
{
logControls.Add(new LogControl(sclLogControl, this));
}
}
}
return logControls;
}
}
public Inputs Inputs
{
get
{
if (inputs == null)
{
if (sclElement != null)
{
if (sclElement.Inputs != null)
{
inputs = sclElement.Inputs;
inputs.Parent = this;
foreach (SclExtRef extRef in inputs.ExtRefs)
extRef.Parent = inputs;
}
}
}
return inputs;
}
set
{
inputs = value;
if (inputs != null)
inputs.Parent = this;
}
}
public SclSettingControl SettingControl
{
get
{
if (settingControl == null)
{
if (sclElement != null)
{
if (sclElement.SettingControl != null)
{
settingControl = sclElement.SettingControl;
settingControl.Parent = this;
}
}
}
return settingControl;
}
set
{
settingControl = value;
if (settingControl != null)
settingControl.Parent = this;
}
}
public List<DataObject> DataObjects
{
get
{
return dataObjects;
}
}
public Namespace NameSpace { get => nameSpace; set => nameSpace = value; }
public LogicalNode(string prefix, string lnClass, string inst, IEDModelNode parent) : base(null, parent)
{
this.prefix = prefix;
this.lnClass = lnClass;
this.inst = inst;
UpdateName();
objRef = parent.Name + "/" + name;
}
public LogicalNode(SclLN ln, IEDModelNode parent) : base(null, parent)
{
prefix = ln.Prefix;
lnClass = ln.LnClass;
inst = ln.Inst;
//this.name = ln.InstanceName;
//if (ln.InstanceName == null)
UpdateName();
objRef = parent.Name + "/" + name;
sclElement = ln;
}
}
public class DataObjectOrAttribute : IEDModelNode
{
public DataObjectOrAttribute(string name, IEDModelNode parent) : base(name, parent)
{
}
}
public class DataObject : DataObjectOrAttribute
{
private List<DataObjectOrAttribute> dataObjectsAndAttributes = new List<DataObjectOrAttribute>();
private int count = 0;
private SclDOType doType;
private bool trans = false;
public bool IsTransiente
{
get
{
return trans;
}
}
public SclDOType DOType
{
get
{
return doType;
}
}
public int Count
{
get
{
return count;
}
}
public List<DataObjectOrAttribute> DataObjectsAndAttributes
{
get
{
return dataObjectsAndAttributes;
}
}
public DataObject(SclDataObjectDefinition dod, SclDOType doType, IEDModelNode parent) : base(dod.Name, parent)
{
count = dod.Count;
this.doType = doType;
objRef = parent.ObjRef + "." + name;
trans = dod.IsTransient;
}
private bool HasChildWithFc(DataObject dobj, SclFC fc)
{
foreach (DataObjectOrAttribute doa in dobj.DataObjectsAndAttributes)
{
if (doa is DataAttribute)
{
DataAttribute da = doa as DataAttribute;
if (da.Fc == fc)
return true;
}
else if (doa is DataObject)
{
DataObject sdo = doa as DataObject;
if (HasChildWithFc(sdo, fc))
return true;
}
}
return false;
}
public bool HasChildWithFc(SclFC fc)
{
return HasChildWithFc(this, fc);
}
}
public class DataAttribute : DataObjectOrAttribute
{
public List<DataAttribute> subDataAttributes = new List<DataAttribute>();
private AttributeType attributeType;
private SclFC fc;
private int count = 0;
private SclDataAttributeDefinition definition = null;
public List<DataAttribute> SubDataAttributes
{
get
{
return subDataAttributes;
}
}
public SclDataAttributeDefinition Definition
{
get
{
return definition;
}
}
public AttributeType AttributeType
{
get
{
return attributeType;
}
}
public SclFC Fc
{
get
{
return fc;
}
}
public int Count
{
get
{
return count;
}
}
public DataAttribute(string name, IEDModelNode parent, SclFC fc, AttributeType bType, int count) : base(name, parent)
{
this.fc = fc;
attributeType = bType;
this.count = count;
if (attributeType == AttributeType.CONSTRUCTED)
subDataAttributes = new List<DataAttribute>();
objRef = parent.ObjRef + "." + name;
}
public DataAttribute(string name, IEDModelNode parent, SclFC fc, AttributeType bType, int count, SclDataAttributeDefinition def) : base(name, parent)
{
this.fc = fc;
attributeType = bType;
this.count = count;
definition = def;
if (attributeType == AttributeType.CONSTRUCTED)
subDataAttributes = new List<DataAttribute>();
if (objRef == null)
objRef = parent.ObjRef + "." + name;
}
}
public class DataSet : IEDModelNode
{
private SclDataSet sclDataSet;
public DataSet(string name, IEDModelNode parent) : base(name, parent)
{
objRef = parent.ObjRef + "." + name;
}
public DataSet(SclDataSet sclDataSet, IEDModelNode parent) : base(sclDataSet.Name, parent)
{
this.sclDataSet = sclDataSet;
objRef = parent.ObjRef + "." + name;
}
public SclDataSet SclDataSet { get => sclDataSet; set => sclDataSet = value; }
}
public class Log : IEDModelNode
{
private SclLog sclLog;
public Log(string name, IEDModelNode parent) : base(name, parent)
{
objRef = parent.ObjRef + "." + name;
}
public Log(SclLog sclLog, IEDModelNode parent) : base(sclLog.Name, parent)
{
this.sclLog = sclLog;
objRef = parent.ObjRef + "." + name;
}
public SclLog SclLog { get => sclLog; set => sclLog = value; }
}
public class ReportControl : IEDModelNode
{
private SclReportControl sclReportControl;
private bool buffered = false;
public SclReportControl SclReportControl { get => sclReportControl; set => sclReportControl = value; }
public bool Buffered { get => buffered; set => buffered = value; }
public ReportControl(string name, bool buffered, IEDModelNode parent) : base(name, parent)
{
objRef = parent.ObjRef + "." + name;
this.buffered = buffered;
}
public ReportControl(SclReportControl sclReportControl, IEDModelNode parent) : base(sclReportControl.Name, parent)
{
this.sclReportControl = sclReportControl;
buffered = sclReportControl.Buffered;
objRef = parent.ObjRef + "." + name;
}
}
public class GSEControl : IEDModelNode
{
private SclGSEControl sclGSEControl;
public GSEControl(string name, IEDModelNode parent) : base(name, parent)
{
objRef = parent.ObjRef + "." + name;
}
public GSEControl(SclGSEControl sclGSEControl, IEDModelNode parent) : base(sclGSEControl.Name, parent)
{
objRef = parent.ObjRef + "." + name;
this.sclGSEControl = sclGSEControl;
}
public SclGSEControl SclGSEControl { get => sclGSEControl; set => sclGSEControl = value; }
}
public class SMVControl : IEDModelNode
{
private SclSMVControl sclSMVControl;
public SMVControl(string name, IEDModelNode parent) : base(name, parent)
{
objRef = parent.ObjRef + "." + name;
}
public SMVControl(SclSMVControl sclSMVControl, IEDModelNode parent) : base(sclSMVControl.Name, parent)
{
objRef = parent.ObjRef + "." + name;
this.sclSMVControl = sclSMVControl;
}
public SclSMVControl SclSMVControl { get => sclSMVControl; set => sclSMVControl = value; }
}
public class LogControl : IEDModelNode
{
private SclLogControl sclLogControl;
public LogControl(string name, IEDModelNode parent) : base(name, parent)
{
objRef = parent.ObjRef + "." + name;
}
public LogControl(SclLogControl sclLogControl, IEDModelNode parent) : base(sclLogControl.Name, parent)
{
objRef = parent.ObjRef + "." + name;
this.sclLogControl = sclLogControl;
}
public SclLogControl SclLogControl { get => sclLogControl; set => sclLogControl = value; }
}
}
}
}

@ -0,0 +1,270 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System.Xml;
namespace IEC61850.SCL
{
public class SclExtRef
{
public XmlNode xmlNode;
private XmlDocument xmlDocument;
public Inputs Parent;
//public XmlNode XmlNode
//{
// get { return xmlNode; }
//}
public SclExtRef(SclDocument sclDocument, XmlNode xmlNode)
{
this.xmlNode = xmlNode;
xmlDocument = sclDocument.XmlDocument;
}
public string IedName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "iedName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "iedName", value);
}
}
public string LdInst
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "ldInst");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "ldInst", value);
}
}
public string Prefix
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "prefix");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "prefix", value);
}
}
public string LnClass
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "lnClass");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "lnClass", value);
}
}
public string LnInst
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "lnInst");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "lnInst", value);
}
}
public string DoName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "doName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "doName", value);
}
}
public string DaName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "daName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "daName", value);
}
}
public string IntAddr
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "intAddr");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "intAddr", value);
}
}
public string Desc
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "desc");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "desc", value);
}
}
public string ServiceType
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "serviceType");
}
set
{
if (value == null)
{
XmlAttribute xmlAttribute = xmlNode.Attributes["serviceType"];
if (xmlAttribute != null)
xmlNode.Attributes.Remove(xmlAttribute);
}
else
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "serviceType", value);
PServT = value;
}
}
public string SrcLDInst
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "srcLDInst");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "srcLDInst", value);
}
}
public string SrcPrefix
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "srcPrefix");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "srcPrefix", value);
}
}
public string SrcLNClass
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "srcLNClass");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "srcLNClass", value);
}
}
public string SrcLNInst
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "srcLNInst");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "srcLNInst", value);
}
}
public string SrcCBName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "srcCBName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "srcCBName", value);
}
}
public string PDO
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "pDO");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "pDO", value);
}
}
public string PLN
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "pLN");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "pLN", value);
}
}
public string PDA
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "pDA");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "pDA", value);
}
}
public string PServT
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "pServT");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "pServT", value);
}
}
}
}

@ -0,0 +1,68 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System.Xml;
namespace IEC61850.SCL
{
public class SclBaseElement
{
protected SclDocument sclDocument;
public XmlNode xmlNode;
public XmlNode XmlNode
{
get { return xmlNode; }
}
public SclBaseElement(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode)
{
this.xmlNode = xmlNode;
this.sclDocument = sclDocument;
}
/// <summary>
/// Gets the attribute value.
/// </summary>
/// <returns>The attribute value.</returns>
/// <param name="attributeName">Attribute name.</param>
public string GetAttributeValue(string attributeName)
{
return XmlHelper.GetAttributeValue(xmlNode, attributeName);
}
/// <summary>
/// Sets the attribute value.
/// </summary>
/// <param name="attributeName">Attribute name.</param>
/// <param name="value">Value.</param>
public void SetAttributeValue(string attributeName, string value)
{
XmlHelper.SetAttributeCreateIfNotExists(sclDocument.XmlDocument, xmlNode, attributeName, value);
}
/// <summary>
/// Gets or sets the text content of the element
/// </summary>
/// <value>the text content</value>
public string Text
{
get
{
return xmlNode.InnerText;
}
set
{
xmlNode.InnerText = value;
}
}
}
}

@ -0,0 +1,829 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System;
using System.Collections.Generic;
using System.Xml;
namespace IEC61850.SCL
{
public class SclCommunication
{
private XmlDocument xmlDoc;
private XmlNamespaceManager nsManager;
public XmlNode xmlNode;
private SclDocument sclDocument;
private List<SclSubNetwork> subNetworks = new List<SclSubNetwork>();
public bool DeleteSubnetwork(SclSubNetwork sclSubNetwork)
{
if (subNetworks.Exists(x => x == sclSubNetwork))
{
subNetworks.Remove(sclSubNetwork);
xmlNode.RemoveChild(sclSubNetwork.xmlNode);
return true;
}
else
return false;
}
public SclSubNetwork AddSubNetwork(SclSubNetwork sclSubNetwork)
{
XmlNode newNode = sclSubNetwork.xmlNode;
if (newNode.OwnerDocument != xmlDoc)
{
newNode = xmlDoc.ImportNode(sclSubNetwork.xmlNode.CloneNode(true), true);
}
if (GetSubNetworks().Count > 0)
xmlNode.InsertAfter(newNode, GetSubNetworks()[GetSubNetworks().Count - 1].xmlNode);
else
{
xmlNode.AppendChild(newNode);
}
try
{
SclSubNetwork newSubNetwork = new SclSubNetwork(newNode, sclDocument, nsManager);
subNetworks.Add(newSubNetwork);
return newSubNetwork;
}
catch (SclParserException ex)
{
Console.WriteLine(ex.ToString());
return null;
}
}
private void ParseSubNetworks()
{
if (subNetworks == null)
subNetworks = new List<SclSubNetwork>();
XmlNodeList subNetworkNodes = xmlNode.SelectNodes("scl:SubNetwork", nsManager);
foreach (XmlNode snNode in subNetworkNodes)
{
subNetworks.Add(new SclSubNetwork(snNode, sclDocument, nsManager));
}
}
internal SclCommunication(XmlNode comNode, SclDocument SclxmlDoc, XmlNamespaceManager nsManager)
{
xmlDoc = SclxmlDoc.XmlDocument;
xmlNode = comNode;
this.nsManager = nsManager;
sclDocument = SclxmlDoc;
ParseSubNetworks();
}
public List<SclSubNetwork> GetSubNetworks()
{
if (subNetworks == null)
ParseSubNetworks();
return subNetworks;
}
public SclConnectedAP GetConnectedAP(string apName, string iedName)
{
foreach (SclSubNetwork subNetwork in GetSubNetworks())
{
foreach (SclConnectedAP connectedAp in subNetwork.GetConnectedAPs())
{
if (connectedAp.ApName.Equals(apName) && connectedAp.IedName.Equals(iedName))
return connectedAp;
}
}
return null;
}
public SclSubNetwork GetSubNetwork(string apName, string iedName)
{
foreach (SclSubNetwork subNetwork in GetSubNetworks())
{
foreach (SclConnectedAP connectedAp in subNetwork.GetConnectedAPs())
{
if (connectedAp.ApName.Equals(apName) && connectedAp.IedName.Equals(iedName))
return subNetwork;
}
}
return null;
}
}
public class SclSubNetwork
{
private XmlDocument xmlDoc;
internal XmlNode xmlNode;
private XmlNamespaceManager nsManager;
private SclDocument sclDocument;
public XmlNode XmlNodeClone()
{
XmlNode newNode = xmlNode.CloneNode(true);
return newNode;
}
private XmlNamespaceManager NsManager
{
get { return nsManager; }
}
private List<SclConnectedAP> connectedAPs = null;
private void ParseConnectedAPs()
{
if (connectedAPs == null)
connectedAPs = new List<SclConnectedAP>();
if (connectedAPs.Count > 0)
connectedAPs.Clear();
XmlNodeList connectedAPNodes = xmlNode.SelectNodes("scl:ConnectedAP", nsManager);
foreach (XmlNode node in connectedAPNodes)
{
connectedAPs.Add(new SclConnectedAP(node, sclDocument, nsManager));
}
}
public SclSubNetwork(XmlNode snNode, SclDocument SclxmlDoc, XmlNamespaceManager nsManager)
{
xmlNode = snNode;
xmlDoc = SclxmlDoc.XmlDocument;
sclDocument = SclxmlDoc;
this.nsManager = nsManager;
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, xmlNode, "Name", Name);
if (Name == null)
SclxmlDoc.AddIssue(snNode, "ERROR", "Model integrity", "SubNetwork has no name attribute", this, "MissingName");
ParseConnectedAPs();
}
public List<SclConnectedAP> GetConnectedAPs()
{
if (connectedAPs == null)
ParseConnectedAPs();
return connectedAPs;
}
public string Name
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "name");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, xmlNode, "name", value);
}
}
public string Type
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "type");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, xmlNode, "type", value);
}
}
}
public class SclConnectedAP
{
private SclDocument sclDocument;
private XmlDocument xmlDoc;
internal XmlNode xmlNode;
private SclAddress address = null;
private XmlNamespaceManager nsManager;
private List<SclGSE> gses = new List<SclGSE>();
private List<SclSMV> smvs = new List<SclSMV>();
public XmlNode XmlNodeClone()
{
XmlNode newNode = xmlNode.CloneNode(true);
return newNode;
}
private XmlNamespaceManager NsManager
{
get { return nsManager; }
}
public SclConnectedAP(XmlNode apNode, SclDocument SclxmlDoc, XmlNamespaceManager nsManager)
{
sclDocument = SclxmlDoc;
xmlNode = apNode;
xmlDoc = SclxmlDoc.XmlDocument;
this.nsManager = nsManager;
if (IedName == null)
SclxmlDoc.AddIssue(xmlNode, "ERROR", "Model integrity", "ConnectedAP is missing required attribute iedName", this, "connectedAP");
//throw new SclParserException(apNode, "ConnectedAP is missing required attribute.");
if (ApName == null)
SclxmlDoc.AddIssue(xmlNode, "ERROR", "Model integrity", "ConnectedAP is missing required attribute apName", this, "connectedAP");
XmlNode AddressNode = xmlNode.SelectSingleNode("scl:Address", nsManager);
if (AddressNode != null)
{
address = new SclAddress(AddressNode, SclxmlDoc, nsManager);
}
XmlNodeList GSENodes = xmlNode.SelectNodes("scl:GSE", nsManager);
foreach (XmlNode node in GSENodes)
{
gses.Add(new SclGSE(node, SclxmlDoc, nsManager));
}
XmlNodeList SMVNodes = xmlNode.SelectNodes("scl:SMV", nsManager);
foreach (XmlNode node in SMVNodes)
{
smvs.Add(new SclSMV(node, SclxmlDoc, nsManager));
}
}
public List<SclGSE> GSEs
{
get { return gses; }
set { gses = value; }
}
public List<SclSMV> SMVs
{
get { return smvs; }
set { smvs = value; }
}
public SclAddress Address
{
get { return address; }
set { address = value; }
}
public SclAddress GetAddress()
{
if (address != null)
return address;
XmlNode addrNode = xmlNode.SelectSingleNode("scl:Address", nsManager);
if (addrNode != null)
{
address = new SclAddress(addrNode, sclDocument, nsManager);
return address;
}
else
return null;
}
public string IedName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "iedName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, xmlNode, "iedName", value);
}
}
public string ApName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "apName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, xmlNode, "apName", value);
}
}
public string Desc
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "desc");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, xmlNode, "desc", value);
}
}
public string RedProt
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "redProt");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, xmlNode, "redProt", value);
}
}
}
public class SclGSE
{
public XmlNode gseNode;
private XmlDocument xmlDoc;
private XmlNamespaceManager nsManager;
private SclAddress sclAddress = null;
private XmlNode minTime = null;
private XmlNode maxTime = null;
public XmlNode Node { get { return gseNode; } set { gseNode = value; } }
public SclAddress SclAddress { get { return sclAddress; } set { sclAddress = value; } }
public SclGSE(XmlNode GSENode, SclDocument SclxmlDoc, XmlNamespaceManager nsManager)
{
gseNode = GSENode;
xmlDoc = SclxmlDoc.XmlDocument;
this.nsManager = nsManager;
XmlAttribute nameAttr = gseNode.Attributes["cbName"];
if (nameAttr == null)
SclxmlDoc.AddIssue(GSENode, "ERROR", "Model integrity", "GSE has no cbName attribute", this, "MissingName");
XmlNode AddressNode = gseNode.SelectSingleNode("scl:Address", nsManager);
if (AddressNode != null)
{
sclAddress = new SclAddress(AddressNode, SclxmlDoc, nsManager);
}
XmlNode min = gseNode.SelectSingleNode("scl:MinTime", nsManager);
if (min != null)
{
minTime = min;
}
XmlNode max = gseNode.SelectSingleNode("scl:MaxTime", nsManager);
if (max != null)
{
maxTime = max;
}
}
public string Mintime
{
get
{
if (minTime != null)
{
return minTime.InnerText;
}
else
return null;
}
}
public string Maxtime
{
get
{
if (maxTime != null)
{
return maxTime.InnerText;
}
else
return null;
}
}
public string CbName
{
get
{
return XmlHelper.GetAttributeValue(gseNode, "cbName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, gseNode, "cbName", value);
}
}
public string LdInst
{
get
{
return XmlHelper.GetAttributeValue(gseNode, "ldInst");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, gseNode, "ldInst", value);
}
}
public string Desc
{
get
{
return XmlHelper.GetAttributeValue(gseNode, "desc");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, gseNode, "desc", value);
}
}
}
public class SclSMV
{
public XmlNode smvNode;
private XmlDocument xmlDoc;
private XmlNamespaceManager nsManager;
private SclAddress sclAddress = null;
public SclAddress SclAddress { get { return sclAddress; } set { sclAddress = value; } }
public SclSMV(XmlNode SMVNode, SclDocument SclxmlDoc, XmlNamespaceManager nsManager)
{
smvNode = SMVNode;
xmlDoc = SclxmlDoc.XmlDocument;
this.nsManager = nsManager;
XmlAttribute nameAttr = smvNode.Attributes["cbName"];
if (nameAttr == null)
SclxmlDoc.AddIssue(SMVNode, "ERROR", "Model integrity", "SMV has no cbName attribute", this, "MissingName");
XmlNode AddressNode = smvNode.SelectSingleNode("scl:Address", nsManager);
if (AddressNode != null)
{
sclAddress = new SclAddress(AddressNode, SclxmlDoc, nsManager);
}
}
public string CbName
{
get
{
return XmlHelper.GetAttributeValue(smvNode, "cbName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, smvNode, "cbName", value);
}
}
public string LdInst
{
get
{
return XmlHelper.GetAttributeValue(smvNode, "ldInst");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, smvNode, "ldInst", value);
}
}
public string Desc
{
get
{
return XmlHelper.GetAttributeValue(smvNode, "desc");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, smvNode, "desc", value);
}
}
}
public class SclAddress
{
public XmlNode addrNode;
private XmlDocument xmlDoc;
private XmlNamespaceManager nsManager;
public XmlNode Node { get { return addrNode; } set { addrNode = value; } }
private string vlanId = "0";
private string vlanPriority = "0";
private string appId = "0";
private int[] macAddress = null;
public string VlanId
{
get
{
return vlanId;
}
set
{
vlanId = value;
}
}
public string VlanPriority
{
get
{
return vlanPriority;
}
set
{
vlanPriority = value;
}
}
public string AppId
{
get
{
return appId;
}
set
{
appId = value;
}
}
public int[] MacAddress
{
get
{
return macAddress;
}
set
{
macAddress = value;
}
}
private List<SclP> sclPs = new List<SclP>();
public List<SclP> SclPs { get { return sclPs; } set { sclPs = value; } }
public void CheckIfPValueisCorrect(SclDocument sclDocument, SclP sclP)
{
if (sclP.Text != null)
{
if (sclP.Type == "APPID")
{
if (System.Text.RegularExpressions.Regex.IsMatch(sclP.Text, @"\A\b[0-9a-fA-F]+\b\Z"))
{
if (sclP.Text.Length != 4)
{
sclDocument.AddIssue(sclP.Node, "ERROR", "Model integrity", "P address of type " + sclP.Type + " size it is not 4. Actual size: " + sclP.Text.Length.ToString(), sclP, "value");
}
}
else
{
sclDocument.AddIssue(sclP.Node, "ERROR", "Model integrity", "P address of type " + sclP.Type + " does not have a Hex value. Value is: " + sclP.Text, sclP, "value");
}
}
else if (sclP.Type == "VLAN-ID")
{
if (System.Text.RegularExpressions.Regex.IsMatch(sclP.Text, @"\A\b[0-9a-fA-F]+\b\Z"))
{
if (sclP.Text.Length != 3)
{
sclDocument.AddIssue(sclP.Node, "ERROR", "Model integrity", "P address of type " + sclP.Type + " size it is not 3. Actual size: " + sclP.Text.Length.ToString(), sclP, "value");
}
}
else
{
sclDocument.AddIssue(sclP.Node, "ERROR", "Model integrity", "P address of type " + sclP.Type + " does not have a Hex value. Value is: " + sclP.Text, sclP, "value");
}
}
else if (sclP.Type == "VLAN-PRIORITY")
{
if (System.Text.RegularExpressions.Regex.IsMatch(sclP.Text, @"\A\b[0-7]+\b\Z"))
{
}
else
{
sclDocument.AddIssue(sclP.Node, "ERROR", "Model integrity", "P address of type " + sclP.Type + " does not have a 0-7 value. Value is: " + sclP.Text, sclP, "value");
}
}
else if (sclP.Type == "MAC-Address")
{
string[] addressElements = sclP.Text.Split('-');
if (addressElements.Length == 6)
{
for (int i = 0; i < addressElements.Length; i++)
{
if (System.Text.RegularExpressions.Regex.IsMatch(addressElements[i], @"\A\b[0-9a-fA-F]+\b\Z"))
{
if (addressElements[i].Length != 2)
sclDocument.AddIssue(sclP.Node, "ERROR", "Model integrity", "P address of type " + sclP.Type + " size it is not 2 on position " + i + ". Actual size: " + addressElements[i].Length.ToString(), sclP, "value");
}
else
{
sclDocument.AddIssue(sclP.Node, "ERROR", "Model integrity", "P address of type " + sclP.Type + " does not have a Hex value on position " + i + ". Value is: " + addressElements[i], sclP, "value");
}
}
}
else
sclDocument.AddIssue(sclP.Node, "ERROR", "Model integrity", "P address of type " + sclP.Type + " does not have a array size 6 value. Actual size: " + addressElements.Length.ToString(), sclP, "value");
}
}
}
public SclAddress(XmlNode addrNode, SclDocument sclDocument, XmlNamespaceManager nsManager)
{
this.addrNode = addrNode;
xmlDoc = sclDocument.XmlDocument;
this.nsManager = nsManager;
XmlNodeList pNodes = addrNode.SelectNodes("scl:P", nsManager);
foreach (XmlNode pNode in pNodes)
{
SclP sclP = new SclP(pNode, xmlDoc);
sclPs.Add(sclP);
CheckIfPValueisCorrect(sclDocument, sclP);
if (sclP.Text != null)
{
if (sclP.Type == "VLAN-ID")
VlanId = sclP.Text;
else if (sclP.Type == "VLAN-PRIORITY")
VlanPriority = sclP.Text;
else if (sclP.Type == "APPID")
AppId = sclP.Text;
else if (sclP.Type == "MAC-Address")
{
string[] addressElements = sclP.Text.Split('-');
if (addressElements.Length == 6)
{
macAddress = new int[6];
for (int i = 0; i < addressElements.Length; i++)
{
macAddress[i] = int.Parse(addressElements[i], System.Globalization.NumberStyles.AllowHexSpecifier);
}
}
}
}
else if (sclP.Type == "MAC-Address")
{
string[] addressElements = sclP.Text.Split('-');
if (addressElements.Length == 6)
{
macAddress = new int[6];
for (int i = 0; i < addressElements.Length; i++)
{
macAddress[i] = int.Parse(addressElements[i], System.Globalization.NumberStyles.AllowHexSpecifier);
}
}
}
}
}
public List<SclP> GetAddressParameters()
{
if (sclPs == null)
{
sclPs = new List<SclP>();
XmlNodeList pNodes = addrNode.SelectNodes("scl:P", nsManager);
foreach (XmlNode pNode in pNodes)
{
sclPs.Add(new SclP(pNode, xmlDoc));
}
}
return sclPs;
}
public SclP GetAddressParameter(string type)
{
foreach (SclP p in GetAddressParameters())
{
if (p.Type != null)
{
if (p.Type.Equals(type))
return p;
}
}
return null;
}
}
public class SclP
{
private XmlNode pNode;
private XmlDocument xmlDoc;
internal XmlNode Node { get { return pNode; } set { pNode = value; } }
public SclP(XmlNode pNode, XmlDocument xmlDoc)
{
this.pNode = pNode;
this.xmlDoc = xmlDoc;
}
public XmlNode XmlNode
{
get { return pNode; }
}
public string Type
{
get
{
return XmlHelper.GetAttributeValue(pNode, "type");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, pNode, "type", value);
}
}
public string XsiType
{
get
{
return XmlHelper.GetAttributeValue(pNode, "xsi:type");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDoc, pNode, "xsi:type", value);
}
}
public string Text
{
get
{
return pNode.InnerText;
}
set
{
pNode.InnerText = value;
}
}
}
}

@ -0,0 +1,258 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System.Collections.Generic;
using System.Xml;
namespace IEC61850.SCL
{
public class SclDataTypeTemplates : SclElementWithPrivate
{
private List<SclLNodeType> lnTypes = new List<SclLNodeType>();
private List<SclDOType> doTypes = new List<SclDOType>();
private List<SclDAType> daTypes = new List<SclDAType>();
private List<SclEnumType> enumTypes = new List<SclEnumType>();
internal SclDataTypeTemplates(SclDocument sclDocument, XmlNode xmlNode)
: base(sclDocument, xmlNode)
{
foreach (XmlNode lNodeType in xmlNode.SelectNodes("scl:LNodeType", sclDocument.NsManager))
{
SclLNodeType newType = new SclLNodeType(sclDocument, lNodeType);
if (newType != null)
lnTypes.Add(newType);
}
foreach (XmlNode doType in xmlNode.SelectNodes("scl:DOType", sclDocument.NsManager))
{
SclDOType newType = new SclDOType(sclDocument, doType);
if (newType != null)
doTypes.Add(newType);
}
foreach (XmlNode daType in xmlNode.SelectNodes("scl:DAType", sclDocument.NsManager))
{
SclDAType newType = new SclDAType(sclDocument, daType);
if (newType != null)
daTypes.Add(newType);
}
foreach (XmlNode enumType in xmlNode.SelectNodes("scl:EnumType", sclDocument.NsManager))
{
SclEnumType newType = new SclEnumType(sclDocument, enumType);
if (newType != null)
enumTypes.Add(newType);
}
}
/// <summary>
/// Add a new type to the DataTypeTemplates section. The type will be placed at the correct position
/// according to the class.
/// </summary>
/// <param name="sclType">the new type to add</param>
public SclType AddType(SclType sclType)
{
if (sclType.xmlNode.OwnerDocument != sclDocument.XmlDocument)
{
XmlNode importedNode = sclDocument.XmlDocument.ImportNode(sclType.xmlNode, true);
sclType.xmlNode = importedNode;
}
if (sclType is SclLNodeType)
{
if (doTypes.Count > 0)
xmlNode.InsertBefore(sclType.xmlNode, doTypes[0].xmlNode);
else if (daTypes.Count > 0)
xmlNode.InsertBefore(sclType.xmlNode, daTypes[0].xmlNode);
else if (enumTypes.Count > 0)
xmlNode.InsertBefore(sclType.xmlNode, enumTypes[0].xmlNode);
else
xmlNode.InsertBefore(sclType.xmlNode, null);
lnTypes.Add(sclType as SclLNodeType);
}
else if (sclType is SclDOType)
{
if (daTypes.Count > 0)
xmlNode.InsertBefore(sclType.xmlNode, daTypes[0].xmlNode);
else if (enumTypes.Count > 0)
xmlNode.InsertBefore(sclType.xmlNode, enumTypes[0].xmlNode);
else
xmlNode.InsertBefore(sclType.xmlNode, null);
doTypes.Add(sclType as SclDOType);
}
else if (sclType is SclDAType)
{
if (enumTypes.Count > 0)
xmlNode.InsertBefore(sclType.xmlNode, enumTypes[0].xmlNode);
else
xmlNode.InsertBefore(sclType.xmlNode, null);
daTypes.Add(sclType as SclDAType);
}
else if (sclType is SclEnumType)
{
xmlNode.InsertBefore(sclType.xmlNode, null);
enumTypes.Add(sclType as SclEnumType);
}
return sclType;
}
/// <summary>
/// Remove a type from the DataTypeTemplates section.
/// </summary>
/// <param name="type">the type to remove</param>
public void RemoveType(SclType type)
{
if (type is SclLNodeType)
lnTypes.Remove(type as SclLNodeType);
else if (type is SclDOType)
doTypes.Remove(type as SclDOType);
else if (type is SclDAType)
daTypes.Remove(type as SclDAType);
else if (type is SclEnumType)
enumTypes.Remove(type as SclEnumType);
if (type.xmlNode.ParentNode != null)
type.xmlNode.ParentNode.RemoveChild(type.xmlNode);
}
public void RemoveIfUnused(SclType sclType)
{
if (sclType.IsUsed == false)
{
RemoveType(sclType);
}
}
/// <summary>
/// Remove all unused types from the DataTypeTemplates section
/// </summary>
public void RemoveUnusedTypes()
{
List<SclType> types = new List<SclType>();
types.AddRange(LNTypes);
types.AddRange(DOTypes);
types.AddRange(DATypes);
types.AddRange(EnumTypes);
foreach (SclType sclType in types)
RemoveIfUnused(sclType);
}
public SclLNodeType GetLNodeType(string id)
{
foreach (SclLNodeType type in lnTypes)
{
if (type.Id.Equals(id))
return type;
}
return null;
}
public SclDOType GetDOType(string id)
{
foreach (SclDOType type in doTypes)
{
if (type.Id.Equals(id))
return type;
}
return null;
}
public SclDAType GetDAType(string id)
{
foreach (SclDAType type in daTypes)
{
if (type.Id.Equals(id))
return type;
}
return null;
}
public SclEnumType GetEnumType(string id)
{
foreach (SclEnumType type in enumTypes)
{
if (type.Id.Equals(id))
return type;
}
return null;
}
public List<SclLNodeType> LNTypes
{
get
{
return new List<SclLNodeType>(lnTypes);
}
}
public List<SclDOType> DOTypes
{
get
{
return new List<SclDOType>(doTypes);
}
}
public List<SclDAType> DATypes
{
get
{
return new List<SclDAType>(daTypes);
}
}
public List<SclEnumType> EnumTypes
{
get
{
return new List<SclEnumType>(enumTypes);
}
}
public List<SclType> AllTypes
{
get
{
List<SclType> types = new List<SclType>();
foreach (SclType type in lnTypes)
types.Add(type);
foreach (SclType type in doTypes)
types.Add(type);
foreach (SclType type in daTypes)
types.Add(type);
foreach (SclType type in enumTypes)
types.Add(type);
return types;
}
}
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,43 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System.Collections.Generic;
using System.Xml;
namespace IEC61850.SCL
{
public class SclElementWithPrivate : SclBaseElement
{
private List<SclPrivate> privateElements = new List<SclPrivate>();
internal SclElementWithPrivate(SclDocument sclDocument, XmlNode xmlNode)
: base(sclDocument.XmlDocument, sclDocument, xmlNode)
{
XmlNodeList privateNodes = xmlNode.SelectNodes("Private");
foreach (XmlNode privateNode in privateNodes)
{
SclPrivate priv = new SclPrivate(sclDocument.XmlDocument, sclDocument, privateNode);
if (priv != null)
{
privateElements.Add(priv);
}
}
}
public List<SclPrivate> PrivateElements
{
get
{
return new List<SclPrivate>(privateElements);
}
}
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,883 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System;
using System.Collections.Generic;
using System.Xml;
namespace IEC61850.SCL
{
public class SclEquipment : SclPowerSystemResource
{
public bool Virtual
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "virtual", false);
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "virtual", value);
}
}
internal SclEquipment(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlNode, nsManager)
{
}
}
public class SclSubEquipment : SclPowerSystemResource
{
public bool Virtual
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "virtual", false);
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "virtual", value);
}
}
public string Phase
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "phase");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "phase", value);
}
}
private List<SclEqFunction> sclEqFunctions;
private void parseEqFunctions()
{
XmlNodeList nodes = xmlNode.SelectNodes("scl:EqFunction", nsManager);
sclEqFunctions = new List<SclEqFunction>();
foreach (XmlNode node in nodes)
{
SclEqFunction lNode = new SclEqFunction(xmlDocument, sclDocument, node, nsManager);
sclEqFunctions.Add(lNode);
}
}
public List<SclEqFunction> EqFunctions
{
get { return sclEqFunctions; }
}
public bool RemoveEqFunction(SclEqFunction node)
{
try
{
XmlNode parent = node.xmlNode.ParentNode;
if (parent != null)
{
parent.RemoveChild(node.xmlNode);
}
EqFunctions.Remove(node);
return true;
}
catch (Exception)
{
return false;
}
}
public SclEqFunction AddNewEqFunction()
{
SclEqFunction newControl = new SclEqFunction(xmlDocument, sclDocument, nsManager);
XmlNode newNode = newControl.xmlNode;
if (newNode.OwnerDocument != xmlDocument)
{
newNode = xmlDocument.ImportNode(newControl.xmlNode.CloneNode(true), true);
}
if (EqFunctions.Count > 0)
{
int lastIndex = EqFunctions.Count - 1;
SclEqFunction lastLNode = EqFunctions[lastIndex];
XmlNode parent = lastLNode.xmlNode.ParentNode;
parent.InsertAfter(newNode, lastLNode.xmlNode);
}
else
{
XmlNode parent = XmlNode;
parent.AppendChild(newNode);
}
try
{
newControl = new SclEqFunction(xmlDocument, sclDocument, newNode, nsManager);
EqFunctions.Add(newControl);
return newControl;
}
catch (SclParserException e)
{
Console.WriteLine(e.ToString());
return null;
}
}
internal SclSubEquipment(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlNode, nsManager)
{
parseEqFunctions();
}
public SclSubEquipment(XmlDocument xmlDocument, SclDocument sclDocument, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlDocument.CreateElement("SubEquipment", SclDocument.SCL_XMLNS), nsManager)
{
}
}
public class SclAbstractConductingEquipment : SclEquipment
{
private List<SclTerminal> sclTerminals;
private List<SclSubEquipment> sclSubEquipments;
private void parseTerminal()
{
XmlNodeList nodes = xmlNode.SelectNodes("scl:Terminal", nsManager);
sclTerminals = new List<SclTerminal>();
foreach (XmlNode node in nodes)
{
SclTerminal lNode = new SclTerminal(xmlDocument, sclDocument, node, nsManager);
sclTerminals.Add(lNode);
}
}
private void parseSubEquipment()
{
XmlNodeList nodes = xmlNode.SelectNodes("scl:SubEquipment", nsManager);
sclSubEquipments = new List<SclSubEquipment>();
foreach (XmlNode node in nodes)
{
SclSubEquipment lNode = new SclSubEquipment(xmlDocument, sclDocument, node, nsManager);
sclSubEquipments.Add(lNode);
}
}
public List<SclTerminal> Terminals
{
get
{
return sclTerminals;
}
}
public bool RemoveTerminal(SclTerminal node)
{
try
{
XmlNode parent = node.xmlNode.ParentNode;
if (parent != null)
{
parent.RemoveChild(node.xmlNode);
}
Terminals.Remove(node);
return true;
}
catch (Exception)
{
return false;
}
}
public SclTerminal AddNewTerminal()
{
SclTerminal newControl = new SclTerminal(xmlDocument, sclDocument, nsManager);
XmlNode newNode = newControl.xmlNode;
if (newNode.OwnerDocument != xmlDocument)
{
newNode = xmlDocument.ImportNode(newControl.xmlNode.CloneNode(true), true);
}
if (Terminals.Count > 0)
{
int lastIndex = Terminals.Count - 1;
SclTerminal lastLNode = Terminals[lastIndex];
XmlNode parent = lastLNode.xmlNode.ParentNode;
parent.InsertAfter(newNode, lastLNode.xmlNode);
}
else
{
XmlNode parent = XmlNode;
parent.AppendChild(newNode);
}
try
{
newControl = new SclTerminal(xmlDocument, sclDocument, newNode, nsManager);
Terminals.Add(newControl);
return newControl;
}
catch (SclParserException e)
{
Console.WriteLine(e.ToString());
return null;
}
}
public List<SclSubEquipment> SubEquipments
{
get
{
return sclSubEquipments;
}
}
public bool RemoveSubEquipment(SclSubEquipment node)
{
try
{
XmlNode parent = node.xmlNode.ParentNode;
if (parent != null)
{
parent.RemoveChild(node.xmlNode);
}
SubEquipments.Remove(node);
return true;
}
catch (Exception)
{
return false;
}
}
public SclSubEquipment AddNewSubEquipment()
{
SclSubEquipment newControl = new SclSubEquipment(xmlDocument, sclDocument, nsManager);
XmlNode newNode = newControl.xmlNode;
if (newNode.OwnerDocument != xmlDocument)
{
newNode = xmlDocument.ImportNode(newControl.xmlNode.CloneNode(true), true);
}
if (SubEquipments.Count > 0)
{
int lastIndex = SubEquipments.Count - 1;
SclSubEquipment lastLNode = SubEquipments[lastIndex];
XmlNode parent = lastLNode.xmlNode.ParentNode;
parent.InsertAfter(newNode, lastLNode.xmlNode);
}
else
{
XmlNode parent = XmlNode;
parent.AppendChild(newNode);
}
try
{
newControl = new SclSubEquipment(xmlDocument, sclDocument, newNode, nsManager);
SubEquipments.Add(newControl);
return newControl;
}
catch (SclParserException e)
{
Console.WriteLine(e.ToString());
return null;
}
}
internal SclAbstractConductingEquipment(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlNode, nsManager)
{
parseTerminal();
if (sclTerminals.Count > 2)
{
sclDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "AbstractConductingEquipment contains " + sclTerminals.Count + " Terminals. Maximum is 2", this, "Terminal");
}
parseSubEquipment();
}
}
public class SclTerminal : SclBaseElement
{
private XmlDocument xmlDocument;
public string BayName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "bayName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "bayName", value);
}
}
public string CNodeName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "cNodeName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "cNodeName", value);
}
}
public string ConnectivityNode
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "connectivityNode");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "connectivityNode", value);
}
}
public string Name
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "name");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "name", value);
}
}
public string NeutralPoint
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "neutralPoint");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "neutralPoint", value);
}
}
public string PorcessName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "porcessName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "porcessName", value);
}
}
public string SubstationName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "substationName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "substationName", value);
}
}
public string VoltageLevelName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "voltageLevelName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "voltageLevelName", value);
}
}
internal SclTerminal(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlNode)
{
this.xmlDocument = xmlDocument;
}
public SclTerminal(XmlDocument xmlDocument, SclDocument sclDocument, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlDocument.CreateElement("Terminal", SclDocument.SCL_XMLNS))
{
}
}
public class SclTransformerWinding : SclAbstractConductingEquipment
{
public string Type
{
get
{
return "PTW";
}
}
private List<SclTapChanger> sclTapChangers;
public bool RemoveTapChanger(SclTapChanger node)
{
try
{
XmlNode parent = node.xmlNode.ParentNode;
if (parent != null)
{
parent.RemoveChild(node.xmlNode);
}
sclTapChangers.Remove(node);
return true;
}
catch (Exception)
{
return false;
}
}
public SclTapChanger AddNewTapChanger()
{
SclTapChanger newControl = new SclTapChanger(xmlDocument, sclDocument, nsManager);
XmlNode newNode = newControl.xmlNode;
if (newNode.OwnerDocument != xmlDocument)
{
newNode = xmlDocument.ImportNode(newControl.xmlNode.CloneNode(true), true);
}
if (sclTapChangers.Count > 0)
{
int lastIndex = sclTapChangers.Count - 1;
SclTapChanger lastLNode = sclTapChangers[lastIndex];
XmlNode parent = lastLNode.xmlNode.ParentNode;
parent.InsertAfter(newNode, lastLNode.xmlNode);
}
else
{
XmlNode parent = XmlNode;
parent.AppendChild(newNode);
}
try
{
newControl = new SclTapChanger(xmlDocument, sclDocument, newNode, nsManager);
sclTapChangers.Add(newControl);
return newControl;
}
catch (SclParserException e)
{
Console.WriteLine(e.ToString());
return null;
}
}
private void parseTapChanger()
{
XmlNodeList nodes = xmlNode.SelectNodes("scl:TapChanger", nsManager);
sclTapChangers = new List<SclTapChanger>();
foreach (XmlNode node in nodes)
{
SclTapChanger tap = new SclTapChanger(xmlDocument, sclDocument, node, nsManager);
sclTapChangers.Add(tap);
}
}
public List<SclTapChanger> TapChangers
{
get { return sclTapChangers; }
}
private List<SclEqFunction> sclEqFunctions;
public bool RemoveEqFunction(SclEqFunction node)
{
try
{
XmlNode parent = node.xmlNode.ParentNode;
if (parent != null)
{
parent.RemoveChild(node.xmlNode);
}
EqFunctions.Remove(node);
return true;
}
catch (Exception)
{
return false;
}
}
public SclEqFunction AddNewEqFunction()
{
SclEqFunction newControl = new SclEqFunction(xmlDocument, sclDocument, nsManager);
XmlNode newNode = newControl.xmlNode;
if (newNode.OwnerDocument != xmlDocument)
{
newNode = xmlDocument.ImportNode(newControl.xmlNode.CloneNode(true), true);
}
if (sclEqFunctions.Count > 0)
{
int lastIndex = sclEqFunctions.Count - 1;
SclEqFunction lastLNode = sclEqFunctions[lastIndex];
XmlNode parent = lastLNode.xmlNode.ParentNode;
parent.InsertAfter(newNode, lastLNode.xmlNode);
}
else
{
XmlNode parent = XmlNode;
parent.AppendChild(newNode);
}
try
{
newControl = new SclEqFunction(xmlDocument, sclDocument, newNode, nsManager);
sclEqFunctions.Add(newControl);
return newControl;
}
catch (SclParserException e)
{
Console.WriteLine(e.ToString());
return null;
}
}
private void parseEqFunctions()
{
XmlNodeList nodes = xmlNode.SelectNodes("scl:EqFunction", nsManager);
sclEqFunctions = new List<SclEqFunction>();
foreach (XmlNode node in nodes)
{
SclEqFunction lNode = new SclEqFunction(xmlDocument, sclDocument, node, nsManager);
sclEqFunctions.Add(lNode);
}
}
public List<SclEqFunction> EqFunctions
{
get { return sclEqFunctions; }
}
internal SclTransformerWinding(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlNode, nsManager)
{
if (Terminals.Count > 1)
{
sclDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "TransformerWinding contains " + Terminals.Count + " Terminals. Maximum is 1", this, "Terminal");
}
parseTapChanger();
if (sclTapChangers.Count > 1)
{
sclDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "TransformerWinding contains " + sclTapChangers.Count + " TapChangers. Maximum is 1", this, "Terminal");
}
parseEqFunctions();
}
public SclTransformerWinding(XmlDocument xmlDocument, SclDocument sclDocument, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlDocument.CreateElement("TransformerWinding", SclDocument.SCL_XMLNS), nsManager)
{
}
}
public class SclTapChanger : SclPowerSystemResource
{
public bool Virtual
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "virtual", false);
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "virtual", value);
}
}
public string Type
{
get
{
return "LTC";
}
}
private List<SclSubEquipment> sclSubEquipments;
public bool RemoveSubEquipment(SclSubEquipment node)
{
try
{
XmlNode parent = node.xmlNode.ParentNode;
if (parent != null)
{
parent.RemoveChild(node.xmlNode);
}
SubEquipments.Remove(node);
return true;
}
catch (Exception)
{
return false;
}
}
public SclSubEquipment AddNewSubEquipment()
{
SclSubEquipment newControl = new SclSubEquipment(xmlDocument, sclDocument, nsManager);
XmlNode newNode = newControl.xmlNode;
if (newNode.OwnerDocument != xmlDocument)
{
newNode = xmlDocument.ImportNode(newControl.xmlNode.CloneNode(true), true);
}
if (SubEquipments.Count > 0)
{
int lastIndex = SubEquipments.Count - 1;
SclSubEquipment lastLNode = SubEquipments[lastIndex];
XmlNode parent = lastLNode.xmlNode.ParentNode;
parent.InsertAfter(newNode, lastLNode.xmlNode);
}
else
{
XmlNode parent = XmlNode;
parent.AppendChild(newNode);
}
try
{
newControl = new SclSubEquipment(xmlDocument, sclDocument, newNode, nsManager);
SubEquipments.Add(newControl);
return newControl;
}
catch (SclParserException e)
{
Console.WriteLine(e.ToString());
return null;
}
}
private void parseSubEquipment()
{
XmlNodeList nodes = xmlNode.SelectNodes("scl:SubEquipment", nsManager);
sclSubEquipments = new List<SclSubEquipment>();
foreach (XmlNode node in nodes)
{
SclSubEquipment lNode = new SclSubEquipment(xmlDocument, sclDocument, node, nsManager);
sclSubEquipments.Add(lNode);
}
}
public List<SclSubEquipment> SubEquipments
{
get
{
return sclSubEquipments;
}
}
public SclEqFunction AddNewEqFunction()
{
SclEqFunction newControl = new SclEqFunction(xmlDocument, sclDocument, nsManager);
XmlNode newNode = newControl.xmlNode;
if (newNode.OwnerDocument != xmlDocument)
{
newNode = xmlDocument.ImportNode(newControl.xmlNode.CloneNode(true), true);
}
if (sclEqFunctions.Count > 0)
{
int lastIndex = sclEqFunctions.Count - 1;
SclEqFunction lastLNode = sclEqFunctions[lastIndex];
XmlNode parent = lastLNode.xmlNode.ParentNode;
parent.InsertAfter(newNode, lastLNode.xmlNode);
}
else
{
XmlNode parent = XmlNode;
parent.AppendChild(newNode);
}
try
{
newControl = new SclEqFunction(xmlDocument, sclDocument, newNode, nsManager);
sclEqFunctions.Add(newControl);
return newControl;
}
catch (SclParserException e)
{
Console.WriteLine(e.ToString());
return null;
}
}
public bool RemoveEqFunction(SclEqFunction node)
{
try
{
XmlNode parent = node.xmlNode.ParentNode;
if (parent != null)
{
parent.RemoveChild(node.xmlNode);
}
EqFunctions.Remove(node);
return true;
}
catch (Exception)
{
return false;
}
}
private List<SclEqFunction> sclEqFunctions;
private void parseEqFunctions()
{
XmlNodeList nodes = xmlNode.SelectNodes("scl:EqFunction", nsManager);
sclEqFunctions = new List<SclEqFunction>();
foreach (XmlNode node in nodes)
{
SclEqFunction lNode = new SclEqFunction(xmlDocument, sclDocument, node, nsManager);
sclEqFunctions.Add(lNode);
}
}
public List<SclEqFunction> EqFunctions
{
get { return sclEqFunctions; }
}
internal SclTapChanger(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlNode, nsManager)
{
parseSubEquipment();
parseEqFunctions();
}
public SclTapChanger(XmlDocument xmlDocument, SclDocument sclDocument, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlDocument.CreateElement("TapChanger", SclDocument.SCL_XMLNS), nsManager)
{
}
}
}

@ -0,0 +1,192 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System;
using System.Collections.Generic;
using System.Xml;
namespace IEC61850.SCL
{
public class SclAbstractEqFuncSubFunc : SclPowerSystemResource
{
public string Type
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "type");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "type", value);
}
}
private List<SclEqSubFunction> sclEqSubFunctions;
private List<SclGeneralEquipment> sclGeneralEquipments;
public bool RemoveEqSubFunction(SclEqSubFunction node)
{
try
{
XmlNode parent = node.xmlNode.ParentNode;
if (parent != null)
{
parent.RemoveChild(node.xmlNode);
}
sclEqSubFunctions.Remove(node);
return true;
}
catch (Exception)
{
return false;
}
}
public bool RemoveGeneralEquipment(SclGeneralEquipment node)
{
try
{
XmlNode parent = node.xmlNode.ParentNode;
if (parent != null)
{
parent.RemoveChild(node.xmlNode);
}
sclGeneralEquipments.Remove(node);
return true;
}
catch (Exception)
{
return false;
}
}
private void parseEqSubFunction()
{
XmlNodeList nodes = xmlNode.SelectNodes("scl:EqSubFunction", nsManager);
sclEqSubFunctions = new List<SclEqSubFunction>();
foreach (XmlNode node in nodes)
{
SclEqSubFunction lNode = new SclEqSubFunction(xmlDocument, sclDocument, node, nsManager);
sclEqSubFunctions.Add(lNode);
}
}
private void parseGeneralEquipment()
{
XmlNodeList nodes = xmlNode.SelectNodes("scl:GeneralEquipment", nsManager);
sclGeneralEquipments = new List<SclGeneralEquipment>();
foreach (XmlNode node in nodes)
{
SclGeneralEquipment lNode = new SclGeneralEquipment(xmlDocument, sclDocument, node, nsManager);
sclGeneralEquipments.Add(lNode);
}
}
public List<SclEqSubFunction> EqSubFunctions
{
get { return sclEqSubFunctions; }
}
public SclEqSubFunction AddNewEqSubFunction()
{
SclEqSubFunction newgeneralEquipment = new SclEqSubFunction(xmlDocument, sclDocument, nsManager);
XmlNode newNode = newgeneralEquipment.xmlNode;
if (newNode.OwnerDocument != xmlDocument)
{
newNode = xmlDocument.ImportNode(newgeneralEquipment.xmlNode.CloneNode(true), true);
}
if (EqSubFunctions.Count > 0)
{
int lastIndex = EqSubFunctions.Count - 1;
SclEqSubFunction lastLNode = EqSubFunctions[lastIndex];
XmlNode parent = lastLNode.xmlNode.ParentNode;
parent.InsertAfter(newNode, lastLNode.xmlNode);
}
else
{
XmlNode parent = XmlNode;
parent.AppendChild(newNode);
}
try
{
newgeneralEquipment = new SclEqSubFunction(xmlDocument, sclDocument, newNode, nsManager);
EqSubFunctions.Add(newgeneralEquipment);
return newgeneralEquipment;
}
catch (SclParserException e)
{
Console.WriteLine("Failed to add Substation");
Console.WriteLine(e.ToString());
return null;
}
}
public List<SclGeneralEquipment> GeneralEquipments
{
get { return sclGeneralEquipments; }
}
internal SclAbstractEqFuncSubFunc(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlNode, nsManager)
{
parseEqSubFunction();
parseGeneralEquipment();
}
}
public class SclEqSubFunction : SclAbstractEqFuncSubFunc
{
internal SclEqSubFunction(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlNode, nsManager)
{
}
public SclEqSubFunction(XmlDocument xmlDocument, SclDocument sclDocument, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlDocument.CreateElement("EqSubFunction", SclDocument.SCL_XMLNS), nsManager)
{
}
}
public class SclEqFunction : SclAbstractEqFuncSubFunc
{
internal SclEqFunction(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlNode, nsManager)
{
}
public SclEqFunction(XmlDocument xmlDocument, SclDocument sclDocument, XmlNamespaceManager nsManager)
: base(xmlDocument, sclDocument, xmlDocument.CreateElement("EqFunction", SclDocument.SCL_XMLNS), nsManager)
{
}
}
}

@ -0,0 +1,152 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System;
using System.Xml;
namespace IEC61850.SCL
{
public class SclGSEControl
{
public XmlNode xmlNode;
private XmlDocument xmlDocument;
public SclGSEControl(SclDocument SclxmlDocument, XmlNode xmlNode)
{
this.xmlNode = xmlNode;
xmlDocument = SclxmlDocument.XmlDocument;
XmlAttribute nameAttr = xmlNode.Attributes["name"];
if (nameAttr == null)
SclxmlDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "GSEControl has no name attribute", this, "MissingName");
}
public SclGSEControl(XmlDocument xmlDoc, string name)
{
xmlDocument = xmlDoc;
xmlNode = xmlDoc.CreateElement("GSEControl", SclDocument.SCL_XMLNS);
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "name", name);
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "appID", name);
}
public SclGSEControl(XmlDocument xmlDocument)
{
this.xmlDocument = xmlDocument;
xmlNode = xmlDocument.CreateElement("scl:GSEControl");
}
public string Name
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "name");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "name", value);
}
}
public string Desc
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "desc");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "desc", value);
}
}
public string DatSet
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "datSet");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "datSet", value);
}
}
public string AppID
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "appID");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "appID", value);
}
}
public int ConfRev
{
get
{
string valStr = XmlHelper.GetAttributeValue(xmlNode, "confRev");
if (valStr != null)
{
int retVal = -1;
Int32.TryParse(valStr, out retVal);
return (retVal);
}
else
return (-1);
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "confRev", value.ToString());
}
}
public bool FixedOffs
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "fixedOffs", false);
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "fixedOffs", value);
}
}
public string Type
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "type");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "type", value);
}
}
public string SecurityEnabled
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "securityEnabled");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "securityEnabled", value);
}
}
}
}

@ -0,0 +1,339 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System;
using System.Collections.Generic;
using System.Xml;
namespace IEC61850.SCL
{
/// <summary>
/// Representation of the SCL Header.History.Hitem (history item) element
/// </summary>
public class SclHitem
{
public XmlNode XmlNode = null;
private XmlDocument xmlDocument;
public string Version
{
get
{
return XmlHelper.GetAttributeValue(XmlNode, "version");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, XmlNode, "version", value);
}
}
public string Revision
{
get
{
return XmlHelper.GetAttributeValue(XmlNode, "revision");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, XmlNode, "revision", value);
}
}
public string What
{
get
{
return XmlHelper.GetAttributeValue(XmlNode, "what");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, XmlNode, "what", value);
}
}
public string Who
{
get
{
return XmlHelper.GetAttributeValue(XmlNode, "who");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, XmlNode, "who", value);
}
}
public string When
{
get
{
return XmlHelper.GetAttributeValue(XmlNode, "when");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, XmlNode, "when", value);
}
}
public string Why
{
get
{
return XmlHelper.GetAttributeValue(XmlNode, "why");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, XmlNode, "why", value);
}
}
public SclHitem(SclDocument SclxmlDocument, XmlNode xmlNode)
{
xmlDocument = SclxmlDocument.XmlDocument;
XmlNode = xmlNode;
XmlAttribute version = xmlNode.Attributes["version"];
if (version == null)
SclxmlDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "No version attribute on Hitem", this, "version");
XmlAttribute revision = xmlNode.Attributes["revision"];
if (revision == null)
SclxmlDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "No revision attribute on Hitem", this, "revision");
XmlAttribute when = xmlNode.Attributes["when"];
if (when == null)
SclxmlDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "No when attribute on Hitem", this, "when");
}
public SclHitem(XmlDocument xmlDocument)
{
this.xmlDocument = xmlDocument;
XmlNode = xmlDocument.CreateElement("Hitem", SclDocument.SCL_XMLNS);
Version = "";
Revision = "";
When = "";
}
}
public class SclHistory
{
private XmlNode xmlNode = null;
private XmlDocument xmlDocument;
private List<SclHitem> hitems = new List<SclHitem>();
public XmlNode XmlNode
{
get { return xmlNode; }
}
public List<SclHitem> HItems
{
get
{
return hitems;
}
}
public SclHitem AddHitem()
{
SclHitem sclHitem = new SclHitem(xmlDocument);
hitems.Add(sclHitem);
xmlNode.AppendChild(sclHitem.XmlNode);
return sclHitem;
}
public bool DeleteHitem(SclHitem sclHitem)
{
try
{
hitems.Remove(sclHitem);
xmlNode.RemoveChild(sclHitem.XmlNode);
return true;
}
catch (Exception)
{
return false;
}
}
public SclHistory(SclDocument SclxmlDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
{
xmlDocument = SclxmlDocument.XmlDocument;
this.xmlNode = xmlNode;
XmlNodeList hitemNodes = xmlNode.SelectNodes("scl:Hitem", nsManager);
foreach (XmlNode hitemNode in hitemNodes)
{
hitems.Add(new SclHitem(SclxmlDocument, hitemNode));
}
}
public SclHistory(XmlDocument xmlDocument)
{
this.xmlDocument = xmlDocument;
xmlNode = xmlDocument.CreateElement("History", SclDocument.SCL_XMLNS);
SclHitem sclHitem = new SclHitem(xmlDocument);
xmlNode.AppendChild(sclHitem.XmlNode);
hitems.Add(sclHitem);
}
}
public class SclHeader
{
private XmlNode xmlNode = null;
private XmlDocument xmlDocument;
private SclHistory history = null;
public string MyProperty
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "id");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "id", value);
}
}
public XmlNode XmlNode
{
get
{
return xmlNode;
}
}
public string Version
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "version");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "version", value);
}
}
public string Revision
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "revision");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "revision", value);
}
}
public string ToolID
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "toolID");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "toolID", value);
}
}
public string NameStructure
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "nameStructure");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "nameStructure", value);
}
}
public SclHistory History
{
get
{
return history;
}
}
public bool DeleteHistory()
{
if (history != null)
{
xmlNode.RemoveChild(history.XmlNode);
history = null;
return true;
}
return false;
}
public XmlNode Node
{
get { return xmlNode; }
}
public SclHistory AddHistory()
{
if (history == null)
{
history = new SclHistory(xmlDocument);
xmlNode.AppendChild(history.XmlNode);
return history;
}
else
return null;
}
public SclHeader(SclDocument SclxmlDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
{
xmlDocument = SclxmlDocument.XmlDocument;
this.xmlNode = xmlNode;
XmlAttribute idAttr = xmlNode.Attributes["id"];
if (idAttr == null)
SclxmlDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "No id attribute on Header", this, "id");
XmlNode historyNode = xmlNode.SelectSingleNode("scl:History", nsManager);
if (historyNode != null)
history = new SclHistory(SclxmlDocument, historyNode, nsManager);
}
public SclHeader(SclDocument SclDocument, XmlNamespaceManager nsManager)
{
xmlDocument = SclDocument.XmlDocument;
xmlNode = SclDocument.XmlDocument.CreateElement("Header", SclDocument.SCL_XMLNS);
MyProperty = "";
history = new SclHistory(SclDocument.XmlDocument);
xmlNode.AppendChild(history.XmlNode);
}
}
}

@ -0,0 +1,177 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System.Xml;
namespace IEC61850.SCL
{
public class SclLogControl
{
public XmlNode xmlNode;
private XmlDocument xmlDocument;
private SclTrgOps trgOps = null;
public SclTrgOps TrgOps
{
get
{
return trgOps;
}
}
public SclLogControl(SclDocument SclxmlDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
{
this.xmlNode = xmlNode;
xmlDocument = SclxmlDocument.XmlDocument;
XmlAttribute nameAttr = xmlNode.Attributes["name"];
if (nameAttr == null)
SclxmlDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "LogControl has no name attribute", this, "MissingName");
XmlNode trgOpsNode = xmlNode.SelectSingleNode("scl:TrgOps", nsManager);
if (trgOpsNode != null)
trgOps = new SclTrgOps(xmlDocument, trgOpsNode);
}
public string Name
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "name");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "name", value);
}
}
public string Desc
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "desc");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "desc", value);
}
}
public string DatSet
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "datSet");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "datSet", value);
}
}
public string IntgPd
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "intgPd");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "intgPd", value);
}
}
public string LdInst
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "ldInst");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "ldInst", value);
}
}
public string Prefix
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "prefix");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "prefix", value);
}
}
public string LnClass
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "lnClass");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "lnClass", value);
}
}
public string LnInst
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "lnInst");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "lnInst", value);
}
}
public string LogName
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "logName");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "logName", value);
}
}
public bool LogEna
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "logEna", false);
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "logEna", value);
}
}
public bool ReasonCode
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "reasonCode", false);
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "reasonCode", value);
}
}
}
}

@ -0,0 +1,32 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System.Xml;
namespace IEC61850.SCL
{
public class SclPrivate : SclBaseElement
{
internal SclPrivate(XmlDocument xmlDocument, SclDocument sclDocument, XmlNode xmlNode)
: base(xmlDocument, sclDocument, xmlNode)
{
}
public string Type
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "type");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(sclDocument.XmlDocument, xmlNode, "type", value);
}
}
}
}

@ -0,0 +1,309 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System;
using System.Xml;
namespace IEC61850.SCL
{
public class SclSMVControl
{
internal XmlNode xmlNode;
private XmlDocument xmlDocument;
private SclSmvOpts smvOpts = null;
public SclSMVControl(SclDocument SclxmlDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
{
this.xmlNode = xmlNode;
xmlDocument = SclxmlDocument.XmlDocument;
XmlAttribute nameAttr = xmlNode.Attributes["name"];
if (nameAttr == null)
SclxmlDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "SMVControl has no name attribute", this, "MissingName");
XmlNode smvOptsNode = xmlNode.SelectSingleNode("scl:SmvOpts", nsManager);
if (smvOptsNode != null)
smvOpts = new SclSmvOpts(xmlDocument, smvOptsNode);
}
public SclSmvOpts SclSmvOpts
{
get
{
return smvOpts;
}
}
public string Name
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "name");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "name", value);
}
}
public string Desc
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "desc");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "desc", value);
}
}
public string DataSet
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "datSet");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "datSet", value);
}
}
public int ConfRev
{
get
{
string valStr = XmlHelper.GetAttributeValue(xmlNode, "confRev");
if (valStr != null)
{
int retVal = -1;
Int32.TryParse(valStr, out retVal);
return (retVal);
}
else
return (-1);
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "confRev", value.ToString());
}
}
public string SmvID
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "smvID");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "smvID", value);
}
}
public bool Multicast
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "multicast", false);
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "multicast", value);
}
}
public int SmpRate
{
get
{
string valStr = XmlHelper.GetAttributeValue(xmlNode, "smpRate");
if (valStr != null)
{
int retVal = -1;
Int32.TryParse(valStr, out retVal);
return (retVal);
}
else
return (-1);
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "smpRate", value.ToString());
}
}
public int NofASDU
{
get
{
string valStr = XmlHelper.GetAttributeValue(xmlNode, "nofASDU");
if (valStr != null)
{
int retVal = -1;
Int32.TryParse(valStr, out retVal);
return (retVal);
}
else
return (-1);
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "nofASDU", value.ToString());
}
}
public string SmpMod
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "smpMod");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "smpMod", value);
}
}
public string SecurityEnabled
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "securityEnabled");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "securityEnabled", value);
}
}
}
public class SclSmvOpts
{
internal XmlNode xmlNode = null;
private XmlDocument xmlDocument;
public bool RefreshTime
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "refreshTime", false); ;
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "refreshTime", value);
}
}
public bool SampleRate
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "sampleRate", false);
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "sampleRate", value);
}
}
public bool DataSet
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "dataSet", false); ;
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "dataSet", value);
}
}
public bool Security
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "security", false);
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "security", value);
}
}
public bool SynchSourceId
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "synchSourceId", false); ;
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "synchSourceId", value);
}
}
public bool DataRef
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "dataRef", false); ;
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "dataRef", value);
}
}
public bool SampleSynchronized
{
get
{
return XmlHelper.ParseBooleanAttribute(xmlNode, "sampleSynchronized", false); ;
}
set
{
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "sampleSynchronized", value);
}
}
public int GetIntValue()
{
int intValue = 0;
if (RefreshTime) intValue += 1;
if (SampleSynchronized) intValue += 2;
if (SampleRate) intValue += 4;
if (DataSet) intValue += 8;
if (Security) intValue += 16;
return intValue;
}
public SclSmvOpts(XmlDocument xmlDocument, XmlNode xmlNode)
{
this.xmlNode = xmlNode;
this.xmlDocument = xmlDocument;
}
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,125 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using IEC61850.SCL.DataModel;
using System;
using System.Xml;
namespace IEC61850.SCL
{
public class SclSettingControl
{
public XmlNode xmlNode;
private XmlDocument xmlDocument;
public IEDModelNode Parent;
public SclSettingControl(SclDocument SclxmlDocument, XmlNode xmlNode)
{
this.xmlNode = xmlNode;
xmlDocument = SclxmlDocument.XmlDocument;
XmlAttribute nameAttr = xmlNode.Attributes["numOfSGs"];
if (nameAttr == null)
SclxmlDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "SettingControl has no numOfSGs attribute", this, "numOfSGs");
}
public SclSettingControl(XmlDocument xmlDoc, string numOfSGs)
{
xmlDocument = xmlDoc;
xmlNode = xmlDoc.CreateElement("SettingControl", SclDocument.SCL_XMLNS);
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "numOfSGs", numOfSGs);
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "actSG", "1");
}
public string Desc
{
get
{
return XmlHelper.GetAttributeValue(xmlNode, "desc");
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "desc", value);
}
}
public int NumOfSGs
{
get
{
string valStr = XmlHelper.GetAttributeValue(xmlNode, "numOfSGs");
if (valStr != null)
{
int retVal = -1;
Int32.TryParse(valStr, out retVal);
return (retVal);
}
else
return (-1);
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "numOfSGs", value.ToString());
}
}
public int ActSG
{
get
{
string valStr = XmlHelper.GetAttributeValue(xmlNode, "actSG");
if (valStr != null)
{
int retVal = -1;
Int32.TryParse(valStr, out retVal);
return (retVal);
}
else
return (-1);
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "actSG", value.ToString());
}
}
public int ResvTms
{
get
{
string valStr = XmlHelper.GetAttributeValue(xmlNode, "resvTms");
if (valStr != null)
{
int retVal = -1;
Int32.TryParse(valStr, out retVal);
return (retVal);
}
else
return (-1);
}
set
{
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "resvTms", value.ToString());
}
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,66 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System.Xml.Schema;
namespace IEC61850.SCL
{
public class SclValidatorMessage
{
private XmlSeverityType level;
private string message;
private int lineNo = -1;
private int linePos = -1;
public XmlSeverityType Level
{
get
{
return level;
}
}
public string Message
{
get
{
return message;
}
}
public int LineNo
{
get
{
return lineNo;
}
}
public int LinePos
{
get
{
return linePos;
}
}
public SclValidatorMessage(XmlSeverityType level, string message)
{
this.level = level;
this.message = message;
}
public SclValidatorMessage(XmlSeverityType level, string message, int lineNo, int linePos)
: this(level, message)
{
this.lineNo = lineNo;
this.linePos = linePos;
}
}
}

@ -0,0 +1,82 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using System;
using System.Xml;
namespace IEC61850.SCL
{
internal class XmlHelper
{
public static XmlAttribute GetAttributeCreateIfNotExist(XmlDocument xmlDoc, XmlNode node, string attrName)
{
XmlAttribute xmlAttr = node.Attributes[attrName];
if (xmlAttr == null)
{
xmlAttr = xmlDoc.CreateAttribute(attrName);
node.Attributes.Append(xmlAttr);
}
return xmlAttr;
}
public static void
SetAttributeCreateIfNotExists(XmlDocument xmlDoc, XmlNode node, string attrName, string value)
{
XmlAttribute xmlAttr = GetAttributeCreateIfNotExist(xmlDoc, node, attrName);
xmlAttr.Value = value;
}
public static void
SetBooleanAttributeCreateIfNotExists(XmlDocument xmlDoc, XmlNode node, string attrName, bool value)
{
string strVal;
if (value)
strVal = "true";
else
strVal = "false";
SetAttributeCreateIfNotExists(xmlDoc, node, attrName, strVal);
}
public static string GetAttributeValue(XmlNode node, string attrName)
{
string value = null;
XmlAttribute xmlAttr = node.Attributes[attrName];
if (xmlAttr != null)
value = xmlAttr.Value;
return value;
}
public static bool
ParseBooleanAttribute(XmlNode xmlNode, string attributeName, bool defaultValue)
{
XmlAttribute attr = xmlNode.Attributes[attributeName];
bool attrVal = defaultValue;
if (attr != null)
{
if (Boolean.TryParse(attr.Value, out attrVal) == false)
throw new SclParserException(xmlNode, attributeName + ": failed to parse boolean attribute");
}
return attrVal;
}
}
}

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\SCLParser\SCLParser.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,442 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL" revision="A" version="2007">
<Header id="" nameStructure="IEDName" toolID="FUHUA Model Designer ICT">
<History>
<Hitem revision="" version="" when="" />
</History>
</Header>
<Communication>
<SubNetwork name="W1">
<ConnectedAP apName="AP1" iedName="IED1">
<Address>
<P type="OSI-AP-Title">1,1,1,999,1</P>
<P type="OSI-AE-Qualifier">12</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
<P type="OSI-TSEL">0001</P>
<P type="IP">0.0.0.0</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">0.0.0.0</P>
</Address>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="IED1" originalSclRevision="B" originalSclVersion="2007">
<Services nameLength="64">
<ClientServices />
<ConfDataSet max="50" maxAttributes="100" />
<ConfReportControl max="50" />
<ReportSettings bufTime="Dyn" cbName="Conf" datSet="Conf" intgPd="Dyn" optFields="Dyn" trgOps="Dyn" />
<ConfLNs fixLnInst="true" fixPrefix="true" />
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetCBValues />
<DataObjectDirectory />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GSESettings appID="Conf" cbName="Conf" datSet="Conf" />
<GOOSE max="10" />
</Services>
<AccessPoint name="AP1">
<Server>
<Authentication none="true" />
<LDevice inst="LD1">
<LN0 inst="" lnClass="LLN0" lnType="LLN0_0">
<DataSet name="AnalogEvents">
<FCDA doName="AnIn1" fc="MX" ldInst="LD1" prefix="AnIn" lnClass="GGIO" lnInst="1" />
<FCDA doName="AnIn2" fc="MX" ldInst="LD1" prefix="AnIn" lnClass="GGIO" lnInst="1" />
<FCDA doName="AnIn3" fc="MX" ldInst="LD1" prefix="AnIn" lnClass="GGIO" lnInst="1" />
<FCDA doName="AnIn4" fc="MX" ldInst="LD1" prefix="AnIn" lnClass="GGIO" lnInst="1" />
</DataSet>
<ReportControl bufTime="0" buffered="true" confRev="1" datSet="AnalogEvents" intgPd="5000" name="BRCB_Events">
<TrgOps dchg="true" dupd="false" period="false" qchg="true" />
<OptFields configRef="true" dataRef="true" dataSet="false" entryID="true" reasonCode="true" seqNum="true" timeStamp="true" />
<RptEnabled max="2" />
</ReportControl>
<ReportControl bufTime="0" buffered="false" confRev="1" datSet="AnalogEvents" intgPd="5000" name="URCB_Events">
<TrgOps dchg="true" dupd="false" period="false" qchg="true" />
<OptFields configRef="true" dataRef="true" dataSet="false" reasonCode="true" seqNum="true" timeStamp="true" />
<RptEnabled max="2" />
</ReportControl>
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
</LN0>
<LN inst="1" lnClass="LPHD" lnType="LPHD" />
<LN inst="1" prefix="AnIn" lnClass="GGIO" lnType="GGIO_AnIn_MV">
<DOI name="Beh">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
<DOI name="AnIn1">
<DAI name="db">
<Val>10000</Val>
</DAI>
<DAI name="dbRef">
<Val>10</Val>
</DAI>
<DAI name="zeroDb">
<Val>1000</Val>
</DAI>
<DAI name="zeroDbRef">
<Val>10</Val>
</DAI>
</DOI>
<DOI name="AnIn2">
<DAI name="db">
<Val>1000</Val>
</DAI>
<DAI name="dbRef">
<Val>10</Val>
</DAI>
<DAI name="zeroDb">
<Val>1000</Val>
</DAI>
<DAI name="zeroDbRef">
<Val>10</Val>
</DAI>
</DOI>
<DOI name="AnIn3">
<DAI name="db">
<Val>10000</Val>
</DAI>
<DAI name="zeroDb">
<Val>1000</Val>
</DAI>
<SDI name="rangeC">
<SDI name="min">
<DAI name="f">
<Val>-5</Val>
</DAI>
</SDI>
<SDI name="max">
<DAI name="f">
<Val>5</Val>
</DAI>
</SDI>
</SDI>
</DOI>
<DOI name="AnIn4">
<DAI name="db">
<Val>1000</Val>
</DAI>
<DAI name="zeroDb">
<Val>1000</Val>
</DAI>
<SDI name="rangeC">
<SDI name="min">
<DAI name="f">
<Val>-100</Val>
</DAI>
</SDI>
<SDI name="max">
<DAI name="f">
<Val>100</Val>
</DAI>
</SDI>
</SDI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LPHD" lnClass="LPHD">
<DO name="PhyNam" type="DPL" />
<DO name="PhyHealth" type="ENS_Health" />
<DO name="Proxy" type="SPS" />
</LNodeType>
<LNodeType id="LLN0_0" lnClass="LLN0">
<DO name="Mod" type="ENC_Mod" />
<DO name="Beh" type="ENS_Beh" />
<DO name="Health" type="ENS_Health" />
<DO name="NamPlt" type="LPL_NamPlt" />
</LNodeType>
<LNodeType id="GGIO_AnIn_MV" lnClass="GGIO">
<DO name="Beh" type="ENS_Beh" />
<DO name="AnIn1" type="MV_db" />
<DO name="AnIn2" type="MV_db" />
<DO name="AnIn3" type="MV_db_rangeC" />
<DO name="AnIn4" type="MV_db_rangeC" />
</LNodeType>
<DOType cdc="DPL" id="DPL">
<DA bType="VisString255" fc="DC" name="vendor" />
<DA bType="VisString255" fc="DC" name="hwRev" />
<DA bType="VisString255" fc="DC" name="swRev" />
<DA bType="VisString255" fc="DC" name="serNum" />
<DA bType="VisString255" fc="DC" name="model" />
<DA bType="VisString255" fc="DC" name="location" />
<DA bType="VisString64" fc="DC" name="name" />
<DA bType="VisString255" fc="DC" name="owner" />
</DOType>
<DOType cdc="ENS" id="ENS_TmSyn">
<DA bType="Enum" fc="ST" name="stVal" type="TmSynEnum" />
<DA bType="Quality" fc="ST" name="q" />
<DA bType="Timestamp" fc="ST" name="t" />
</DOType>
<DOType cdc="ENS" id="ENS_Beh">
<DA bType="Enum" fc="ST" name="stVal" type="BehKind" />
<DA bType="Quality" fc="ST" name="q" />
<DA bType="Timestamp" fc="ST" name="t" />
</DOType>
<DOType cdc="SPS" id="SPS">
<DA bType="BOOLEAN" dchg="true" fc="ST" name="stVal" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
<DA bType="VisString255" fc="DC" name="d" />
</DOType>
<DOType cdc="ENC" id="ENC_Mod">
<DA bType="Enum" dchg="true" fc="ST" name="stVal" type="ModKind" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
<DA bType="Enum" fc="CF" name="ctlModel" type="ctlModel" />
</DOType>
<DOType cdc="ENC" id="ENC">
<DA bType="Struct" fc="CO" name="Oper" type="ENCOperate" />
<DA bType="VisString129" fc="CO" name="SBO" />
<DA bType="Struct" fc="CO" name="SBOw" type="ENCOperate" />
<DA bType="Struct" fc="ST" name="origin" type="Originator" />
<DA bType="INT8U" fc="ST" name="ctlNum" />
<DA bType="Enum" dchg="true" fc="ST" name="stVal" type="tempEnum" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
<DA bType="Enum" fc="CF" name="ctlModel" type="ctlModel" />
</DOType>
<DOType cdc="INS" id="INS">
<DA bType="INT32" dchg="true" fc="ST" name="stVal" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
<DA bType="INT32U" fc="CF" name="db" />
<DA bType="INT32U" fc="CF" name="zeroDb" />
</DOType>
<DOType cdc="MV" id="MV_db">
<DA bType="Struct" fc="MX" name="instMag" type="AnalogueValue"/>
<DA bType="Struct" dchg="true" dupd="false" fc="MX" name="mag" type="AnalogueValue" />
<DA bType="Quality" fc="MX" name="q" qchg="true" />
<DA bType="Timestamp" fc="MX" name="t" />
<DA bType="INT32U" dchg="true" fc="CF" name="db" />
<DA bType="INT32U" dchg="true" fc="CF" name="zeroDb" />
<DA bType="FLOAT32" dchg="true" fc="CF" name="dbRef" />
<DA bType="FLOAT32" dchg="true" fc="CF" name="zeroDbRef" />
</DOType>
<DOType cdc="MV" id="MV_db_rangeC">
<DA bType="Struct" fc="MX" name="instMag" type="AnalogueValue"/>
<DA bType="Struct" dchg="true" dupd="false" fc="MX" name="mag" type="AnalogueValue" />
<DA bType="Quality" fc="MX" name="q" qchg="true" />
<DA bType="Timestamp" fc="MX" name="t" />
<DA bType="INT32U" dchg="true" fc="CF" name="db" />
<DA bType="INT32U" dchg="true" fc="CF" name="zeroDb" />
<DA bType="Struct" dchg="true" fc="CF" name="rangeC" type="RangeConfig" />
</DOType>
<DOType cdc="ENS" id="ENS_Health">
<DA bType="Enum" dchg="true" fc="ST" name="stVal" type="HealthKind" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
</DOType>
<DOType cdc="LPL" id="LPL_NamPlt">
<DA bType="VisString255" fc="DC" name="vendor" />
<DA bType="VisString255" fc="DC" name="swRev" />
<DA bType="VisString255" fc="DC" name="d" />
<DA bType="VisString255" fc="DC" name="configRev" />
</DOType>
<DAType id="Originator">
<BDA bType="Enum" name="orCat" type="orCat" />
<BDA bType="Octet64" name="orIdent" />
</DAType>
<DAType id="ENCOperate">
<BDA bType="Enum" name="ctlVal" type="tempEnum" />
<BDA bType="Timestamp" name="operTm" />
<BDA bType="Struct" name="origin" type="Originator" />
<BDA bType="INT8U" name="ctlNum" />
<BDA bType="Timestamp" name="T" />
<BDA bType="BOOLEAN" name="Test" />
<BDA bType="Check" name="Check" />
</DAType>
<DAType id="ENCCancel">
<BDA bType="Enum" name="ctlVal" type="tempEnum" />
<BDA bType="Timestamp" name="operTm" />
<BDA bType="Struct" name="origin" type="Originator" />
<BDA bType="INT8U" name="ctlNum" />
<BDA bType="Timestamp" name="T" />
<BDA bType="BOOLEAN" name="Test" />
</DAType>
<DAType id="Unit">
<BDA bType="Enum" name="SIUnit" type="SIUnit" />
<BDA bType="Enum" name="multiplier" type="multiplier" />
</DAType>
<DAType id="Vector">
<BDA name="mag" bType="Struct" type="AnalogueValue" />
<BDA name="ang" bType="Struct" type="AnalogueValue" />
</DAType>
<DAType id="AnalogueValue">
<BDA bType="FLOAT32" name="f" />
</DAType>
<DAType id="ScaledValueConfig">
<BDA bType="FLOAT32" name="scaleFactor" />
<BDA bType="FLOAT32" name="offset" />
</DAType>
<DAType id="RangeConfig">
<BDA bType="Struct" name="min" type="AnalogueValue" />
<BDA bType="Struct" name="max" type="AnalogueValue" />
</DAType>
<DAType id="PulseConfig">
<BDA bType="Enum" name="cmdQual" type="cmdQual" />
<BDA bType="INT32U" name="onDur" />
<BDA bType="INT32U" name="offDur" />
<BDA bType="INT32U" name="numPls" />
</DAType>
<EnumType id="tempEnum">
<EnumVal ord="0">e1</EnumVal>
<EnumVal ord="1">e2</EnumVal>
<EnumVal ord="2">e3</EnumVal>
<EnumVal ord="3">e4</EnumVal>
<EnumVal ord="4">e5</EnumVal>
</EnumType>
<EnumType id="TmSynEnum">
<EnumVal ord="0">ExternalAreaClock</EnumVal>
<EnumVal ord="1">LocalAreaClock</EnumVal>
<EnumVal ord="2">GlobalAreaClock</EnumVal>
</EnumType>
<EnumType id="orCat">
<EnumVal ord="0">not-supported</EnumVal>
<EnumVal ord="1">bay-control</EnumVal>
<EnumVal ord="2">station-control</EnumVal>
<EnumVal ord="3">remote-control</EnumVal>
<EnumVal ord="4">automatic-bay</EnumVal>
<EnumVal ord="5">automatic-station</EnumVal>
<EnumVal ord="6">automatic-remote</EnumVal>
<EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal>
</EnumType>
<EnumType id="ctlModel">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="sboClass">
<EnumVal ord="0">operate-once</EnumVal>
<EnumVal ord="1">operate-many</EnumVal>
</EnumType>
<EnumType id="SIUnit">
<EnumVal ord="1">none</EnumVal>
<EnumVal ord="2">m</EnumVal>
<EnumVal ord="3">kg</EnumVal>
<EnumVal ord="4">s</EnumVal>
<EnumVal ord="5">A</EnumVal>
<EnumVal ord="6">K</EnumVal>
<EnumVal ord="7">mol</EnumVal>
<EnumVal ord="8">cd</EnumVal>
<EnumVal ord="9">deg</EnumVal>
<EnumVal ord="10">rad</EnumVal>
<EnumVal ord="11">sr</EnumVal>
<EnumVal ord="21">Gy</EnumVal>
<EnumVal ord="22">q</EnumVal>
<EnumVal ord="23">°C</EnumVal>
<EnumVal ord="24">Sv</EnumVal>
<EnumVal ord="25">F</EnumVal>
<EnumVal ord="26">C</EnumVal>
<EnumVal ord="27">S</EnumVal>
<EnumVal ord="28">H</EnumVal>
<EnumVal ord="29">V</EnumVal>
<EnumVal ord="30">ohm</EnumVal>
<EnumVal ord="31">J</EnumVal>
<EnumVal ord="32">N</EnumVal>
<EnumVal ord="33">Hz</EnumVal>
<EnumVal ord="34">lx</EnumVal>
<EnumVal ord="35">Lm</EnumVal>
<EnumVal ord="36">Wb</EnumVal>
<EnumVal ord="37">T</EnumVal>
<EnumVal ord="38">W</EnumVal>
<EnumVal ord="39">Pa</EnumVal>
<EnumVal ord="41">m²</EnumVal>
<EnumVal ord="42">m³</EnumVal>
<EnumVal ord="43">m/s</EnumVal>
<EnumVal ord="44">m/s²</EnumVal>
<EnumVal ord="45">m³/s</EnumVal>
<EnumVal ord="46">m/m³</EnumVal>
<EnumVal ord="47">M</EnumVal>
<EnumVal ord="48">kg/m³</EnumVal>
<EnumVal ord="49">m²/s</EnumVal>
<EnumVal ord="50">W/m K</EnumVal>
<EnumVal ord="51">J/K</EnumVal>
<EnumVal ord="52">ppm</EnumVal>
<EnumVal ord="53">1/s</EnumVal>
<EnumVal ord="54">rad/s</EnumVal>
<EnumVal ord="61">VA</EnumVal>
<EnumVal ord="62">Watts</EnumVal>
<EnumVal ord="63">VAr</EnumVal>
<EnumVal ord="64">theta</EnumVal>
<EnumVal ord="65">cos(theta)</EnumVal>
<EnumVal ord="66">Vs</EnumVal>
<EnumVal ord="67">V²</EnumVal>
<EnumVal ord="68">As</EnumVal>
<EnumVal ord="69">A²</EnumVal>
<EnumVal ord="70">A²t</EnumVal>
<EnumVal ord="71">VAh</EnumVal>
<EnumVal ord="72">Wh</EnumVal>
<EnumVal ord="73">VArh</EnumVal>
<EnumVal ord="74">V/Hz</EnumVal>
</EnumType>
<EnumType id="multiplier">
<EnumVal ord="-24">Yocto</EnumVal>
<EnumVal ord="-21">Zepto</EnumVal>
<EnumVal ord="-18">Atto</EnumVal>
<EnumVal ord="-15">Femto</EnumVal>
<EnumVal ord="-12">Pico</EnumVal>
<EnumVal ord="-9">Nano</EnumVal>
<EnumVal ord="-6">Micro</EnumVal>
<EnumVal ord="-3">Milli</EnumVal>
<EnumVal ord="-2">Centi</EnumVal>
<EnumVal ord="-1">Deci</EnumVal>
<EnumVal ord="0">zeroNoValue</EnumVal>
<EnumVal ord="1">Deca</EnumVal>
<EnumVal ord="2">Hecto</EnumVal>
<EnumVal ord="3">Kilo</EnumVal>
<EnumVal ord="6">Mega</EnumVal>
<EnumVal ord="9">Giga</EnumVal>
<EnumVal ord="12">Tera</EnumVal>
<EnumVal ord="15">Petra</EnumVal>
<EnumVal ord="18">Exa</EnumVal>
<EnumVal ord="21">Zetta</EnumVal>
<EnumVal ord="24">Yotta</EnumVal>
</EnumType>
<EnumType id="range">
<EnumVal ord="0">normal</EnumVal>
<EnumVal ord="1">high</EnumVal>
<EnumVal ord="2">low</EnumVal>
<EnumVal ord="3">high-high</EnumVal>
<EnumVal ord="4">low-low</EnumVal>
</EnumType>
<EnumType id="cmdQual">
<EnumVal ord="0">pulse</EnumVal>
<EnumVal ord="1">persistent</EnumVal>
</EnumType>
<EnumType id="HealthKind">
<EnumVal ord="1">Ok</EnumVal>
<EnumVal ord="2">Warning</EnumVal>
<EnumVal ord="3">Alarm</EnumVal>
</EnumType>
<EnumType id="BehKind">
<EnumVal ord="1">on</EnumVal>
<EnumVal ord="2">blocked</EnumVal>
<EnumVal ord="3">test</EnumVal>
<EnumVal ord="4">test/blocked</EnumVal>
<EnumVal ord="5">off</EnumVal>
</EnumType>
<EnumType id="ModKind">
<EnumVal ord="1">on</EnumVal>
<EnumVal ord="2">blocked</EnumVal>
<EnumVal ord="3">test</EnumVal>
<EnumVal ord="4">test/blocked</EnumVal>
<EnumVal ord="5">off</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,340 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" />
<IED name="ied1">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication password="true" />
<LDevice inst="Inverter">
<LN0 lnClass="LLN0" lnType="LLN02" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD2" inst="1" prefix="" />
<LN lnClass="ZINV" lnType="ZINV3" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU1" inst="1" prefix="">
<DataSet name="dataset1" desc="">
<FCDA ldInst="ied1Inverter" lnClass="LLN0" fc="ST" doName="Mod" daName="q" />
<FCDA ldInst="ied1Battery" lnClass="LLN0" fc="ST" doName="Mod" daName="q" />
<FCDA ldInst="ied1Inverter" lnClass="MMXU" fc="ST" lnInst="1" doName="Mod" daName="q" />
<FCDA ldInst="ied1Inverter" lnClass="MMXU" fc="CF" lnInst="1" doName="Mod" daName="ctlModel" />
</DataSet>
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
<LDevice inst="Battery">
<LN0 lnClass="LLN0" lnType="LLN03" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD3" inst="1" prefix="" />
<LN lnClass="ZBAT" lnType="ZBAT1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="ZBTC" lnType="ZBTC1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
<LDevice inst="Physical_Measurements">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="MMXU1" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="TotW" type="MV_1_Vol" />
<DO name="TotVAr" type="MV_1_Vol" />
<DO name="TotVA" type="MV_1_Vol" />
<DO name="Hz" type="MV_1_Vol" />
<DO name="PhV" type="WYE_1_PhV" />
<DO name="A" type="WYE_1_PhV" />
<DO name="W" type="WYE_1_W" />
</LNodeType>
<LNodeType id="ZBTC1" lnClass="ZBTC" desc="Battery charger">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="BatChaSt" type="ENG_1_BatChaSt" />
<DO name="BatChaPwr" type="ASG_1_BatChaPwr" />
<DO name="BatChaMod" type="ENG_1_BatChaSt" />
<DO name="ChaV" type="MV_1_Vol" />
<DO name="ChaA" type="MV_1_Vol" />
</LNodeType>
<LNodeType id="ZBAT1" lnClass="ZBAT" desc="Battery">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="Vol" type="MV_1_Vol" />
<DO name="Amp" type="MV_1_Vol" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="LLN01" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LLN02" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD2" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="LLN03" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD3" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="ZINV3" lnClass="ZINV" desc="Inverter">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="WRtg" type="ASG_1_WRtg" />
<DO name="VarRtg" type="ASG_1_WRtg" />
<DO name="ACTyp" type="ENG_1_ACTyp" />
<DO name="OutWSet" type="ASG_1_WRtg" />
<DO name="OutVarSet" type="ASG_1_WRtg" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="WYE_1_W" cdc="WYE">
<SDO name="phsA" type="CMV_1_phsA" />
<SDO name="phsB" type="CMV_1_phsA" />
<SDO name="phsC" type="CMV_1_phsA" />
</DOType>
<DOType id="CMV_1_phsA" cdc="CMV">
<DA name="cVal" type="Vector_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="ASG_1_BatChaPwr" cdc="ASG" />
<DOType id="ENG_1_BatChaSt" cdc="ENG" />
<DOType id="WYE_1_PhV" cdc="WYE">
<SDO name="phsA" type="CMV_1_phsA" />
<SDO name="phsB" type="CMV_1_phsA" />
<SDO name="phsC" type="CMV_1_phsA" />
<SDO name="neut" type="CMV_1_phsA" />
</DOType>
<DOType id="MV_1_Vol" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="ASG_1_WRtg" cdc="ASG">
<DA name="setMag" type="AnalogueValue_1" bType="Struct" fc="SP" />
<DA name="units" type="Unit_1" bType="Struct" fc="CF" />
</DOType>
<DOType id="ENG_1_ACTyp" cdc="ENG">
<DA name="setVal" bType="INT32" fc="SP" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Vector_1">
<BDA name="mag" type="AnalogueValue_1" bType="Struct" />
</DAType>
<DAType id="Unit_1">
<BDA name="SIUnit" type="SIUnit" bType="Enum" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="SIUnit">
<EnumVal ord="1">
</EnumVal>
<EnumVal ord="10">rad</EnumVal>
<EnumVal ord="11">sr</EnumVal>
<EnumVal ord="2">m</EnumVal>
<EnumVal ord="21">Gy</EnumVal>
<EnumVal ord="22">q</EnumVal>
<EnumVal ord="23">ðC</EnumVal>
<EnumVal ord="24">Sv</EnumVal>
<EnumVal ord="25">F</EnumVal>
<EnumVal ord="26">C</EnumVal>
<EnumVal ord="27">S</EnumVal>
<EnumVal ord="28">H</EnumVal>
<EnumVal ord="29">V</EnumVal>
<EnumVal ord="3">kg</EnumVal>
<EnumVal ord="30">ohm</EnumVal>
<EnumVal ord="31">J</EnumVal>
<EnumVal ord="32">N</EnumVal>
<EnumVal ord="33">Hz</EnumVal>
<EnumVal ord="34">Ix</EnumVal>
<EnumVal ord="35">Lm</EnumVal>
<EnumVal ord="36">Wb</EnumVal>
<EnumVal ord="37">T</EnumVal>
<EnumVal ord="38">W</EnumVal>
<EnumVal ord="39">Pa</EnumVal>
<EnumVal ord="4">s</EnumVal>
<EnumVal ord="41">mò</EnumVal>
<EnumVal ord="42">mó</EnumVal>
<EnumVal ord="43">m/s</EnumVal>
<EnumVal ord="44">m/sò</EnumVal>
<EnumVal ord="45">mó/s</EnumVal>
<EnumVal ord="46">m/mó</EnumVal>
<EnumVal ord="47">M</EnumVal>
<EnumVal ord="48">kg/mó</EnumVal>
<EnumVal ord="49">mò/s</EnumVal>
<EnumVal ord="5">A</EnumVal>
<EnumVal ord="50">W/m K</EnumVal>
<EnumVal ord="51">J/K</EnumVal>
<EnumVal ord="52">ppm</EnumVal>
<EnumVal ord="53">1/s</EnumVal>
<EnumVal ord="54">rad/s</EnumVal>
<EnumVal ord="6">K</EnumVal>
<EnumVal ord="61">VA</EnumVal>
<EnumVal ord="62">Watts</EnumVal>
<EnumVal ord="63">VAr</EnumVal>
<EnumVal ord="64">theta</EnumVal>
<EnumVal ord="65">cos(theta)</EnumVal>
<EnumVal ord="66">Vs</EnumVal>
<EnumVal ord="67">Vò</EnumVal>
<EnumVal ord="68">As</EnumVal>
<EnumVal ord="69">Aò</EnumVal>
<EnumVal ord="7">mol</EnumVal>
<EnumVal ord="70">Aòt</EnumVal>
<EnumVal ord="71">VAh</EnumVal>
<EnumVal ord="72">Wh</EnumVal>
<EnumVal ord="73">VArh</EnumVal>
<EnumVal ord="74">V/Hz</EnumVal>
<EnumVal ord="8">cd</EnumVal>
<EnumVal ord="9">deg</EnumVal>
</EnumType>
<EnumType id="Multiplier">
<EnumVal ord="-24">Yocto</EnumVal>
<EnumVal ord="-21">Zepto</EnumVal>
<EnumVal ord="-18">Atto</EnumVal>
<EnumVal ord="-15">Femto</EnumVal>
<EnumVal ord="-12">Pico</EnumVal>
<EnumVal ord="-9">Nano</EnumVal>
<EnumVal ord="-6">Micro</EnumVal>
<EnumVal ord="-3">Milli</EnumVal>
<EnumVal ord="-2">Centi</EnumVal>
<EnumVal ord="-1">Deci</EnumVal>
<EnumVal ord="0">zeroNoValue</EnumVal>
<EnumVal ord="1">Deca</EnumVal>
<EnumVal ord="2">Hecto</EnumVal>
<EnumVal ord="3">Kilo</EnumVal>
<EnumVal ord="6">Mega</EnumVal>
<EnumVal ord="9">Giga</EnumVal>
<EnumVal ord="12">Tera</EnumVal>
<EnumVal ord="15">Petra</EnumVal>
<EnumVal ord="18">Exa</EnumVal>
<EnumVal ord="21">Zetta</EnumVal>
<EnumVal ord="24">Yotta</EnumVal>
</EnumType>
<EnumType id="Range">
<EnumVal ord="0">normal</EnumVal>
<EnumVal ord="1">high</EnumVal>
<EnumVal ord="2">low</EnumVal>
<EnumVal ord="3">high-high</EnumVal>
<EnumVal ord="4">low-low</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<IED name="simpleIO">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling />
<GSEDir />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="GenericIO">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="SPCSO1">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="SPCSO2">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="SPCSO3">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="SPCSO4">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO" desc="Generic process I/O">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="AnIn1" type="MV_1_AnIn1" />
<DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_1_SPCSO1" />
<DO name="SPCSO2" type="SPC_1_SPCSO1" />
<DO name="SPCSO3" type="SPC_1_SPCSO1" />
<DO name="SPCSO4" type="SPC_1_SPCSO1" />
<DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" />
<DO name="Ind4" type="SPS_1_Proxy" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="MV_1_AnIn1" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" />
<IED name="Inverter3Ph">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication password="true" />
<LDevice inst="inverter">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="ZINV" lnType="ZINV1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="ACTyp">
<DAI name="setVal">
<Val>3</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXN" lnType="MMXN1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="ZINV1" lnClass="ZINV" desc="Inverter">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="WRtg" type="ASG_1_WRtg" />
<DO name="VarRtg" type="ASG_1_VarRtg" />
<DO name="GridModSt" type="ENS_1_Beh" />
<DO name="Stdby" type="SPS_1_Proxy" />
<DO name="CurLev" type="SPS_1_Proxy" />
<DO name="ACTyp" type="ENG_1_ACTyp" />
<DO name="OutWSet" type="ASG_1_VarRtg" />
<DO name="OutVarSet" type="ASG_1_VarRtg" />
<DO name="HeatSinkTmp" type="MV_1_HeatSinkTmp" />
</LNodeType>
<LNodeType id="MMXU1" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="TotVAr" type="MV_1_HeatSinkTmp" />
<DO name="TotVA" type="MV_1_HeatSinkTmp" />
<DO name="PhV" type="WYE_1_PhV" />
<DO name="A" type="WYE_1_PhV" />
<DO name="W" type="WYE_1_PhV" />
</LNodeType>
<LNodeType id="MMXN1" lnClass="MMXN" desc="Non phase related Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="Amp" type="MV_1_HeatSinkTmp" />
<DO name="Vol" type="MV_1_HeatSinkTmp" />
<DO name="Watt" type="MV_1_HeatSinkTmp" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="ENG_1_ACTyp" cdc="ENG">
<DA name="setVal" bType="INT32" fc="SP" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="ASG_1_VarRtg" cdc="ASG">
<DA name="setMag" type="AnalogueValue_1" bType="Struct" fc="SP" />
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ASG_1_WRtg" cdc="ASG" />
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="MV_1_HeatSinkTmp" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="CMV_1_phsA" cdc="CMV">
<DA name="cVal" type="Vector_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="WYE_1_PhV" cdc="WYE">
<SDO name="phsA" type="CMV_1_phsA" />
<SDO name="phsB" type="CMV_1_phsA" />
<SDO name="phsC" type="CMV_1_phsA" />
<SDO name="neut" type="CMV_1_phsA" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Vector_1">
<BDA name="mag" type="AnalogueValue_1" bType="Struct" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,270 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<IED name="ied1">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication password="true" />
<LDevice inst="Inverter">
<LN0 lnClass="LLN0" lnType="LLN02" inst="">
<DataSet name="dataset1" desc="">
<FCDA ldInst="Inverter" lnClass="LLN0" fc="ST" doName="Mod" daName="q" />
<FCDA ldInst="Inverter" lnClass="MMXU" fc="ST" lnInst="1" doName="Mod" daName="q" />
<FCDA ldInst="Inverter" lnClass="MMXU" fc="CF" lnInst="1" doName="Mod" daName="ctlModel" />
</DataSet>
<ReportControl name="rcb1" confRev="0" datSet="dataset1" rptID="ID" intgPd="0" bufTime="0">
<TrgOps dchg="true" qchg="true" />
<OptFields />
</ReportControl>
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD2" inst="1" prefix="" />
<LN lnClass="ZINV" lnType="ZINV3" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="NamPlt">
<DAI name="vendor">
<Val>MegaSolar</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="MMXU1" lnClass="MMXU">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="TotW" type="MV_1_Vol" />
<DO name="TotVAr" type="MV_1_Vol" />
<DO name="TotVA" type="MV_1_Vol" />
<DO name="Hz" type="MV_1_Vol" />
<DO name="PhV" type="WYE_1_PhV" />
<DO name="A" type="WYE_1_PhV" />
<DO name="W" type="WYE_1_W" />
</LNodeType>
<LNodeType id="LLN02" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD2" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="ZINV3" lnClass="ZINV">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="WRtg" type="ASG_1_WRtg" />
<DO name="VarRtg" type="ASG_1_WRtg" />
<DO name="ACTyp" type="ENG_1_ACTyp" />
<DO name="OutWSet" type="ASG_1_WRtg" />
<DO name="OutVarSet" type="ASG_1_WRtg" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="WYE_1_W" cdc="WYE">
<SDO name="phsA" type="CMV_1_phsA" />
<SDO name="phsB" type="CMV_1_phsA" />
<SDO name="phsC" type="CMV_1_phsA" />
</DOType>
<DOType id="CMV_1_phsA" cdc="CMV">
<DA name="cVal" type="Vector_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="WYE_1_PhV" cdc="WYE">
<SDO name="phsA" type="CMV_1_phsA" />
<SDO name="phsB" type="CMV_1_phsA" />
<SDO name="phsC" type="CMV_1_phsA" />
<SDO name="neut" type="CMV_1_phsA" />
</DOType>
<DOType id="MV_1_Vol" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="ASG_1_WRtg" cdc="ASG">
<DA name="setMag" type="AnalogueValue_1" bType="Struct" fc="SP" />
<DA name="units" type="Unit_1" bType="Struct" fc="CF" />
</DOType>
<DOType id="ENG_1_ACTyp" cdc="ENG">
<DA name="setVal" bType="INT32" fc="SP" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Vector_1">
<BDA name="mag" type="AnalogueValue_1" bType="Struct" />
</DAType>
<DAType id="Unit_1">
<BDA name="SIUnit" type="SIUnit" bType="Enum" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="SIUnit">
<EnumVal ord="1">
</EnumVal>
<EnumVal ord="10">rad</EnumVal>
<EnumVal ord="11">sr</EnumVal>
<EnumVal ord="2">m</EnumVal>
<EnumVal ord="21">Gy</EnumVal>
<EnumVal ord="22">q</EnumVal>
<EnumVal ord="23">ðC</EnumVal>
<EnumVal ord="24">Sv</EnumVal>
<EnumVal ord="25">F</EnumVal>
<EnumVal ord="26">C</EnumVal>
<EnumVal ord="27">S</EnumVal>
<EnumVal ord="28">H</EnumVal>
<EnumVal ord="29">V</EnumVal>
<EnumVal ord="3">kg</EnumVal>
<EnumVal ord="30">ohm</EnumVal>
<EnumVal ord="31">J</EnumVal>
<EnumVal ord="32">N</EnumVal>
<EnumVal ord="33">Hz</EnumVal>
<EnumVal ord="34">Ix</EnumVal>
<EnumVal ord="35">Lm</EnumVal>
<EnumVal ord="36">Wb</EnumVal>
<EnumVal ord="37">T</EnumVal>
<EnumVal ord="38">W</EnumVal>
<EnumVal ord="39">Pa</EnumVal>
<EnumVal ord="4">s</EnumVal>
<EnumVal ord="41">mò</EnumVal>
<EnumVal ord="42">mó</EnumVal>
<EnumVal ord="43">m/s</EnumVal>
<EnumVal ord="44">m/sò</EnumVal>
<EnumVal ord="45">mó/s</EnumVal>
<EnumVal ord="46">m/mó</EnumVal>
<EnumVal ord="47">M</EnumVal>
<EnumVal ord="48">kg/mó</EnumVal>
<EnumVal ord="49">mò/s</EnumVal>
<EnumVal ord="5">A</EnumVal>
<EnumVal ord="50">W/m K</EnumVal>
<EnumVal ord="51">J/K</EnumVal>
<EnumVal ord="52">ppm</EnumVal>
<EnumVal ord="53">1/s</EnumVal>
<EnumVal ord="54">rad/s</EnumVal>
<EnumVal ord="6">K</EnumVal>
<EnumVal ord="61">VA</EnumVal>
<EnumVal ord="62">Watts</EnumVal>
<EnumVal ord="63">VAr</EnumVal>
<EnumVal ord="64">theta</EnumVal>
<EnumVal ord="65">cos(theta)</EnumVal>
<EnumVal ord="66">Vs</EnumVal>
<EnumVal ord="67">Vò</EnumVal>
<EnumVal ord="68">As</EnumVal>
<EnumVal ord="69">Aò</EnumVal>
<EnumVal ord="7">mol</EnumVal>
<EnumVal ord="70">Aòt</EnumVal>
<EnumVal ord="71">VAh</EnumVal>
<EnumVal ord="72">Wh</EnumVal>
<EnumVal ord="73">VArh</EnumVal>
<EnumVal ord="74">V/Hz</EnumVal>
<EnumVal ord="8">cd</EnumVal>
<EnumVal ord="9">deg</EnumVal>
</EnumType>
<EnumType id="Multiplier">
<EnumVal ord="-24">Yocto</EnumVal>
<EnumVal ord="-21">Zepto</EnumVal>
<EnumVal ord="-18">Atto</EnumVal>
<EnumVal ord="-15">Femto</EnumVal>
<EnumVal ord="-12">Pico</EnumVal>
<EnumVal ord="-9">Nano</EnumVal>
<EnumVal ord="-6">Micro</EnumVal>
<EnumVal ord="-3">Milli</EnumVal>
<EnumVal ord="-2">Centi</EnumVal>
<EnumVal ord="-1">Deci</EnumVal>
<EnumVal ord="0">zeroNoValue</EnumVal>
<EnumVal ord="1">Deca</EnumVal>
<EnumVal ord="2">Hecto</EnumVal>
<EnumVal ord="3">Kilo</EnumVal>
<EnumVal ord="6">Mega</EnumVal>
<EnumVal ord="9">Giga</EnumVal>
<EnumVal ord="12">Tera</EnumVal>
<EnumVal ord="15">Petra</EnumVal>
<EnumVal ord="18">Exa</EnumVal>
<EnumVal ord="21">Zetta</EnumVal>
<EnumVal ord="24">Yotta</EnumVal>
</EnumType>
<EnumType id="Range">
<EnumVal ord="0">normal</EnumVal>
<EnumVal ord="1">high</EnumVal>
<EnumVal ord="2">low</EnumVal>
<EnumVal ord="3">high-high</EnumVal>
<EnumVal ord="4">low-low</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id=""/>
<IED name="SampleIED">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling />
<GSEDir />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="Device1">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="DGEN" lnType="DGEN1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="DSCH" lnType="DSCH1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU2" inst="2" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="MMXU2" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="TotW" type="MV_1_TotWh" />
</LNodeType>
<LNodeType id="DGEN1" lnClass="DGEN" desc="DER unit generator">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="OpTmh" type="INS_1_Beh" />
<DO name="GnOpSt" type="ENS_1_Beh" />
<DO name="OpTmsRs" type="INS_1_Beh" />
<DO name="TotWh" type="MV_1_TotWh" />
</LNodeType>
<LNodeType id="DSCH1" lnClass="DSCH" desc="DER energy and/or ancillary services schedule">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="SchdSt" type="INS_1_Beh" />
<DO name="SchdId" type="ING_1_SchdId" />
<DO name="SchdCat" type="ING_1_SchdId" />
<DO name="SchdTyp" type="ING_1_SchdId" />
<DO name="SchdAbsTm" type="SCA_1_SchdAbsTm" />
</LNodeType>
<LNodeType id="MMXU1" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="MV_1_TotWh" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SCA_1_SchdAbsTm" cdc="SCA">
<DA name="val" bType="FLOAT32" count="255" fc="SP" dchg="true" />
<DA name="time" bType="Timestamp" count="255" fc="SP" dchg="true" />
</DOType>
<DOType id="ING_1_SchdId" cdc="ING" />
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id=""/>
<IED name="SampleIED">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling />
<GSEDir />
<TimerActivatedControl />
</Services>
<AccessPoint>
<Server>
<Authentication />
<LDevice inst="Device1">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="DGEN" lnType="DGEN1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="DSCH" lnType="DSCH1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU2" inst="2" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="MMXU2" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="TotW" type="MV_1_TotWh" />
</LNodeType>
<LNodeType id="DGEN1" lnClass="DGEN" desc="DER unit generator">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="OpTmh" type="INS_1_Beh" />
<DO name="GnOpSt" type="ENS_1_Beh" />
<DO name="OpTmsRs" type="INS_1_Beh" />
<DO name="TotWh" type="MV_1_TotWh" />
</LNodeType>
<LNodeType id="DSCH1" lnClass="DSCH" desc="DER energy and/or ancillary services schedule">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="SchdSt" type="INS_1_Beh" />
<DO name="SchdId" type="ING_1_SchdId" />
<DO name="SchdCat" type="ING_1_SchdId" />
<DO name="SchdTyp" type="ING_1_SchdId" />
<DO name="SchdAbsTm" type="SCA_1_SchdAbsTm" />
</LNodeType>
<LNodeType id="MMXU1" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="MV_1_TotWh" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SCA_1_SchdAbsTm" cdc="SCA">
<DA name="val" bType="FLOAT32" count="255" fc="SP" dchg="true" />
<DA name="time" bType="Timestamp" count="255" fc="SP" dchg="true" />
</DOType>
<DOType id="ING_1_SchdId" cdc="ING" />
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,208 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id=""/>
<Communication>
<SubNetwork name="SubNetworkName">
<ConnectedAP apName="accessPoint1" iedName="SampleIED">
<Address>
<P type="OSI-AP-Title">1,1,9999,1</P>
<P type="OSI-AE-Qualifier">12</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
<P type="OSI-TSEL">0001</P>
<P type="IP">127.0.0.1</P>
</Address>
<GSE ldInst="Device1" cbName="gcbDataset1">
<Address>
<P type="VLAN-ID">111</P>
<P type="VLAN-PRIORITY">4</P>
<P type="MAC-Address">01-0c-cd-01-00-01</P>
<P type="APPID">1000</P>
</Address>
</GSE>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="SampleIED">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling />
<GSEDir />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="Device1">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DataSet name="dataset1" desc="">
<FCDA ldInst="Device1" lnClass="LLN0" fc="ST" doName="Mod" daName="q" />
<FCDA ldInst="Device1" lnClass="MMXU" fc="ST" lnInst="1" doName="Mod" daName="q" />
<FCDA ldInst="Device1" lnClass="MMXU" fc="CF" lnInst="1" doName="Mod" daName="ctlModel" />
</DataSet>
<ReportControl name="LLN0_Events_BuffRep" rptID="LLN0$RP$brcbEV1" datSet="dataset1" confRev="1" buffered="true"
desc="Events brcb buffered report" intgPd="900000" bufTime="50">
<TrgOps dchg="true" qchg="false" dupd="false" period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" dataRef="false" entryID="true"
configRef="true" bufOvfl="true" />
<RptEnabled max="1" />
</ReportControl>
<GSEControl appID="dataset1" name="gcbDataset1" type="GOOSE" datSet="dataset1" confRev="1"/>
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="DGEN" lnType="DGEN1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="DSCH" lnType="DSCH1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU2" inst="2" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="MMXU2" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="TotW" type="MV_1_TotWh" />
</LNodeType>
<LNodeType id="DGEN1" lnClass="DGEN" desc="DER unit generator">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="OpTmh" type="INS_1_Beh" />
<DO name="GnOpSt" type="ENS_1_Beh" />
<DO name="OpTmsRs" type="INS_1_Beh" />
<DO name="TotWh" type="MV_1_TotWh" />
</LNodeType>
<LNodeType id="DSCH1" lnClass="DSCH" desc="DER energy and/or ancillary services schedule">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="SchdSt" type="INS_1_Beh" />
<DO name="SchdId" type="ING_1_SchdId" />
<DO name="SchdCat" type="ING_1_SchdId" />
<DO name="SchdTyp" type="ING_1_SchdId" />
<DO name="SchdAbsTm" type="SCA_1_SchdAbsTm" />
</LNodeType>
<LNodeType id="MMXU1" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="MV_1_TotWh" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SCA_1_SchdAbsTm" cdc="SCA">
<DA name="val" bType="FLOAT32" count="255" fc="SP" dchg="true" />
<DA name="time" bType="Timestamp" count="255" fc="SP" dchg="true" />
</DOType>
<DOType id="ING_1_SchdId" cdc="ING" />
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,332 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" version="1.0.0" revision="" toolID="" nameStructure="IEDName">
</Header>
<Communication>
<SubNetwork name="subnetwork1" type="8-MMS">
<ConnectedAP iedName="simpleIO" apName="accessPoint1">
<Address>
<P type="IP">0.0.0.0</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">10.0.0.1</P>
<P type="OSI-TSEL">0001</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
</Address>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="simpleIO">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<FileHandling />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="GenericIO">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DataSet name="ControlEvents" desc="control related events">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO5" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO6" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO7" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO8" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO9" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="stSeld" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="OR" lnInst="1" doName="SPCSO2" daName="opRcvd" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="OR" lnInst="1" doName="SPCSO2" daName="opOk" />
</DataSet>
<ReportControl name="ControlEventsRCB" confRev="1" datSet="ControlEvents" rptID="ControlEvents" buffered="false" intgPd="1000" bufTime="0" indexed="true">
<TrgOps dchg="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="2" />
</ReportControl>
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="SPCSO1">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO2">
<DAI name="ctlModel">
<Val>sbo-with-normal-security</Val>
</DAI>
<DAI name="sboTimeout">
<Val>2000</Val>
</DAI>
</DOI>
<DOI name="SPCSO3">
<DAI name="ctlModel">
<Val>direct-with-enhanced-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO4">
<DAI name="ctlModel">
<Val>sbo-with-enhanced-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO5">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO6">
<DAI name="ctlModel">
<Val>sbo-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO7">
<DAI name="ctlModel">
<Val>direct-with-enhanced-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO8">
<DAI name="ctlModel">
<Val>sbo-with-enhanced-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO9">
<DAI name="ctlModel">
<Val>direct-with-enhanced-security</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="AnIn1" type="MV_1_AnIn1" />
<DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_1_SPCSO1" />
<DO name="SPCSO2" type="SPC_1_SPCSO2" />
<DO name="SPCSO3" type="SPC_1_SPCSO3" />
<DO name="SPCSO4" type="SPC_1_SPCSO4" />
<DO name="SPCSO5" type="SPC_1_SPCSO5" />
<DO name="SPCSO6" type="SPC_1_SPCSO6" />
<DO name="SPCSO7" type="SPC_1_SPCSO7" />
<DO name="SPCSO8" type="SPC_1_SPCSO8" />
<DO name="SPCSO9" type="SPC_1_SPCSO3" />
<DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" />
<DO name="Ind4" type="SPS_1_Proxy" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="SPC_1_SPCSO8" cdc="SPC">
<DA name="SBOw" type="SPCOperate_5" bType="Struct" fc="CO" />
<DA name="Oper" type="SPCOperate_5" bType="Struct" fc="CO" />
<DA name="Cancel" type="SPCCancel_5" bType="Struct" fc="CO" />
<DA name="origin" type="Originator_1" bType="Struct" fc="ST" />
<DA name="ctlNum" bType="INT8U" fc="ST" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="SPC_1_SPCSO7" cdc="SPC">
<DA name="Oper" type="SPCOperate_5" bType="Struct" fc="CO" />
<DA name="Cancel" type="SPCCancel_5" bType="Struct" fc="CO" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="SPC_1_SPCSO3" cdc="SPC">
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="Cancel" type="SPCCancel_1" bType="Struct" fc="CO" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="MV_1_AnIn1" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SPC_1_SPCSO6" cdc="SPC">
<DA name="SBO" bType="VisString64" fc="CO" />
<DA name="Oper" type="SPCOperate_5" bType="Struct" fc="CO" />
<DA name="Cancel" type="SPCCancel_5" bType="Struct" fc="CO" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="SPC_1_SPCSO5" cdc="SPC">
<DA name="Oper" type="SPCOperate_5" bType="Struct" fc="CO" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="Cancel" type="SPCCancel_1" bType="Struct" fc="CO" />
</DOType>
<DOType id="SPC_1_SPCSO4" cdc="SPC">
<DA name="SBOw" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="Cancel" type="SPCCancel_1" bType="Struct" fc="CO" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPC_1_SPCSO2" cdc="SPC">
<DA name="SBO" bType="VisString64" fc="CO" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="Cancel" type="SPCCancel_1" bType="Struct" fc="CO" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA bType="BOOLEAN" dchg="true" fc="ST" name="stSeld"/>
<DA name="opRcvd" bType="BOOLEAN" fc="OR" dchg="true" />
<DA name="opOk" bType="BOOLEAN" fc="OR" dchg="true" />
<DA name="tOpOk" bType="Timestamp" fc="OR" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA bType="INT32U" fc="CF" name="sboTimeout" dchg="true" />
<DA name="sboClass" type="SboClasses" bType="Enum" fc="CF" />
</DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DAType id="SPCOperate_1">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
<BDA name="Check" bType="Check" />
</DAType>
<DAType id="Originator_1">
<BDA name="orCat" type="OrCat" bType="Enum" />
<BDA name="orIdent" bType="Octet64" />
</DAType>
<DAType id="SPCOperate_5">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="operTm" bType="Timestamp" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
<BDA name="Check" bType="Check" />
</DAType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="SPCCancel_1">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
</DAType>
<DAType id="SPCCancel_5">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="operTm" bType="Timestamp" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="SboClasses">
<EnumVal ord="0">operate-once</EnumVal>
<EnumVal ord="1">operate-many</EnumVal>
</EnumType>
<EnumType id="OrCat">
<EnumVal ord="0">not-supported</EnumVal>
<EnumVal ord="1">bay-control</EnumVal>
<EnumVal ord="2">station-control</EnumVal>
<EnumVal ord="3">remote-control</EnumVal>
<EnumVal ord="4">automatic-bay</EnumVal>
<EnumVal ord="5">automatic-station</EnumVal>
<EnumVal ord="6">automatic-remote</EnumVal>
<EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,279 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" nameStructure="IEDName">
</Header>
<Communication>
<SubNetwork name="subnetwork1" type="8-MMS">
<ConnectedAP iedName="simpleIO" apName="accessPoint1">
<Address>
<P type="IP">10.0.0.2</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">10.0.0.1</P>
<P type="OSI-TSEL">0001</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
</Address>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="simpleIO">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling />
<GSEDir />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="GenericIO">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DataSet name="Events" desc="Events">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" daName="stVal" />
</DataSet>
<DataSet name="Events2" desc="Events2">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" />
</DataSet>
<DataSet name="Measurements" desc="Measurements">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="q" />
</DataSet>
<ReportControl name="EventsRCB" confRev="4294967295" datSet="Events" rptID="Events1" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<ReportControl name="EventsIndexed" indexed="true" confRev="1" datSet="Events" rptID="Events2" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="3" />
</ReportControl>
<ReportControl name="Measurements" indexed="true" confRev="1" datSet="Measurements" rptID="Measurements" buffered="true" intgPd="1000" bufTime="50">
<TrgOps period="false" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="3" />
</ReportControl>
<LogControl name="EventLog" datSet="Events" logName="EventLog">
<TrgOps dchg="true" qchg="true"/>
</LogControl>
<LogControl name="GeneralLog" logName="">
<TrgOps dchg="true" qchg="true"/>
</LogControl>
<Log />
<Log name="EventLog" />
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="NamPlt">
<DAI name="vendor">
<Val>MZ Automation</Val>
</DAI>
<DAI name="swRev">
<Val>0.7.3</Val>
</DAI>
<DAI name="d">
<Val>libiec61850 server example</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="SPCSO1">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO2">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO3">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO4">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO">
<DO name="Mod" type="INC_2_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="AnIn1" type="MV_1_AnIn1" />
<DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_2_SPCSO1" />
<DO name="SPCSO2" type="SPC_1_SPCSO2" />
<DO name="SPCSO3" type="SPC_1_SPCSO3" />
<DO name="SPCSO4" type="SPC_1_SPCSO1" />
<DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" />
<DO name="Ind4" type="SPS_1_Proxy" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="MV_1_AnIn1" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="INC_2_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="SPC_2_SPCSO1" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="SPC_1_SPCSO2" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="SPC_1_SPCSO3" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Originator_1">
<BDA name="orCat" type="OrCat" bType="Enum" />
<BDA name="orIdent" bType="Octet64" />
</DAType>
<DAType id="SPCOperate_1">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
<BDA name="Check" bType="Check" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="OrCat">
<EnumVal ord="0">not-supported</EnumVal>
<EnumVal ord="1">bay-control</EnumVal>
<EnumVal ord="2">station-control</EnumVal>
<EnumVal ord="3">remote-control</EnumVal>
<EnumVal ord="4">automatic-bay</EnumVal>
<EnumVal ord="5">automatic-station</EnumVal>
<EnumVal ord="6">automatic-remote</EnumVal>
<EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,307 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" nameStructure="IEDName">
</Header>
<IED name="TEMPLATE">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling />
<GSEDir />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="GenericIO">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DataSet name="Events" desc="Events">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" daName="stVal" />
</DataSet>
<DataSet name="Events2" desc="Events2">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" />
</DataSet>
<DataSet name="Measurements" desc="Measurements">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="q" />
</DataSet>
<ReportControl name="EventsRCB" confRev="4294967295" datSet="Events" rptID="Events1" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<ReportControl name="EventsIndexed" indexed="true" confRev="1" datSet="Events" rptID="Events2" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="3" />
</ReportControl>
<ReportControl name="Measurements" indexed="true" confRev="1" datSet="Measurements" rptID="Measurements" buffered="true" intgPd="1000" bufTime="50">
<TrgOps period="false" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="3" />
</ReportControl>
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
</DAI>
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="Beh">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
<DOI name="Health">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
<DOI name="NamPlt">
<DAI name="vendor">
<Val>MZ Automation</Val>
</DAI>
<DAI name="swRev">
<Val>1.3.0</Val>
</DAI>
<DAI name="d">
<Val>libiec61850 server example</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="">
<DOI name="PhyHealth">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
</DAI>
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="Beh">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
<DOI name="Health">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
<DOI name="SPCSO1">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO2">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO3">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO4">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_2_Health" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="ENS_2_Health" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_2_Health" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="AnIn1" type="MV_1_AnIn1" />
<DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_1_SPCSO1" />
<DO name="SPCSO2" type="SPC_2" />
<DO name="SPCSO3" type="SPC_2" />
<DO name="SPCSO4" type="SPC_2" />
<DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" />
<DO name="Ind4" type="SPS_1_Proxy" />
</LNodeType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="stVal" bType="Enum" type="Beh" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="Enum" type="Beh" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="ENS_2_Health" cdc="ENS">
<DA name="stVal" bType="Enum" type="HealthKind" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="MV_1_AnIn1" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="origin" fc="ST" type="Originator_1" bType="Struct" />
<DA name="ctlNum" fc="ST" bType="INT8U" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
</DOType>
<DOType id="SPC_2" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Originator_1">
<BDA name="orCat" type="OrCat" bType="Enum" />
<BDA name="orIdent" bType="Octet64" />
</DAType>
<DAType id="SPCOperate_1">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
<BDA name="Check" bType="Check" />
</DAType>
<EnumType id="Beh">
<EnumVal ord="1">on</EnumVal>
<EnumVal ord="2">blocked</EnumVal>
<EnumVal ord="3">test</EnumVal>
<EnumVal ord="4">test/blocked</EnumVal>
<EnumVal ord="5">off</EnumVal>
</EnumType>
<EnumType id="HealthKind">
<EnumVal ord="1">ok</EnumVal>
<EnumVal ord="2">warning</EnumVal>
<EnumVal ord="3">alarm</EnumVal>
</EnumType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="OrCat">
<EnumVal ord="0">not-supported</EnumVal>
<EnumVal ord="1">bay-control</EnumVal>
<EnumVal ord="2">station-control</EnumVal>
<EnumVal ord="3">remote-control</EnumVal>
<EnumVal ord="4">automatic-bay</EnumVal>
<EnumVal ord="5">automatic-station</EnumVal>
<EnumVal ord="6">automatic-remote</EnumVal>
<EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,275 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" nameStructure="IEDName">
</Header>
<Communication>
<SubNetwork name="subnetwork1" type="8-MMS">
<ConnectedAP iedName="simpleIO" apName="accessPoint1">
<Address>
<P type="IP">10.0.0.2</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">10.0.0.1</P>
<P type="OSI-TSEL">0001</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
</Address>
<GSE ldInst="GenericIO" cbName="gcbEvents">
<Address>
<P type="VLAN-ID">1</P>
<P type="VLAN-PRIORITY">4</P>
<P type="MAC-Address">01-0c-cd-01-00-01</P>
<P type="APPID">1000</P>
</Address>
<MinTime>1000</MinTime>
<MaxTime>3000</MaxTime>
</GSE>
<GSE ldInst="GenericIO" cbName="gcbAnalogValues">
<Address>
<P type="VLAN-ID">1</P>
<P type="VLAN-PRIORITY">4</P>
<P type="MAC-Address">01-0c-cd-01-00-01</P>
<P type="APPID">1000</P>
</Address>
</GSE>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="simpleIO">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling />
<GSEDir />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="GenericIO">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DataSet name="Events" desc="Events">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" daName="stVal" />
</DataSet>
<DataSet name="Events2" desc="Events2">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" />
</DataSet>
<DataSet name="Events3" desc="Events3">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" daName="q" />
</DataSet>
<DataSet name="AnalogValues" desc="analog values">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" />
</DataSet>
<ReportControl name="EventsRCB" confRev="1" datSet="Events" rptID="Events" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<ReportControl name="AnalogValuesRCB" confRev="1" datSet="AnalogValues" rptID="AnalogValues" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<GSEControl appID="events" name="gcbEvents" type="GOOSE" datSet="Events3" confRev="2" />
<GSEControl appID="analog" name="gcbAnalogValues" type="GOOSE" datSet="AnalogValues" confRev="2"/>
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="SPCSO1">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO2">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO3">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO4">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO">
<DO name="Mod" type="INC_2_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="AnIn1" type="MV_1_AnIn1" />
<DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_2_SPCSO1" />
<DO name="SPCSO2" type="SPC_1_SPCSO2" />
<DO name="SPCSO3" type="SPC_1_SPCSO3" />
<DO name="SPCSO4" type="SPC_1_SPCSO1" />
<DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" />
<DO name="Ind4" type="SPS_1_Proxy" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="MV_1_AnIn1" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="INC_2_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="SPC_2_SPCSO1" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="SPC_1_SPCSO2" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="SPC_1_SPCSO3" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Originator_1">
<BDA name="orCat" type="OrCat" bType="Enum" />
<BDA name="orIdent" bType="Octet64" />
</DAType>
<DAType id="SPCOperate_1">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
<BDA name="Check" bType="Check" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="OrCat">
<EnumVal ord="0">not-supported</EnumVal>
<EnumVal ord="1">bay-control</EnumVal>
<EnumVal ord="2">station-control</EnumVal>
<EnumVal ord="3">remote-control</EnumVal>
<EnumVal ord="4">automatic-bay</EnumVal>
<EnumVal ord="5">automatic-station</EnumVal>
<EnumVal ord="6">automatic-remote</EnumVal>
<EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,252 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" nameStructure="IEDName">
</Header>
<Communication>
<SubNetwork name="subnetwork1" type="8-MMS">
<Text>Station bus</Text>
<BitRate unit="b/s">10</BitRate>
<ConnectedAP iedName="simpleIO" apName="accessPoint1">
<Address>
<P type="IP">10.0.0.2</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">10.0.0.1</P>
<P type="OSI-TSEL">0001</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
</Address>
<GSE ldInst="GenericIO" cbName="gcbEvents">
<Address>
<P type="VLAN-ID">111</P>
<P type="VLAN-PRIORITY">4</P>
<P type="MAC-Address">01-0c-cd-01-00-01</P>
<P type="APPID">1000</P>
</Address>
</GSE>
<GSE ldInst="GenericIO" cbName="gcbAnalogValues">
<Address>
<P type="VLAN-ID">111</P>
<P type="VLAN-PRIORITY">4</P>
<P type="MAC-Address">01-0c-cd-01-00-02</P>
<P type="APPID">1000</P>
</Address>
</GSE>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="simpleIO">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling />
<GSEDir />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="GenericIO">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DataSet name="Events" desc="Events">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" daName="stVal" />
</DataSet>
<DataSet name="AnalogValues" desc="analog values">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" />
</DataSet>
<ReportControl name="EventsRCB" confRev="1" datSet="Events" rptID="Events" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<ReportControl name="AnalogValuesRCB" confRev="1" datSet="AnalogValues" rptID="AnalogValues" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<GSEControl appID="events" name="gcbEvents" type="GOOSE" datSet="Events" confRev="1"/>
<GSEControl appID="analog" name="gcbAnalogValues" type="GOOSE" datSet="AnalogValues" confRev="1"/>
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="SPCSO1">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO2">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO3">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO4">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO">
<DO name="Mod" type="INC_2_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="AnIn1" type="MV_1_AnIn1" />
<DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_2_SPCSO1" />
<DO name="SPCSO2" type="SPC_1_SPCSO2" />
<DO name="SPCSO3" type="SPC_1_SPCSO3" />
<DO name="SPCSO4" type="SPC_1_SPCSO1" />
<DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" />
<DO name="Ind4" type="SPS_1_Proxy" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="MV_1_AnIn1" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="INC_2_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="SPC_2_SPCSO1" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="SPC_1_SPCSO2" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="SPC_1_SPCSO3" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Originator_1">
<BDA name="orCat" type="OrCat" bType="Enum" />
<BDA name="orIdent" bType="Octet64" />
</DAType>
<DAType id="SPCOperate_1">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
<BDA name="Check" bType="Check" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="OrCat">
<EnumVal ord="0">not-supported</EnumVal>
<EnumVal ord="1">bay-control</EnumVal>
<EnumVal ord="2">station-control</EnumVal>
<EnumVal ord="3">remote-control</EnumVal>
<EnumVal ord="4">automatic-bay</EnumVal>
<EnumVal ord="5">automatic-station</EnumVal>
<EnumVal ord="6">automatic-remote</EnumVal>
<EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,655 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.iec.ch/61850/2003/SCL" xsi:schemaLocation="http://www.iec.ch/61850/2003/SCL SCL.xsd" version="2007" revision="B">
<Header id="" nameStructure="IEDName">
</Header>
<Communication>
<SubNetwork name="subnetwork1" type="8-MMS">
<Text>Station bus</Text>
<BitRate unit="b/s">10</BitRate>
<ConnectedAP iedName="simpleIO" apName="accessPoint1">
<Address>
<P type="IP">0.0.0.0</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">192.168.2.1</P>
<P type="OSI-AP-Title">1,3,9999,33</P>
<P type="OSI-AE-Qualifier">33</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
<P type="OSI-TSEL">0001</P>
<P type="MMS-Port">102</P>
</Address>
<GSE ldInst="GenericIO" cbName="gcbEvents">
<Address>
<P type="VLAN-ID">1</P>
<P type="VLAN-PRIORITY">4</P>
<P type="MAC-Address">01-0c-cd-01-00-01</P>
<P type="APPID">1000</P>
</Address>
<MinTime>1000</MinTime>
<MaxTime>3000</MaxTime>
</GSE>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="simpleIO">
<Services>
<DynAssociation/>
<GetDirectory/>
<GetDataObjectDefinition/>
<GetDataSetValue/>
<DataSetDirectory/>
<ReadWrite/>
<GetCBValues/>
<ConfLNs fixPrefix="true" fixLnInst="true"/>
<GOOSE max="5"/>
<GSSE max="5"/>
<FileHandling/>
<GSEDir/>
<TimerActivatedControl/>
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication/>
<LDevice inst="GenericIO">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DataSet name="Events" desc="Events">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" daName="stVal"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="stVal"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" daName="stVal"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" daName="stVal"/>
</DataSet>
<DataSet name="Events2" desc="Events2">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4"/>
</DataSet>
<DataSet name="Measurements" desc="Measurements">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="mag.f"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="q"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="mag.f"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="q"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="mag.f"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="q"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="mag.f"/>
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="q"/>
</DataSet>
<DataSet name="ServiceTracking">
<FCDA doName="SpcTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="DpcTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="IncTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="BscTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="UrcbTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="BrcbTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="GocbTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="SgcbTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="LocbTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
</DataSet>
<ReportControl name="EventsRCB" confRev="1" datSet="Events2" rptID="Events1" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true"/>
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true"/>
<RptEnabled max="1"/>
</ReportControl>
<ReportControl name="EventsIndexed" indexed="true" confRev="1" datSet="Events" rptID="Events2" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true"/>
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true"/>
<RptEnabled max="3"/>
</ReportControl>
<ReportControl name="Measurements" indexed="true" confRev="1" datSet="Measurements" rptID="Measurements" buffered="true" intgPd="1000" bufTime="50">
<TrgOps period="false"/>
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true"/>
<RptEnabled max="3"/>
</ReportControl>
<ReportControl buffered="true" confRev="1" datSet="ServiceTracking" name="brcbServiceTracking" rptID="ServiceTracking">
<TrgOps dchg="true" qchg="true"/>
<OptFields configRef="true" entryID="true" reasonCode="true"/>
<RptEnabled max="3"/>
</ReportControl>
<LogControl name="EventLog" datSet="Events" logName="EventLog" logEna="true">
<TrgOps dchg="true" qchg="true" />
</LogControl>
<LogControl name="GeneralLog" datSet="" logName="">
<TrgOps dchg="true" qchg="true" />
</LogControl>
<Log />
<Log name="EventLog" />
<GSEControl appID="events" name="gcbEvents" type="GOOSE" datSet="Events" confRev="3" />
<SettingControl desc="parameter set" numOfSGs="5" actSG="1" />
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
</DAI>
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="Beh">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
<DOI name="Health">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
<DOI name="NamPlt">
<DAI name="vendor">
<Val>MZ Automation</Val>
</DAI>
<DAI name="swRev">
<Val>1.3.0</Val>
</DAI>
<DAI name="d">
<Val>libiec61850 server example</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="">
<DOI name="PhyHealth">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
</DAI>
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="Beh">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
<DOI name="Health">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
<DOI name="SPCSO1">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO2">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO3">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO4">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
</LN>
<LN desc="example for setting groups" inst="1" lnClass="PTOC" lnType="PTOC1"/>
<LN desc="Service Tracking Information" inst="1" lnClass="LTRK" lnType="myLTRK"/>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="ENC_1_Mod"/>
<DO name="Beh" type="ENS_1_Beh"/>
<DO name="Health" type="ENS_2_Health"/>
<DO name="NamPlt" type="LPL_1_NamPlt"/>
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam"/>
<DO name="PhyHealth" type="ENS_2_Health"/>
<DO name="Proxy" type="SPS_1_Proxy"/>
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO">
<DO name="Mod" type="ENC_1_Mod"/>
<DO name="Beh" type="ENS_1_Beh"/>
<DO name="Health" type="ENS_2_Health"/>
<DO name="NamPlt" type="LPL_2_NamPlt"/>
<DO name="AnIn1" type="MV_1_AnIn1"/>
<DO name="AnIn2" type="MV_1_AnIn1"/>
<DO name="AnIn3" type="MV_1_AnIn1"/>
<DO name="AnIn4" type="MV_1_AnIn1"/>
<DO name="SPCSO1" type="SPC_1_SPCSO1"/>
<DO name="SPCSO2" type="SPC_2"/>
<DO name="SPCSO3" type="SPC_2"/>
<DO name="SPCSO4" type="SPC_2"/>
<DO name="Ind1" type="SPS_1_Proxy"/>
<DO name="Ind2" type="SPS_1_Proxy"/>
<DO name="Ind3" type="SPS_1_Proxy"/>
<DO name="Ind4" type="SPS_1_Proxy"/>
</LNodeType>
<LNodeType id="PTOC1" lnClass="PTOC">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Str" type="ACD_Str" />
<DO name="Op" type="ACT_Op" />
<DO name="StrVal" type="ASG_SE" />
<DO name="OpDlTmms" type="ING_SE" />
<DO name="RsDlTmms" type="ING_SE" />
<DO name="RstTms" type="ING_SE"/>
</LNodeType>
<LNodeType id="myLTRK" lnClass="LTRK">
<DO name="Beh" type="myENS_Beh" desc=""/>
<DO name="SpcTrk" type="myCTS_Bool" desc=""/>
<DO name="DpcTrk" type="myCTS_Bool" desc=""/>
<DO name="IncTrk" type="myCTS_Int32" desc=""/>
<DO name="BscTrk" type="myCTS_BSC" desc=""/>
<DO name="UrcbTrk" type="myUTS" desc=""/>
<DO name="BrcbTrk" type="myBTS" desc=""/>
<DO name="GocbTrk" type="myGTS" desc=""/>
<DO name="SgcbTrk" type="mySTS" desc=""/>
<DO name="LocbTrk" type="myLTS" desc=""/>
</LNodeType>
<DOType cdc="ACD" id="ACD_Str">
<DA bType="BOOLEAN" dchg="true" fc="ST" name="general" />
<DA bType="Enum" dchg="true" fc="ST" name="dirGeneral" type="dirGeneral" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
</DOType>
<DOType cdc="ACT" id="ACT_Op">
<DA bType="BOOLEAN" dchg="true" fc="ST" name="general"/>
<DA bType="Quality" fc="ST" name="q" qchg="true"/>
<DA bType="Timestamp" fc="ST" name="t"/>
</DOType>
<DOType cdc="ASG" id="ASG_SE">
<DA bType="Struct" fc="SE" name="setMag" type="AnalogueValue_1"/>
</DOType>
<DOType id="ING_SE" cdc="ING">
<DA name="setVal" bType="INT32" fc="SE" dchg="true" />
</DOType>
<DOType id="myCTS_Bool" cdc="CTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="ctlVal" bType="BOOLEAN" fc="SR" desc=""/>
<!-- <DA name="operTm" bType="Timestamp" fc="SR" desc=""/> -->
<DA name="origin" bType="Struct" type="Originator_1" fc="SR" desc=""/>
<DA name="ctlNum" bType="INT8U" fc="SR" desc=""/>
<DA name="T" bType="Timestamp" fc="SR" desc=""/>
<DA name="Test" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="Check" bType="Check" fc="SR" desc=""/>
<DA name="respAddCause" bType="Enum" type="AddCause" fc="SR" desc=""/>
</DOType>
<DOType id="myCTS_Int32" cdc="CTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="ctlVal" bType="INT32" fc="SR" desc="TINT32 control value"/>
<!-- <DA name="operTm" bType="Timestamp" fc="SR" desc=""/> -->
<DA name="origin" bType="Struct" type="Originator_1" fc="SR" desc=""/>
<DA name="ctlNum" bType="INT8U" fc="SR" desc=""/>
<DA name="T" bType="Timestamp" fc="SR" desc=""/>
<DA name="Test" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="Check" bType="Check" fc="SR" desc=""/>
<DA name="respAddCause" bType="Enum" type="AddCause" fc="SR" desc=""/>
</DOType>
<DOType id="myCTS_BSC" cdc="CTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="ctlVal" bType="Tcmd" fc="SR" desc=""/>
<!-- <DA name="operTm" bType="Timestamp" fc="SR" desc=""/> -->
<DA name="origin" bType="Struct" type="Originator_1" fc="SR" desc=""/>
<DA name="ctlNum" bType="INT8U" fc="SR" desc=""/>
<DA name="T" bType="Timestamp" fc="SR" desc=""/>
<DA name="Test" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="Check" bType="Check" fc="SR" desc=""/>
<DA name="respAddCause" bType="Enum" type="AddCause" fc="SR" desc=""/>
</DOType>
<DOType id="myUTS" cdc="UTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="rptID" bType="VisString129" fc="SR" desc=""/>
<DA name="rptEna" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="resv" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="datSet" bType="ObjRef" fc="SR" desc=""/>
<DA name="confRev" bType="INT32U" fc="SR" desc=""/>
<DA name="optFlds" bType="OptFlds" fc="SR" desc=""/>
<DA name="bufTm" bType="INT32U" fc="SR" desc=""/>
<DA name="sqNum" bType="INT8U" fc="SR" desc=""/>
<DA name="trgOps" bType="TrgOps" fc="SR" desc=""/>
<DA name="intgPd" bType="INT32U" fc="SR" desc=""/>
<DA name="gi" bType="BOOLEAN" fc="SR" desc=""/>
</DOType>
<DOType id="myBTS" cdc="BTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="rptID" bType="VisString129" fc="SR" desc=""/>
<DA name="rptEna" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="datSet" bType="ObjRef" fc="SR" desc=""/>
<DA name="confRev" bType="INT32U" fc="SR" desc=""/>
<DA name="optFlds" bType="OptFlds" fc="SR" desc=""/>
<DA name="bufTm" bType="INT32U" fc="SR" desc=""/>
<DA name="sqNum" bType="INT16U" fc="SR" desc=""/>
<DA name="trgOps" bType="TrgOps" fc="SR" desc=""/>
<DA name="intgPd" bType="INT32U" fc="SR" desc=""/>
<DA name="gi" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="purgeBuf" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="entryID" bType="EntryID" fc="SR" desc=""/>
<DA name="timeOfEntry" bType="EntryTime" fc="SR" desc=""/>
<DA name="resvTms" bType="INT16" fc="SR" desc=""/>
</DOType>
<DOType id="myGTS" cdc="GTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="goEna" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="goID" bType="VisString129" fc="SR" desc=""/>
<DA name="datSet" bType="ObjRef" fc="SR" desc=""/>
<DA name="confRev" bType="INT32U" fc="SR" desc=""/>
<DA name="ndsCom" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="dstAddress" bType="PhyComAddr" fc="SR" desc=""/>
</DOType>
<DOType id="mySTS" cdc="STS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="numOfSG" bType="INT8U" fc="SR" desc=""/>
<DA name="actSG" bType="INT8U" fc="SR" desc=""/>
<DA name="editSG" bType="INT8U" fc="SR" desc=""/>
<DA name="cnfEdit" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="lActTm" bType="Timestamp" fc="SR" desc=""/>
<DA name="resvTms" bType="INT16U" fc="SR" desc=""/>
</DOType>
<DOType id="myLTS" cdc="LTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="logEna" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="datSet" bType="ObjRef" fc="SR" desc=""/>
<DA name="bufTm" bType="INT32U" fc="SR" desc=""/>
<DA name="trgOps" bType="TrgOps" fc="SR" desc=""/>
<DA name="intgPd" bType="INT32U" fc="SR" desc=""/>
<DA name="logRef" bType="ObjRef" fc="SR" desc=""/>
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="stVal" bType="Enum" type="Beh" fc="ST" dchg="true"/>
<DA name="q" bType="Quality" fc="ST" qchg="true"/>
<DA name="t" bType="Timestamp" fc="ST"/>
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF"/>
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="Enum" type="Beh" fc="ST" dchg="true"/>
<DA name="q" bType="Quality" fc="ST" qchg="true"/>
<DA name="t" bType="Timestamp" fc="ST"/>
</DOType>
<DOType id="myENS_Beh" cdc="INS">
<DA name="stVal" bType="Enum" type="Beh" dchg="true" fc="ST"/>
<DA name="q" bType="Quality" qchg="true" fc="ST"/>
<DA name="t" bType="Timestamp" fc="ST"/>
</DOType>
<DOType id="ENS_2_Health" cdc="ENS">
<DA name="stVal" bType="Enum" type="HealthKind" fc="ST" dchg="true"/>
<DA name="q" bType="Quality" fc="ST" qchg="true"/>
<DA name="t" bType="Timestamp" fc="ST"/>
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC"/>
<DA name="swRev" bType="VisString255" fc="DC"/>
<DA name="d" bType="VisString255" fc="DC"/>
<DA name="configRev" bType="VisString255" fc="DC"/>
<DA name="ldNs" bType="VisString255" fc="EX"/>
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC"/>
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true"/>
<DA name="q" bType="Quality" fc="ST" qchg="true"/>
<DA name="t" bType="Timestamp" fc="ST"/>
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC"/>
<DA name="swRev" bType="VisString255" fc="DC"/>
<DA name="d" bType="VisString255" fc="DC"/>
</DOType>
<DOType id="MV_1_AnIn1" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true"/>
<DA name="q" bType="Quality" fc="MX" qchg="true"/>
<DA name="t" bType="Timestamp" fc="MX"/>
</DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="origin" fc="ST" type="Originator_1" bType="Struct"/>
<DA name="ctlNum" fc="ST" bType="INT8U"/>
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true"/>
<DA name="q" bType="Quality" fc="ST" qchg="true"/>
<DA name="t" bType="Timestamp" fc="ST"/>
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF"/>
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO"/>
</DOType>
<DOType id="SPC_2" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true"/>
<DA name="q" bType="Quality" fc="ST" qchg="true"/>
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO"/>
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF"/>
<DA name="t" bType="Timestamp" fc="ST"/>
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32"/>
</DAType>
<DAType id="Originator_1">
<BDA name="orCat" type="OrCat" bType="Enum"/>
<BDA name="orIdent" bType="Octet64"/>
</DAType>
<DAType id="SPCOperate_1">
<BDA name="ctlVal" bType="BOOLEAN"/>
<BDA name="origin" type="Originator_1" bType="Struct"/>
<BDA name="ctlNum" bType="INT8U"/>
<BDA name="T" bType="Timestamp"/>
<BDA name="Test" bType="BOOLEAN"/>
<BDA name="Check" bType="Check"/>
</DAType>
<EnumType id="AddCause">
<EnumVal ord="0">Unknown</EnumVal>
<EnumVal ord="1">Not-supported</EnumVal>
<EnumVal ord="2">Blocked-by-switching-hierarchy</EnumVal>
<EnumVal ord="3">Select-failed</EnumVal>
<EnumVal ord="4">Invalid-position</EnumVal>
<EnumVal ord="5">Position-reached</EnumVal>
<EnumVal ord="6">Parameter-change-in-execution</EnumVal>
<EnumVal ord="7">Step-limit</EnumVal>
<EnumVal ord="8">Blocked-by-Mode</EnumVal>
<EnumVal ord="9">Blocked-by-process</EnumVal>
<EnumVal ord="10">Blocked-by-interlocking</EnumVal>
<EnumVal ord="11">Blocked-by-synchrocheck</EnumVal>
<EnumVal ord="12">Command-already-in-execution</EnumVal>
<EnumVal ord="13">Blocked-by-health</EnumVal>
<EnumVal ord="14">1-of-n-control</EnumVal>
<EnumVal ord="15">Abortion-by-cancel</EnumVal>
<EnumVal ord="16">Time-limit-over</EnumVal>
<EnumVal ord="17">Abortion-by-trip</EnumVal>
<EnumVal ord="18">Object-not-selected</EnumVal>
<EnumVal ord="19">Object-already-selected</EnumVal>
<EnumVal ord="20">No-access-authority</EnumVal>
<EnumVal ord="21">Ended-with-overshoot</EnumVal>
<EnumVal ord="22">Abortion-due-to-deviation</EnumVal>
<EnumVal ord="23">Abortion-by-communication-loss </EnumVal>
<EnumVal ord="24">Blocked-by-command</EnumVal>
<EnumVal ord="25">None</EnumVal>
<EnumVal ord="26">Inconsistent-parameters</EnumVal>
<EnumVal ord="27">Locked-by-other-client</EnumVal>
</EnumType>
<EnumType id="Beh">
<EnumVal ord="1">on</EnumVal>
<EnumVal ord="2">blocked</EnumVal>
<EnumVal ord="3">test</EnumVal>
<EnumVal ord="4">test/blocked</EnumVal>
<EnumVal ord="5">off</EnumVal>
</EnumType>
<EnumType id="HealthKind">
<EnumVal ord="1">ok</EnumVal>
<EnumVal ord="2">warning</EnumVal>
<EnumVal ord="3">alarm</EnumVal>
</EnumType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="OrCat">
<EnumVal ord="0">not-supported</EnumVal>
<EnumVal ord="1">bay-control</EnumVal>
<EnumVal ord="2">station-control</EnumVal>
<EnumVal ord="3">remote-control</EnumVal>
<EnumVal ord="4">automatic-bay</EnumVal>
<EnumVal ord="5">automatic-station</EnumVal>
<EnumVal ord="6">automatic-remote</EnumVal>
<EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal>
</EnumType>
<EnumType id="ServiceError">
<EnumVal ord="0">no-error</EnumVal>
<EnumVal ord="1">instance-not-available</EnumVal>
<EnumVal ord="2">instance-in-use</EnumVal>
<EnumVal ord="3">access-violation</EnumVal>
<EnumVal ord="4">access-not-allowed-in-current-state</EnumVal>
<EnumVal ord="5">parameter-value-inappropriate</EnumVal>
<EnumVal ord="6">parameter-value-inconsistent</EnumVal>
<EnumVal ord="7">class-not-supported</EnumVal>
<EnumVal ord="8">instance-locked-by-other-client</EnumVal>
<EnumVal ord="9">control-must-be-selected</EnumVal>
<EnumVal ord="10">type-conflict</EnumVal>
<EnumVal ord="11">failed-due-to-communications-constraint</EnumVal>
<EnumVal ord="12">failed-due-to-server-constraint</EnumVal>
</EnumType>
<EnumType id="ServiceType">
<EnumVal ord="0">Unknown</EnumVal>
<EnumVal ord="1">Associate</EnumVal>
<EnumVal ord="2">Abort</EnumVal>
<EnumVal ord="3">Release</EnumVal>
<EnumVal ord="4">GetServerDirectory</EnumVal>
<EnumVal ord="5">GetLogicalDeviceDirectory</EnumVal>
<EnumVal ord="6">GetAllDataValues</EnumVal>
<EnumVal ord="7">GetDataValues</EnumVal>
<EnumVal ord="8">SetDataValues</EnumVal>
<EnumVal ord="9">GetDataDirectory</EnumVal>
<EnumVal ord="10">GetDataDefinition</EnumVal>
<EnumVal ord="11">GetDataSetValues</EnumVal>
<EnumVal ord="12">SetDataSetValues</EnumVal>
<EnumVal ord="13">CreateDataSet</EnumVal>
<EnumVal ord="14">DeleteDataSet</EnumVal>
<EnumVal ord="15">GetDataSetDirectory</EnumVal>
<EnumVal ord="16">SelectActiveSG</EnumVal>
<EnumVal ord="17">SelectEditSG</EnumVal>
<EnumVal ord="18">SetEditSGValue</EnumVal>
<EnumVal ord="19">ConfirmEditSGValues</EnumVal>
<EnumVal ord="20">GetEditSGValue</EnumVal>
<EnumVal ord="21">GetSGCBValues</EnumVal>
<EnumVal ord="22">Report</EnumVal>
<EnumVal ord="23">GetBRCBValues</EnumVal>
<EnumVal ord="24">SetBRCBValues</EnumVal>
<EnumVal ord="25">GetURCBValues</EnumVal>
<EnumVal ord="26">SetURCBValues</EnumVal>
<EnumVal ord="27">GetLCBValues</EnumVal>
<EnumVal ord="28">SetLCBValues</EnumVal>
<EnumVal ord="29">QueryLogByTime</EnumVal>
<EnumVal ord="30">QueryLogAfter</EnumVal>
<EnumVal ord="31">GetLogStatus</EnumVal>
<EnumVal ord="32">SendGOOSEMessage</EnumVal>
<EnumVal ord="33">GetGoCBValues</EnumVal>
<EnumVal ord="34">SetGoCBValues</EnumVal>
<EnumVal ord="35">GetGoReference</EnumVal>
<EnumVal ord="36">GetGOOSEElementNumber</EnumVal>
<EnumVal ord="37">SendMSVMessage</EnumVal>
<EnumVal ord="38">GetMSVCBValues</EnumVal>
<EnumVal ord="39">SetMSVCBValues</EnumVal>
<EnumVal ord="40">SendUSVMessage</EnumVal>
<EnumVal ord="41">GetUSVCBValues</EnumVal>
<EnumVal ord="42">SetUSVCBValues</EnumVal>
<EnumVal ord="43">Select</EnumVal>
<EnumVal ord="44">SelectWithValue</EnumVal>
<EnumVal ord="45">Cancel</EnumVal>
<EnumVal ord="46">Operate</EnumVal>
<EnumVal ord="47">CommandTermination</EnumVal>
<EnumVal ord="48">TimeActivatedOperate</EnumVal>
<EnumVal ord="49">GetFile</EnumVal>
<EnumVal ord="50">SetFile</EnumVal>
<EnumVal ord="51">DeleteFile</EnumVal>
<EnumVal ord="52">GetFileAttributValues</EnumVal>
<EnumVal ord="53">TimeSynchronisation</EnumVal>
<EnumVal ord="54">InternalChange</EnumVal>
</EnumType>
<EnumType id="dirGeneral">
<EnumVal ord="0">unknown</EnumVal>
<EnumVal ord="1">forward</EnumVal>
<EnumVal ord="2">backward</EnumVal>
<EnumVal ord="3">both</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -0,0 +1,132 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using StaticModelGenerator;
namespace modeGenerator_example
{
/// <summary>
/// This example shows how to handle a large number of information objects
/// </summary>
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("Usage: Static Model (1) \n Dynamic Model (2) \n <generator option> <ICD file> [-ied <ied-name>] [-ap <access-point-name>] [-out <output-name>] [-modelprefix <model-prefix>]");
if (args.Length == 0)
{
Console.WriteLine("Parse the arguments \n" +
"Usage: Static Model (1) \n Dynamic Model (2) \n <generator option> <ICD file> [-ied <ied-name>] [-ap <access-point-name>] [-out <output-name>] [-modelprefix <model-prefix>]");
}
else
{
string accessPointName = null;
string iedName = null;
string icdFile = "ICDFiles//simpleIO_ltrk_tests.icd";
string outputFileName = "static_model";
string modelPrefix = "iedModel";
bool initializeOnce = false;
icdFile = args[1];
for (int i = 2; i < args.Count(); i++)
{
if (args[i] == ("-ap"))
{
accessPointName = args[i + 1];
Console.WriteLine("Select access point " + accessPointName);
i++;
}
else if (args[i] == ("-ied"))
{
iedName = args[i + 1];
Console.WriteLine("Select IED " + iedName);
i++;
}
else if (args[i] == ("-out"))
{
outputFileName = args[i + 1];
Console.WriteLine("Select Output File " + outputFileName);
i++;
}
else if (args[i] == ("-modelprefix"))
{
modelPrefix = args[i + 1];
Console.WriteLine("Select Model Prefix " + modelPrefix);
i++;
}
else if (args[i] == ("-initializeonce"))
{
initializeOnce = true;
Console.WriteLine("Select Initialize Once");
}
else
{
Console.WriteLine("Unknown option: \"" + args[i] + "\"");
}
}
if (args[0] == "1")
{
Console.WriteLine("Generate Static Model");
FileStream cOutStream = new FileStream(outputFileName + ".c", FileMode.Create, FileAccess.Write);
FileStream hOutStream = new FileStream(outputFileName + ".h", FileMode.Create, FileAccess.Write);
try
{
new StaticModelGenerator.StaticModelGenerator(icdFile, icdFile, cOutStream, hOutStream, outputFileName, iedName, accessPointName, modelPrefix, initializeOnce);
}
catch (Exception e)
{
Console.WriteLine("ERROR: " + e.ToString());
}
}
else if (args[0] == "2")
{
Console.WriteLine("Generate Dynamic Model");
try
{
FileStream stream = new FileStream(outputFileName + ".cfg", FileMode.Create, FileAccess.Write);
new DynamicModel.DynamicModel(icdFile, stream, iedName, accessPointName);
}
catch (Exception e)
{
Console.WriteLine("ERROR: " + e.ToString());
}
}
else
{
Console.WriteLine("Wrong option, parse 1 or 2 \n" +
"Usage: Static Model (1) \n Dynamic Model (2) \n <generator option> <ICD file> [-ied <ied-name>] [-ap <access-point-name>] [-out <output-name>] [-modelprefix <model-prefix>]");
}
}
}
}
}

@ -0,0 +1,77 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Remove="ICDFiles\cid_example_deadband.cid" />
<None Remove="ICDFiles\complexModel.icd" />
<None Remove="ICDFiles\genericIO.icd" />
<None Remove="ICDFiles\inverter3ph.icd" />
<None Remove="ICDFiles\inverter_with_report.icd" />
<None Remove="ICDFiles\sampleModel.icd" />
<None Remove="ICDFiles\sampleModel_errors.icd" />
<None Remove="ICDFiles\sampleModel_with_dataset.icd" />
<None Remove="ICDFiles\simpleIO_control_tests.cid" />
<None Remove="ICDFiles\simpleIO_direct_control.cid" />
<None Remove="ICDFiles\simpleIO_direct_control.icd" />
<None Remove="ICDFiles\simpleIO_direct_control_goose.cid" />
<None Remove="ICDFiles\simpleIO_direct_control_goose.scd" />
<None Remove="ICDFiles\simpleIO_ltrk_tests.icd" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="ICDFiles\cid_example_deadband.cid">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\complexModel.icd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\genericIO.icd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\inverter3ph.icd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\inverter_with_report.icd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\sampleModel.icd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\sampleModel_errors.icd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\sampleModel_with_dataset.icd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\simpleIO_control_tests.cid">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\simpleIO_direct_control.cid">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\simpleIO_direct_control.icd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\simpleIO_direct_control_goose.cid">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\simpleIO_direct_control_goose.scd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ICDFiles\simpleIO_ltrk_tests.icd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DynamicModelGenerator\DynamicModelGenerator.csproj" />
<ProjectReference Include="..\StaticModelGenerator\StaticModelGenerator.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,43 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35327.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicModelGenerator", "DynamicModelGenerator\DynamicModelGenerator.csproj", "{3269555F-ECB9-4304-936A-8FC6153AB5BD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SCLParser", "SCLParser\SCLParser.csproj", "{AF771AA2-C3EB-4F0A-884A-6B79C9977BE2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StaticModelGenerator", "StaticModelGenerator\StaticModelGenerator.csproj", "{992389DE-80E6-422B-8536-6D39E864118B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tools", "Tools\Tools.csproj", "{8103E20D-0EE9-443B-B7B4-6641D4EF85C7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3269555F-ECB9-4304-936A-8FC6153AB5BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3269555F-ECB9-4304-936A-8FC6153AB5BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3269555F-ECB9-4304-936A-8FC6153AB5BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3269555F-ECB9-4304-936A-8FC6153AB5BD}.Release|Any CPU.Build.0 = Release|Any CPU
{AF771AA2-C3EB-4F0A-884A-6B79C9977BE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AF771AA2-C3EB-4F0A-884A-6B79C9977BE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AF771AA2-C3EB-4F0A-884A-6B79C9977BE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AF771AA2-C3EB-4F0A-884A-6B79C9977BE2}.Release|Any CPU.Build.0 = Release|Any CPU
{992389DE-80E6-422B-8536-6D39E864118B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{992389DE-80E6-422B-8536-6D39E864118B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{992389DE-80E6-422B-8536-6D39E864118B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{992389DE-80E6-422B-8536-6D39E864118B}.Release|Any CPU.Build.0 = Release|Any CPU
{8103E20D-0EE9-443B-B7B4-6641D4EF85C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8103E20D-0EE9-443B-B7B4-6641D4EF85C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8103E20D-0EE9-443B-B7B4-6641D4EF85C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8103E20D-0EE9-443B-B7B4-6641D4EF85C7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4D5970CE-F389-4BCE-934E-F1E597AFEE22}
EndGlobalSection
EndGlobal
Loading…
Cancel
Save