Add SCLParser light version and ModelGenerator in .net

v1.6
Maxson Ramon dos Anjos Medeiros 4 months ago
parent 899a2bbe2e
commit 1e1e9045ba

@ -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,879 @@
/*
* 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;
//name += lnClass;
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,596 @@
/*
* 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.IO;
namespace IEC61850.SCL
{
public class DynamicModelGenerator
{
private SclConnectedAP connectedAP = null;
private SclIED ied = null;
private bool hasOwner = false;
private IEDDataModel iED = null;
private SclDocument sclDocument;
public DynamicModelGenerator(SclDocument sclDocument, StreamWriter output, IEDDataModel iED, SclAccessPoint accessPoint)
{
this.sclDocument = sclDocument;
this.iED = iED;
connectedAP = sclDocument.GetConnectedAP(accessPoint.Name, iED.Name);
output.WriteLine("MODEL(" + iED.Name + "){");
foreach (LogicalDevice ld in iED.LogicalDevices)
{
output.Write("LD(" + ld.Inst + "){\n");
ExportLogicalNodes(output, ld);
output.WriteLine("}");
}
output.WriteLine("}");
}
private void ExportLogicalNodes(StreamWriter output, LogicalDevice logicalDevice)
{
foreach (LogicalNode logicalNode in logicalDevice.LogicalNodes)
{
output.Write("LN(" + logicalNode.Name + "){\n");
ExportLogicalNode(output, logicalNode, logicalDevice);
output.WriteLine("}");
}
}
private void ExportLogicalNode(StreamWriter output, LogicalNode logicalNode, LogicalDevice logicalDevice)
{
if (logicalNode.SettingControl != null)
output.Write("SG(" + logicalNode.SettingControl.ActSG + " " + logicalNode.SettingControl.NumOfSGs + ")\n");
foreach (DataObject dataObject in logicalNode.DataObjects)
{
output.Write("DO(" + dataObject.Name + " " + dataObject.Count + "){\n");
ExportDataObject(output, dataObject, false);
output.WriteLine("}");
}
foreach (DataSet dataSet in logicalNode.DataSets)
ExportDataSet(output, dataSet, logicalNode);
foreach (ReportControl rcb in logicalNode.ReportControlBlocks)
{
if (rcb.SclReportControl.Indexed)
{
int maxInstances = 1;
if (rcb.SclReportControl.RptEna != null)
maxInstances = rcb.SclReportControl.RptEna.Max;
for (int i = 0; i < maxInstances; i++)
{
string index = (i + 1).ToString("X");
PrintRCBInstance(output, rcb, index);
}
}
else
PrintRCBInstance(output, rcb, "");
}
foreach (LogControl lcb in logicalNode.LogControls)
PrintLCB(output, lcb, logicalNode, logicalDevice);
foreach (Log log in logicalNode.Logs)
output.WriteLine("LOG(" + log.Name + ");");
foreach (GSEControl gcb in logicalNode.GSEControls)
{
PrintGSEControl(output, gcb);
}
foreach (SMVControl smv in logicalNode.SMVControls)
{
PrintSMVControl(output, smv);
}
}
private void PrintGSEControl(StreamWriter output, GSEControl gcb)
{
SclGSE gse = null;
SclAddress gseAddress = null;
if (connectedAP != null)
{
gse = connectedAP.GSEs.Find(x => x.CbName == gcb.Name);
if (gse != null)
gseAddress = gse.SclAddress;
}
else
Console.WriteLine("WARNING: IED \"" + ied.Name + "\" has no connected access point!");
output.Write("GC(");
output.Write(gcb.Name + " ");
if (gcb.SclGSEControl.AppID != null)
output.Write(gcb.SclGSEControl.AppID + " ");
else
output.Write("- ");
if (gcb.SclGSEControl.DatSet != null)
output.Write(gcb.SclGSEControl.DatSet + " ");
else
output.Write("- ");
if (gcb.SclGSEControl.ConfRev >= 0)
output.Write(gcb.SclGSEControl.ConfRev + " ");
else
output.Write("0 ");
if (gcb.SclGSEControl.FixedOffs)
output.Write('1');
else
output.Write('0');
output.Write(' ');
if (gse != null)
{
if (gse.Mintime != null)
output.Write(gse.Mintime);
else
output.Write("-1");
output.Write(' ');
if (gse.Maxtime != null)
output.Write(gse.Maxtime);
else
output.Write("-1");
}
else
{
output.Write("-1 -1");
}
if (gseAddress == null)
{
output.WriteLine(");");
}
else
{
output.WriteLine("){");
output.Write("PA(");
output.Write(gseAddress.VlanPriority + " ");
output.Write(gseAddress.VlanId + " ");
output.Write(gseAddress.AppId + " ");
for (int i = 0; i < 6; i++)
{
string hexValue = gseAddress.MacAddress[i].ToString("X2");
output.Write(hexValue);
}
output.WriteLine(");");
output.WriteLine("}");
}
}
private void PrintSMVControl(StreamWriter output, SMVControl smv)
{
SclSMV sclsmv = null;
SclAddress smvAddress = null;
if (connectedAP != null)
{
sclsmv = connectedAP.SMVs.Find(x => x.CbName == smv.Name);
if (sclsmv != null)
smvAddress = sclsmv.SclAddress;
}
output.Write("SMVC(");
output.Write(smv.Name + " ");
if (smv.SclSMVControl.SmvID != null)
output.Write(smv.SclSMVControl.SmvID + " ");
else
output.Write("- ");
if (smv.SclSMVControl.DataSet != null)
output.Write(smv.SclSMVControl.DataSet + " ");
else
output.Write("- ");
if (smv.SclSMVControl.ConfRev >= 0)
output.Write(smv.SclSMVControl.ConfRev + " ");
else
output.Write("0 ");
if (smv.SclSMVControl.SmpMod != null)
output.Write(smv.SclSMVControl.SmpMod + " ");
else
output.Write("-1 ");
output.Write(smv.SclSMVControl.SmpRate + " ");
if (smv.SclSMVControl.SclSmvOpts != null)
output.Write(smv.SclSMVControl.SclSmvOpts.GetIntValue());
else
output.Write("-1");
output.Write(' ');
if (smv.SclSMVControl.Multicast)
output.Write('1');
else
output.Write("-1");
output.Write(' ');
if (smvAddress == null)
{
output.WriteLine(");");
}
else
{
output.WriteLine("){");
output.Write("PA(");
output.Write(smvAddress.VlanPriority + " ");
output.Write(smvAddress.VlanId + " ");
output.Write(smvAddress.AppId + " ");
for (int i = 0; i < 6; i++)
{
string hexValue = smvAddress.MacAddress[i].ToString("X2");
output.Write(hexValue);
}
output.WriteLine(");");
output.WriteLine("}");
}
}
private void PrintLCB(StreamWriter output, LogControl lcb, LogicalNode ln, LogicalDevice logicalDevice)
{
output.Write("LC(");
output.Write(lcb.Name + " ");
if (lcb.SclLogControl.DatSet != null)
output.Write(lcb.SclLogControl.DatSet + " ");
else
output.Write("- ");
if (lcb.SclLogControl.LogName != null)
{
String logRef = logicalDevice.Inst + "/" + ln.Name + "$" + lcb.SclLogControl.LogName;
output.Write(logRef + " ");
}
else
output.Write("- ");
if (lcb.SclLogControl.TrgOps != null)
{
output.Write(lcb.SclLogControl.TrgOps.GetIntValue() + " ");
}
output.Write(lcb.SclLogControl.IntgPd + " ");
if (lcb.SclLogControl.LogEna)
output.Write("1 ");
else
output.Write("0 ");
if (lcb.SclLogControl.ReasonCode)
output.WriteLine("1);");
else
output.WriteLine("0);");
}
private void PrintRCBInstance(StreamWriter output, ReportControl rcb, string index)
{
output.Write("RC(");
output.Write(rcb.Name + index + " ");
if (rcb.SclReportControl.RptID != null)
output.Write(rcb.SclReportControl.RptID + " ");
else
output.Write("- ");
if (rcb.SclReportControl.Buffered)
output.Write("1 ");
else
output.Write("0 ");
if (rcb.SclReportControl.DatSet != null)
output.Write(rcb.SclReportControl.DatSet + " ");
else
output.Write("- ");
if (rcb.SclReportControl.IntConfRev >= 0)
output.Write(rcb.SclReportControl.IntConfRev + " ");
else
output.Write("0 ");
int triggerOptions = 0;
if (rcb.SclReportControl.TrgOps != null)
{
triggerOptions = rcb.SclReportControl.TrgOps.GetIntValue();
}
if (hasOwner)
triggerOptions += 64;
output.Write(triggerOptions + " ");
int OptFields = 0;
if (rcb.SclReportControl.OptFields != null)
{
OptFields = rcb.SclReportControl.OptFields.GetIntValue();
}
output.Write(OptFields + " ");
if (rcb.SclReportControl.BufTime != null)
output.Write(rcb.SclReportControl.BufTime + " ");
else
output.Write("0 ");
if (rcb.SclReportControl.IntgPd != null)
output.Write(rcb.SclReportControl.IntgPd);
else
output.Write("0");
output.WriteLine(");");
}
private void ExportDataObject(StreamWriter output, DataObject dataObject, bool isTransient)
{
if (dataObject.IsTransiente)
isTransient = true;
foreach (DataObjectOrAttribute child in dataObject.DataObjectsAndAttributes)
{
if (child is DataObject)
{
DataObject subDataObject = child as DataObject;
output.Write("DO(" + subDataObject.Name + " " + subDataObject.Count + "){\n");
ExportDataObject(output, subDataObject, isTransient);
output.WriteLine("}");
}
else
{
DataAttribute dataAttribute = child as DataAttribute;
ExportDataAttribute(output, dataAttribute, isTransient);
}
}
}
private void ExportDataAttribute(StreamWriter output, DataAttribute dataAttribute, bool isTransient)
{
output.Write("DA(" + dataAttribute.Name + " ");
output.Write(dataAttribute.Count + " ");
output.Write((int)dataAttribute.AttributeType + " ");
output.Write((int)dataAttribute.Fc + " ");
if (dataAttribute.Definition.TriggerOptions != null)
{
int trgOpsVal = dataAttribute.Definition.TriggerOptions.GetIntValue();
if (isTransient)
trgOpsVal += 128;
output.Write(trgOpsVal + " ");
}
if (dataAttribute.Definition.SAddr != null)
output.Write(dataAttribute.Definition.SAddr);
else
output.Write("0");
output.Write(")");
if (dataAttribute.AttributeType != AttributeType.CONSTRUCTED)
{
SclVal value = dataAttribute.Definition.GetVal();
if (value != null)
{
switch (dataAttribute.AttributeType)
{
case AttributeType.ENUMERATED:
string EnumType = dataAttribute.Definition.Type;
SclEnumType sclEnumType;
if (EnumType != null)
{
sclEnumType = sclDocument.DataTypeTemplates.GetEnumType(EnumType);
if (sclEnumType != null)
{
SclEnumVal sclEnumVal = sclEnumType.EnumValues.Find(x => x.SymbolicName == value.Value);
output.Write("=" + sclEnumVal.Ord);
}
}
break;
case AttributeType.INT8:
case AttributeType.INT16:
case AttributeType.INT32:
case AttributeType.INT64:
output.Write("=" + value.Value);
break;
case AttributeType.INT8U:
case AttributeType.INT16U:
case AttributeType.INT24U:
case AttributeType.INT32U:
output.Write("=" + value.Value);
break;
case AttributeType.BOOLEAN:
if (value.Value == "true")
output.Write("=1");
else
output.Write("=0");
break;
case AttributeType.UNICODE_STRING_255:
output.Write("=\"" + value.Value + "\"");
break;
case AttributeType.CURRENCY:
case AttributeType.VISIBLE_STRING_32:
case AttributeType.VISIBLE_STRING_64:
case AttributeType.VISIBLE_STRING_129:
case AttributeType.VISIBLE_STRING_255:
case AttributeType.VISIBLE_STRING_65:
output.Write("=\"" + value.Value + "\"");
break;
case AttributeType.OCTET_STRING_64:
output.Write("=\"" + value.Value + "\"");
break;
case AttributeType.FLOAT32:
case AttributeType.FLOAT64:
output.Write("=" + value.Value);
break;
default:
Console.WriteLine("Unknown default value for " + dataAttribute.Name + " type: " + dataAttribute.AttributeType);
break;
}
}
output.WriteLine(";");
}
else
{
output.WriteLine("{");
foreach (DataAttribute subDataAttribute in dataAttribute.SubDataAttributes)
{
ExportDataAttribute(output, subDataAttribute, isTransient);
}
output.WriteLine("}");
}
}
private void ExportDataSet(StreamWriter output, DataSet dataSet, LogicalNode logicalNode)
{
output.Write("DS(" + dataSet.Name + "){\n");
foreach (SclFCDA fcda in dataSet.SclDataSet.Fcdas)
{
String mmsVariableName = "";
if (fcda.Prefix != null)
mmsVariableName += fcda.Prefix;
mmsVariableName += fcda.LnClass;
if (fcda.LnInst != null)
mmsVariableName += fcda.LnInst;
mmsVariableName += "$" + fcda.Fc;
mmsVariableName += "$" + fcda.DoName;
if (fcda.DaName != null)
mmsVariableName += "$" + fcda.DaName;
int arrayStart = mmsVariableName.IndexOf('(');
String variableName = mmsVariableName;
int arrayIndex = -1;
string componentName = null;
if (arrayStart != -1)
{
variableName = mmsVariableName.Substring(0, arrayStart);
int arrayEnd = mmsVariableName.IndexOf(')');
string arrayIndexStr = mmsVariableName.Substring(arrayStart + 1, arrayEnd);
arrayIndex = int.Parse(arrayIndexStr);
//if (arrayIndex < 0)
// throw new SclParserException("Array index out of range in data set entry definition");
string componentNamePart = mmsVariableName.Substring(arrayEnd + 1);
if ((componentNamePart != null) && (componentNamePart.Length > 0))
{
if (componentNamePart[0] == '$')
{
componentNamePart = componentNamePart.Substring(1);
}
if ((componentNamePart != null) && (componentNamePart.Length > 0))
componentName = componentNamePart;
}
}
/* check for LD name */
String logicalDeviceName = null;
if (fcda.LdInst != null)
{
if (fcda.LdInst != (logicalNode.Parent as LogicalDevice).Inst)
{
logicalDeviceName = fcda.LdInst;
}
}
if (logicalDeviceName != null)
variableName = logicalDeviceName + "/" + variableName;
if (variableName != null && arrayIndex != -1 && componentName != null)
{
output.Write("DE(" + variableName + " " + arrayIndex + " " + componentName + ");\n");
}
else if (variableName != null && arrayIndex != -1)
{
output.Write("DE(" + variableName + " " + arrayIndex + ");\n");
}
else if (variableName != null)
{
output.Write("DE(" + variableName + ");\n");
}
}
output.WriteLine("}");
}
}
}

@ -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 = min;
}
}
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,343 @@
/*
* 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,37 @@

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}") = "ModelGenerator", "ModelGenerator\ModelGenerator.csproj", "{FB5457AA-CE89-48BB-8F1F-2540DF894492}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModelGeneratorExample", "ModelGeneratorExample\ModelGeneratorExample.csproj", "{A80ED62D-CCA9-4D8E-B04D-9BEA5CD7DF78}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SCLParser", "..\..\SCLParser\SCLParser.csproj", "{88069284-150D-4BAE-8C7B-140298C5C011}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{FB5457AA-CE89-48BB-8F1F-2540DF894492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FB5457AA-CE89-48BB-8F1F-2540DF894492}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FB5457AA-CE89-48BB-8F1F-2540DF894492}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FB5457AA-CE89-48BB-8F1F-2540DF894492}.Release|Any CPU.Build.0 = Release|Any CPU
{A80ED62D-CCA9-4D8E-B04D-9BEA5CD7DF78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A80ED62D-CCA9-4D8E-B04D-9BEA5CD7DF78}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A80ED62D-CCA9-4D8E-B04D-9BEA5CD7DF78}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A80ED62D-CCA9-4D8E-B04D-9BEA5CD7DF78}.Release|Any CPU.Build.0 = Release|Any CPU
{88069284-150D-4BAE-8C7B-140298C5C011}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{88069284-150D-4BAE-8C7B-140298C5C011}.Debug|Any CPU.Build.0 = Debug|Any CPU
{88069284-150D-4BAE-8C7B-140298C5C011}.Release|Any CPU.ActiveCfg = Release|Any CPU
{88069284-150D-4BAE-8C7B-140298C5C011}.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

@ -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,997 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using IEC61850.SCL;
using IEC61850.SCL.DataModel;
using System;
using System.Collections.Generic;
namespace ModelGenerator.C_Structures
{
/** FCs (Functional constraints) according to IEC 61850-7-2 */
public enum eFunctionalConstraint
{
/** Status information */
IEC61850_FC_ST = 0,
/** Measurands - analog values */
IEC61850_FC_MX = 1,
/** Setpoint */
IEC61850_FC_SP = 2,
/** Substitution */
IEC61850_FC_SV = 3,
/** Configuration */
IEC61850_FC_CF = 4,
/** Description */
IEC61850_FC_DC = 5,
/** Setting group */
IEC61850_FC_SG = 6,
/** Setting group editable */
IEC61850_FC_SE = 7,
/** Service response / Service tracking */
IEC61850_FC_SR = 8,
/** Operate received */
IEC61850_FC_OR = 9,
/** Blocking */
IEC61850_FC_BL = 10,
/** Extended definition */
IEC61850_FC_EX = 11,
/** Control */
IEC61850_FC_CO = 12,
/** Unicast SV */
IEC61850_FC_US = 13,
/** Multicast SV */
IEC61850_FC_MS = 14,
/** Unbuffered report */
IEC61850_FC_RP = 15,
/** Buffered report */
IEC61850_FC_BR = 16,
/** Log control blocks */
IEC61850_FC_LG = 17,
/** Goose control blocks */
IEC61850_FC_GO = 18,
/** All FCs - wildcard value */
IEC61850_FC_ALL = 99,
IEC61850_FC_NONE = -1
}
public enum DataAttributeType
{
IEC61850_UNKNOWN_TYPE = -1,
IEC61850_BOOLEAN = 0,/* int */
IEC61850_INT8 = 1, /* int8_t */
IEC61850_INT16 = 2, /* int16_t */
IEC61850_INT32 = 3, /* int32_t */
IEC61850_INT64 = 4, /* int64_t */
IEC61850_INT128 = 5, /* no native mapping! */
IEC61850_INT8U = 6, /* uint8_t */
IEC61850_INT16U = 7, /* uint16_t */
IEC61850_INT24U = 8, /* uint32_t */
IEC61850_INT32U = 9, /* uint32_t */
IEC61850_FLOAT32 = 10, /* float */
IEC61850_FLOAT64 = 11, /* double */
IEC61850_ENUMERATED = 12,
IEC61850_OCTET_STRING_64 = 13,
IEC61850_OCTET_STRING_6 = 14,
IEC61850_OCTET_STRING_8 = 15,
IEC61850_VISIBLE_STRING_32 = 16,
IEC61850_VISIBLE_STRING_64 = 17,
IEC61850_VISIBLE_STRING_65 = 18,
IEC61850_VISIBLE_STRING_129 = 19,
IEC61850_VISIBLE_STRING_255 = 20,
IEC61850_UNICODE_STRING_255 = 21,
IEC61850_TIMESTAMP = 22,
IEC61850_QUALITY = 23,
IEC61850_CHECK = 24,
IEC61850_CODEDENUM = 25,
IEC61850_GENERIC_BITSTRING = 26,
IEC61850_CONSTRUCTED = 27,
IEC61850_ENTRY_TIME = 28,
IEC61850_PHYCOMADDR = 29,
IEC61850_CURRENCY = 30,
IEC61850_OPTFLDS = 31, /* bit-string(10) */
IEC61850_TRGOPS = 32 /* bit-string(6) */
}
public class C_InitializeValues
{
public string c_text;
public C_InitializeValues()
{
}
}
public class C_DO_DA_Structure
{
public string objRef;
public C_DO_DA_Structure()
{
}
}
public class C_DataAttributeStructure : C_DO_DA_Structure
{
public string ModelNodeType = "DataAttributeModelType";
public string name;
public string parent;
public string sibling = "NULL";
public string child = "NULL";
public int elementCount = 0; /* value > 0 if this is an array */
public int arrayIndex = -1; /* value > -1 when this is an array element */
public DataAttribute DataAttribute = null;
public string triggerOptions; /* TRG_OPT_DATA_CHANGED | TRG_OPT_QUALITY_CHANGED | TRG_OPT_DATA_UPDATE */
public string mmsValue = "NULL";
public string sAddr = "0"; /* TODO remove in version 2.0 */
public string refName = null;
public bool isTransient = false;
public SclFC sclFC = SclFC.NONE;
//public List<C_DataAttributeStructure> c_DataAttributeStructures = new List<C_DataAttributeStructure>();
public C_DataAttributeStructure() : base()
{
}
public string ExternNameToString()
{
return "extern DataAttribute " + objRef + ";";
}
private static DataAttributeType ConvertToDataAttributeType(AttributeType type)
{
switch (type)
{
case AttributeType.BOOLEAN: return DataAttributeType.IEC61850_BOOLEAN;
case AttributeType.INT8: return DataAttributeType.IEC61850_INT8;
case AttributeType.INT16: return DataAttributeType.IEC61850_INT16;
case AttributeType.INT32: return DataAttributeType.IEC61850_INT32;
case AttributeType.INT64: return DataAttributeType.IEC61850_INT64;
case AttributeType.INT128: return DataAttributeType.IEC61850_INT128;
case AttributeType.INT8U: return DataAttributeType.IEC61850_INT8U;
case AttributeType.INT16U: return DataAttributeType.IEC61850_INT16U;
case AttributeType.INT24U: return DataAttributeType.IEC61850_INT24U;
case AttributeType.INT32U: return DataAttributeType.IEC61850_INT32U;
case AttributeType.FLOAT32: return DataAttributeType.IEC61850_FLOAT32;
case AttributeType.FLOAT64: return DataAttributeType.IEC61850_FLOAT64;
case AttributeType.ENUMERATED: return DataAttributeType.IEC61850_ENUMERATED;
case AttributeType.OCTET_STRING_64: return DataAttributeType.IEC61850_OCTET_STRING_64;
case AttributeType.OCTET_STRING_6: return DataAttributeType.IEC61850_OCTET_STRING_6;
case AttributeType.OCTET_STRING_8: return DataAttributeType.IEC61850_OCTET_STRING_8;
case AttributeType.VISIBLE_STRING_32: return DataAttributeType.IEC61850_VISIBLE_STRING_32;
case AttributeType.VISIBLE_STRING_64: return DataAttributeType.IEC61850_VISIBLE_STRING_64;
case AttributeType.VISIBLE_STRING_65: return DataAttributeType.IEC61850_VISIBLE_STRING_65;
case AttributeType.VISIBLE_STRING_129: return DataAttributeType.IEC61850_VISIBLE_STRING_129;
case AttributeType.VISIBLE_STRING_255: return DataAttributeType.IEC61850_VISIBLE_STRING_255;
case AttributeType.UNICODE_STRING_255: return DataAttributeType.IEC61850_UNICODE_STRING_255;
case AttributeType.TIMESTAMP: return DataAttributeType.IEC61850_TIMESTAMP;
case AttributeType.QUALITY: return DataAttributeType.IEC61850_QUALITY;
case AttributeType.CHECK: return DataAttributeType.IEC61850_CHECK;
case AttributeType.CODEDENUM: return DataAttributeType.IEC61850_CODEDENUM;
case AttributeType.GENERIC_BITSTRING: return DataAttributeType.IEC61850_GENERIC_BITSTRING;
case AttributeType.CONSTRUCTED: return DataAttributeType.IEC61850_CONSTRUCTED;
case AttributeType.ENTRY_TIME: return DataAttributeType.IEC61850_ENTRY_TIME;
case AttributeType.PHYCOMADDR: return DataAttributeType.IEC61850_PHYCOMADDR;
case AttributeType.CURRENCY: return DataAttributeType.IEC61850_CURRENCY;
case AttributeType.OTHER:
default:
return DataAttributeType.IEC61850_UNKNOWN_TYPE;
}
}
private static eFunctionalConstraint ConvertToFunctionalConstraint(SclFC sclFC)
{
switch (sclFC)
{
case SclFC.ST: return eFunctionalConstraint.IEC61850_FC_ST;
case SclFC.MX: return eFunctionalConstraint.IEC61850_FC_MX;
case SclFC.SP: return eFunctionalConstraint.IEC61850_FC_SP;
case SclFC.SV: return eFunctionalConstraint.IEC61850_FC_SV;
case SclFC.CF: return eFunctionalConstraint.IEC61850_FC_CF;
case SclFC.DC: return eFunctionalConstraint.IEC61850_FC_DC;
case SclFC.SG: return eFunctionalConstraint.IEC61850_FC_SG;
case SclFC.SE: return eFunctionalConstraint.IEC61850_FC_SE;
case SclFC.SR: return eFunctionalConstraint.IEC61850_FC_SR;
case SclFC.OR: return eFunctionalConstraint.IEC61850_FC_OR;
case SclFC.BL: return eFunctionalConstraint.IEC61850_FC_BL;
case SclFC.EX: return eFunctionalConstraint.IEC61850_FC_EX;
case SclFC.CO: return eFunctionalConstraint.IEC61850_FC_CO;
case SclFC.US: return eFunctionalConstraint.IEC61850_FC_US;
case SclFC.MS: return eFunctionalConstraint.IEC61850_FC_MS;
case SclFC.RP: return eFunctionalConstraint.IEC61850_FC_RP;
case SclFC.BR: return eFunctionalConstraint.IEC61850_FC_BR;
case SclFC.LG: return eFunctionalConstraint.IEC61850_FC_LG;
case SclFC.ALL: return eFunctionalConstraint.IEC61850_FC_ALL;
case SclFC.NONE: return eFunctionalConstraint.IEC61850_FC_NONE;
default:
throw new ArgumentOutOfRangeException(nameof(sclFC), $"Unhandled SclFC value: {sclFC}");
}
}
private string TrgOrtTotring(SclTriggerOptions trgOps)
{
string text = "0";
if (trgOps.Dchg)
text += " + TRG_OPT_DATA_CHANGED";
if (trgOps.Dchg)
text += " + TRG_OPT_DATA_UPDATE";
if (trgOps.Dchg)
text += " + TRG_OPT_QUALITY_CHANGED";
if (isTransient)
text += " + TRG_OPT_TRANSIENT";
return text;
}
public override string ToString()
{
string daName = parent;
//if (DataAttribute.Fc == SclFC.SE)
// daName += "_SE_" + name;
//else
daName += "_" + name;
string cText = "DataAttribute " + objRef + " = {\n";
cText += " " + ModelNodeType + ",\n";
cText += " \"" + name + "\",\n";
cText += " (ModelNode*) &" + parent + ",\n";
if (sibling == "NULL")
cText += " " + sibling + ",\n";
else
cText += " (ModelNode*) &" + sibling + ",\n";
if (child == "NULL")
cText += " " + child + ",\n";
else
cText += " (ModelNode*) &" + child + ",\n";
cText += " " + elementCount + ",\n";
cText += " " + arrayIndex + ",\n";
cText += " " + ConvertToFunctionalConstraint(sclFC).ToString() + ",\n";
cText += " " + ConvertToDataAttributeType(DataAttribute.AttributeType).ToString() + ",\n";
cText += " " + TrgOrtTotring(DataAttribute.Definition.triggerOptions) + ",\n";
cText += " " + mmsValue + ",\n";
//TODO -> Shot address -> ataAttribute.getShortAddress()
cText += " " + sAddr.ToString() + "\n";
cText += "};";
return cText;
}
}
public class C_DataObjectStructure : C_DO_DA_Structure
{
public string ModelNodeType = "DataObjectModelType";
public string name;
public string parent;
public string sibling = "NULL";
public string child = "NULL";
public int elementCount = 0; /* value > 0 if this is an array */
public int arrayIndex = -1; /* value > -1 when this is an array element */
//public List<C_DO_DA_Structure> c_DO_DA_Structures = new List<C_DO_DA_Structure>();
public DataObject DataObject;
public C_DataObjectStructure() : base()
{
}
public string ExternNameToString()
{
return "extern DataObject " + objRef + ";";
}
public override string ToString()
{
string cText = "DataObject " + parent + "_" + name + " = {\n";
cText += " " + ModelNodeType + ",\n";
cText += " \"" + name + "\",\n";
cText += " (ModelNode*) &" + parent + ",\n";
if (sibling == "NULL")
cText += " " + sibling + ",\n";
else
cText += " (ModelNode*) &" + parent + "_" + sibling + ",\n";
if (child != "NULL")
cText += " (ModelNode*) &" + child + ",\n";
else
cText += " NULL,\n";
cText += " " + elementCount + ",\n";
cText += " " + arrayIndex + "\n";
cText += "};";
return cText;
}
}
public class C_LogicalNodeStructure
{
public string ModelNodeType = "LogicalNodeModelType";
public string name;
public string parent;
public string sibling = "NULL";
public string firstChild = "NULL";
public string objRef;
public List<C_DO_DA_Structure> c_DataObjectOrDataAttributeStructures = new List<C_DO_DA_Structure>();
public C_LogicalNodeStructure()
{
}
public string ExternNameToString()
{
return "extern LogicalNode " + objRef + ";";
}
public override string ToString()
{
string cText = "LogicalNode " + parent + "_" + name + " = {\n";
cText += " " + ModelNodeType + ",\n";
cText += " \"" + name + "\",\n";
cText += " (ModelNode*) &" + parent + ",\n";
if (sibling == "NULL")
cText += " " + sibling + ",\n";
else
cText += " (ModelNode*) &" + parent + "_" + sibling + ",\n";
if (firstChild == "NULL")
cText += " " + firstChild + "\n";
else
cText += " (ModelNode*) &" + parent + "_" + name + "_" + firstChild + "\n";
cText += "};";
return cText;
}
}
public class C_LogicalDeviceStructure
{
public string ModelNodeType = "LogicalDeviceModelType";
public string name; /* LD instance */
public string parent;
public string sibling = "NULL";
public string firstChild = "NULL";
public string ldName = "NULL"; /* ldName (when using functional naming) */
public List<C_LogicalNodeStructure> c_LogicalNodeStructures = new List<C_LogicalNodeStructure>();
public string objRef;
public C_LogicalDeviceStructure()
{
}
public string ExternNameToString()
{
return "extern LogicalDevice " + objRef + ";";
}
public override string ToString()
{
string cText = "LogicalDevice " + objRef + " = {\n";
cText += " " + ModelNodeType + ",\n";
cText += " \"" + name + "\",\n";
cText += " (ModelNode*) &" + parent + ",\n";
if (sibling == "NULL")
cText += " " + sibling + ",\n";
else
cText += " (ModelNode*) &" + sibling + ",\n";
if (firstChild == "NULL")
cText += " " + firstChild + ",\n";
else
cText += " (ModelNode*) &" + parent + "_" + name + "_" + firstChild + ",\n";
if (ldName == "NULL")
cText += " " + ldName + "\n";
else
cText += " \"" + ldName + "\"\n";
cText += "};";
return cText;
}
}
public class C_LogStructure
{
public Log log;
public string externName;
public string sibling = "NULL";
public string parent;
public C_LogStructure()
{
}
public string ExternNameToString()
{
return "extern Log " + externName + ";";
}
public override string ToString()
{
string cText = "Log " + externName + " = {\n";
cText += " &" + parent + ",\n";
if (log.Name != null)
cText += " \"" + log.Name + "\",\n";
else
cText += " NULL,\n";
if (sibling == "NULL")
cText += " " + sibling + "\n";
else
cText += " &" + sibling + "\n";
cText += "};";
return cText;
}
}
public class C_LogControlBlockStructure
{
public LogControl logControl;
public string externName;
public string sibling = "NULL";
public string parent;
public string ldInst;
public bool hasOwner = false;
public string lnClass;
public C_LogControlBlockStructure()
{
}
public string ExternNameToString()
{
return "extern LogControlBlock " + externName + ";";
}
string logRef()
{
string logRef;
string lcbString = " ";
if (logControl.SclLogControl.LogName != null)
{
if (logControl.SclLogControl.LdInst == null)
logRef = ldInst + "/";
else
logRef = logControl.SclLogControl.LdInst + "/";
if (logControl.SclLogControl.LnClass != null)
logRef += logControl.SclLogControl.LnClass + "$";
else
logRef += lnClass + "$";
lcbString += "\"" + logRef + logControl.SclLogControl.LogName + "\",\n";
}
else
lcbString += " NULL,\n";
return lcbString;
}
private int TrgOpsConvert()
{
int triggerOps = 0;
if (logControl.SclLogControl.TrgOps != null)
triggerOps = logControl.SclLogControl.TrgOps.GetIntValue();
if (triggerOps >= 16)
triggerOps = triggerOps - 16;
return triggerOps;
}
public override string ToString()
{
string cText = "LogControlBlock " + externName + " = {\n";
cText += " &" + parent + ",\n";
cText += " \"" + logControl.Name + "\",\n";
if (logControl.SclLogControl.DatSet != null)
cText += " \"" + logControl.SclLogControl.DatSet + "\",\n";
else
cText += " NULL,\n";
cText += logRef();
cText += " " + TrgOpsConvert() + ",\n";
if (logControl.SclLogControl.IntgPd != null)
cText += " " + logControl.SclLogControl.IntgPd + ",\n";
else
cText += " 0,\n";
cText += " " + logControl.SclLogControl.LogEna.ToString().ToLower() + ",\n";
cText += " " + logControl.SclLogControl.ReasonCode.ToString().ToLower() + ",\n";
if (sibling == "NULL")
cText += " " + sibling + "\n";
else
cText += " &" + sibling + "\n";
cText += "};";
return cText;
}
}
public class C_SettingGroupStructure
{
public SclSettingControl settingControl;
public string parent;
public string externName;
public C_SettingGroupStructure()
{
}
public string ExternNameToString()
{
return "extern SettingGroupControlBlock " + externName + ";";
}
public override string ToString()
{
string cText = "SettingGroupControlBlock " + externName + " = {\n";
cText += " &" + parent + ",\n";
cText += " " + settingControl.ActSG + ",\n";
cText += " " + settingControl.NumOfSGs + ",\n";
cText += " 0,\n";
cText += " false,\n";
cText += " 0,\n";
cText += " 0,\n";
cText += " NULL,\n";
cText += "};";
return cText;
}
}
public class C_GSEControlBlockStructure
{
public GSEControl GSEControl;
public SclGSE SclGSE;
public string lnPrefix;
public string parent;
public string rptId;
public string externName;
public int reportNumber = -1;
public string index;
public bool hasOwner = false;
public string sibling = "NULL";
public string phyComAddrName = "NULL";
private string gseString = "";
private string min = "-1";
private string max = "-1";
public C_GSEControlBlockStructure()
{
}
public string ExternNameToString()
{
return "extern GSEControlBlock " + externName + ";";
}
private void LoadPhyComAddrName()
{
if (SclGSE != null)
{
if (SclGSE.Mintime != null)
if (SclGSE.Mintime != "")
min = SclGSE.Mintime;
if (SclGSE.Maxtime != null)
if (SclGSE.Maxtime != "")
max = SclGSE.Maxtime;
if (SclGSE.SclAddress != null)
{
phyComAddrName = lnPrefix + "_gse" + reportNumber + "_address";
gseString += "\nstatic PhyComAddress " + phyComAddrName + " = {\n";
gseString += " " + SclGSE.SclAddress.VlanPriority + ",\n";
gseString += " " + SclGSE.SclAddress.VlanId + ",\n";
gseString += " " + SclGSE.SclAddress.AppId + ",\n";
gseString += " {";
for (int i = 0; i < 6; i++)
{
gseString += "0x" + (SclGSE.SclAddress.MacAddress[i]).ToString("x1");
if (i == 5)
gseString += "}\n";
else
gseString += ", ";
}
gseString += "};\n\n";
}
}
}
public override string ToString()
{
LoadPhyComAddrName();
string cText = gseString;
cText += "GSEControlBlock " + externName + " = {\n";
cText += " &" + parent + ",\n";
cText += " \"" + GSEControl.Name + index + "\",\n";
if (GSEControl.SclGSEControl.AppID != null)
cText += " \"" + GSEControl.SclGSEControl.AppID + "\",\n";
else
cText += " NULL,\n";
if (GSEControl.SclGSEControl.DatSet != null)
cText += " \"" + GSEControl.SclGSEControl.DatSet + "\",\n";
else
cText += " NULL,\n";
cText += " " + GSEControl.SclGSEControl.ConfRev + ",\n";
cText += " " + GSEControl.SclGSEControl.FixedOffs.ToString().ToLower() + ",\n";
if (phyComAddrName == "NULL")
cText += " " + phyComAddrName + ",\n";
else
cText += " &" + phyComAddrName + ",\n";
cText += " " + min + ",\n";
cText += " " + max + ",\n";
if (sibling == "NULL")
cText += " " + sibling + "\n";
else
cText += " &" + sibling + "\n";
cText += "};";
return cText;
}
}
public class C_ReportControlBlockStructure
{
public ReportControl ReportControl;
public string parent;
public string rptId;
public string externName;
public byte[] clientIpAddr;
public int reportNumber = -1;
public int reportsCount = -1;
public string index;
public bool hasOwner = false;
/* type (first byte) and address of the pre-configured client
type can be one of (0 - no reservation, 4 - IPv4 client, 6 - IPv6 client) */
//public int clientReservation[17];
public string sibling = "NULL";
public C_ReportControlBlockStructure()
{
}
public string ExternNameToString()
{
return "extern ReportControlBlock " + externName + ";";
}
private int TrgOpsConvert(SclTrgOps sclTriggerOptions)
{
int triggerOps = 16;
if (sclTriggerOptions != null)
triggerOps = sclTriggerOptions.GetIntValue();
if (hasOwner)
triggerOps += 64;
return triggerOps;
}
private int OptFieldsConvert(SclOptFields sclOptFields)
{
int options = 0;
if (sclOptFields != null)
{
if (sclOptFields.SeqNum)
options += 1;
if (sclOptFields.TimeStamp)
options += 2;
if (sclOptFields.ReasonCode)
options += 4;
if (sclOptFields.DataSet)
options += 8;
if (sclOptFields.DataRef)
options += 16;
if (sclOptFields.BufOvfl)
options += 32;
if (sclOptFields.EntryID)
options += 64;
if (sclOptFields.ConfigRef)
options += 128;
}
else
options = 32;
return options;
}
private string clientIpAddrConvert()
{
string value = " {";
for (int i = 0; i < 17; i++)
{
value += "0x" + (clientIpAddr[i] & 0xff).ToString("X1");
if (i == 16)
value += "},\n";
else
value += ", ";
}
return value;
}
public override string ToString()
{
string cText = "ReportControlBlock " + externName + " = {\n";
cText += " &" + parent + ",\n";
cText += " \"" + ReportControl.Name + index + "\",\n";
if (ReportControl.SclReportControl.RptID != null)
cText += " \"" + ReportControl.SclReportControl.RptID + "\",\n";
else
cText += " NULL,\n";
cText += " " + ReportControl.SclReportControl.Buffered.ToString().ToLower() + ",\n";
if (ReportControl.SclReportControl.DatSet != null)
cText += " \"" + ReportControl.SclReportControl.DatSet + "\",\n";
else
cText += " NULL,\n";
if (ReportControl.SclReportControl.ConfRev != null)
cText += " " + ReportControl.SclReportControl.ConfRev + ",\n";
else
cText += " NULL,\n";
cText += " " + TrgOpsConvert(ReportControl.SclReportControl.TrgOps) + ",\n";
cText += " " + OptFieldsConvert(ReportControl.SclReportControl.OptFields) + ",\n";
if (ReportControl.SclReportControl.BufTime != null)
cText += " " + ReportControl.SclReportControl.BufTime + ",\n";
else
cText += " NULL,\n";
if (ReportControl.SclReportControl.IntgPd != null)
cText += " " + ReportControl.SclReportControl.IntgPd + ",\n";
else
cText += " 0,\n";
cText += clientIpAddrConvert();
if (sibling == "NULL")
cText += " " + sibling + "\n";
else
cText += " &" + sibling + "\n";
cText += "};";
return cText;
}
}
public class C_DataSetStructure
{
public DataSet DataSet { get; set; }
public string externDataSetName { get; set; }
public List<C_DatasetEntry> externDataSetEntries { get; set; }
public string logicalDeviceName; /* logical device instance name */
public string name; /* eg. MMXU1$dataset1 */
public int elementCount = 0;
public string fcdas = "NULL";
public string sibling = "NULL";
public C_DataSetStructure()
{
externDataSetEntries = new List<C_DatasetEntry>();
}
public string ExternToString()
{
return "extern DataSet " + externDataSetName + ";";
}
public override string ToString()
{
string cText = "DataSet " + externDataSetName + " = {\n";
cText += " \"" + logicalDeviceName + "\",\n";
cText += " \"" + name + "\",\n";
cText += " " + elementCount.ToString() + ",\n";
if (fcdas == "NULL")
cText += " " + fcdas + ",\n";
else
cText += " &" + fcdas + ",\n";
if (sibling == "NULL")
cText += " " + sibling + "\n";
else
cText += " &" + sibling + "\n";
cText += "};";
return cText;
}
}
public class C_IEDModelStructure
{
public string name;
public string modelPrefix;
public string firstChild = "NULL";
public string dataSets = "NULL";
public string rcbs = "NULL";
public string gseCBs = "NULL";
public string svCBs = "NULL";
public string sgcbs = "NULL";
public string lcbs = "NULL";
public string logs = "NULL";
public C_IEDModelStructure()
{
}
public override string ToString()
{
string cText = "IedModel " + modelPrefix + " = {\n";
cText += " \"" + name + "\",\n";
if (firstChild == "NULL")
cText += " " + firstChild + ",\n";
else
cText += " &" + firstChild + ",\n";
if (dataSets == "NULL")
cText += " " + dataSets + ",\n";
else
cText += " &" + dataSets + ",\n";
if (rcbs == "NULL")
cText += " " + rcbs + ",\n";
else
cText += " &" + rcbs + ",\n";
if (gseCBs == "NULL")
cText += " " + gseCBs + ",\n";
else
cText += " &" + gseCBs + ",\n";
if (svCBs == "NULL")
cText += " " + svCBs + ",\n";
else
cText += " &" + svCBs + ",\n";
if (sgcbs == "NULL")
cText += " " + sgcbs + ",\n";
else
cText += " &" + sgcbs + ",\n";
if (lcbs == "NULL")
cText += " " + lcbs + ",\n";
else
cText += " &" + lcbs + ",\n";
if (logs == "NULL")
cText += " " + logs + ",\n";
else
cText += " &" + logs + ",\n";
cText += " initializeValues\n";
cText += "};";
return cText;
}
}
public class C_DatasetEntry
{
public string externDataSetName = "";
public string logicalDeviceName = "";
public bool isLDNameDynamicallyAllocated;
public string variableName = "";
public int index = -1;
public string componentName = "NULL";
public string value = "NULL";
public string sibling = "NULL";
public C_DatasetEntry()
{ }
public string externDataSetNameToString()
{
return "extern DataSetEntry " + externDataSetName + ";";
}
public override string ToString()
{
string cText = "DataSetEntry " + externDataSetName + " = {\n";
cText += " \"" + logicalDeviceName + "\",\n";
cText += " " + isLDNameDynamicallyAllocated.ToString().ToLower() + ",\n";
cText += " \"" + variableName + "\",\n";
cText += " " + index.ToString() + ",\n";
if (componentName != "NULL")
cText += " " + componentName + ",\n";
else
cText += " " + componentName + ",\n";
cText += " " + value + ",\n";
if (sibling == "NULL")
cText += " " + sibling + "\n";
else
cText += " &" + sibling + "\n";
cText += "};";
return cText;
}
}
}

@ -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,76 @@
<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="..\ModelGenerator\ModelGenerator.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,102 @@
/*
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
*
* This file is part of MZ Automation IEC 61850 SDK
*
* All rights reserved.
*/
using ModelGenerator;
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)
{
string icdFile = "ICDFiles//simpleIO_ltrk_tests.icd";
string outputFileName = "static_model";
string accessPointName = null;
string iedName = null;
string modelPrefix = "iedModel";
bool initializeOnce = false;
Console.WriteLine("Usage: genmodel <ICD file> [-ied <ied-name>] [-ap <access-point-name>] [-out <output-name>] [-modelprefix <model-prefix>]");
if (args.Count() > 0)
{
icdFile = args[0];
for (int i = 1; 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] + "\"");
}
}
}
// Creating file streams
FileStream cOutStream = new FileStream(outputFileName + ".c", FileMode.Create, FileAccess.Write);
FileStream hOutStream = new FileStream(outputFileName + ".h", FileMode.Create, FileAccess.Write);
Console.WriteLine("Select ICD File " + icdFile);
try
{
new StaticModelGenerator(icdFile, icdFile, cOutStream, hOutStream, outputFileName, iedName, accessPointName, modelPrefix, initializeOnce);
}
catch (Exception e)
{
Console.WriteLine("ERROR: " + e.ToString());
}
}
}
}
Loading…
Cancel
Save