diff --git a/tools/model_generator_dotnet/SCLParser/src/DynamicModelGenerator.cs b/tools/model_generator_dotnet/SCLParser/src/DynamicModelGenerator.cs index 46931d54..388a78ee 100644 --- a/tools/model_generator_dotnet/SCLParser/src/DynamicModelGenerator.cs +++ b/tools/model_generator_dotnet/SCLParser/src/DynamicModelGenerator.cs @@ -10,6 +10,7 @@ using IEC61850.SCL.DataModel; using System; using System.IO; using System.Runtime.InteropServices.ComTypes; +using System.Xml.Linq; namespace IEC61850.SCL { @@ -553,29 +554,367 @@ namespace IEC61850.SCL } + public SclDataAttributeDefinition GetDA(string name, SclDOType doType) + { + foreach (SclDataAttributeDefinition sclDa in doType.DataAttributes) + { + if (sclDa.Name != null && sclDa.Name.Equals(name)) + return sclDa; + } + + return null; + } + + //private void SetPredefindedValuesForDAI(LogicalNode ln, DataAttribute dataAttribute, DataObject dataObject) + //{ + // if (dai.Name != null) + // { + + //} + + //private void SetPredefinedValuesForSDI(LogicalNode ln, string path, SclSDI sclSdi, SclDOType doType, SclDAType daType, SclDataTypeTemplates types, DataAttribute dataAttribute) + //{ + // if (sclSdi.Name != null) + // { + // string extendedPath = path + "." + sclSdi.Name; + + // foreach (SclDAI dai in sclSdi.SclDAIs) + // { + // if (doType != null) + // { + // SclDataAttributeDefinition sclDa = GetDA(dai.Name, doType); + + // if (sclDa != null) + // { + // DataAttributeType bType = (DataAttributeType)sclDa.AttributeType; + + // SetPredefindedValuesForDAI(ln, extendedPath, dai, bType, sclDa.Type, types); + // } + // else + // { + // logMessage(IedModelFactoryLogLevel.ERROR, "SCL: DA for name " + dai.Name + " not found"); + // } + // } + // else if (daType != null) + // { + // SclDataAttributeDefinition sclBda = daType.GetBDA(dai.Name); + + // if (sclBda != null) + // { + // DataAttributeType bType = (DataAttributeType)sclBda.AttributeType; + + // SetPredefindedValuesForDAI(ln, extendedPath, dai, bType, sclBda.Type, types); + // } + + // } + // } + + // foreach (SclSDI sdi in sclSdi.SclSDIs) + // { + // if (doType != null) + // { + // SclDataAttributeDefinition da = doType.GetDA(sdi.Name, dataAttribute); + + // if (da != null) + // { + // SclDAType subDaType = types.GetDAType(da.Type); + + // if (subDaType != null) + // { + // SetPredefinedValuesForSDI(ln, extendedPath, sdi, null, subDaType, types); + // } + // } + // else + // { + // SclDataObjectDefinition sdo = doType.GetSDO(sdi.Name); + + // if (sdo != null) + // { + // SclDOType subDoType = types.GetDOType(sdo.Type); + + // if (subDoType != null) + // { + // SetPredefinedValuesForSDI(ln, extendedPath, sdi, subDoType, null, types); + // } + + // } + + // } + // } + // else if (daType != null) + // { + // SclDataAttributeDefinition bda = daType.GetBDA(sdi.Name); + + // if (bda != null) + // { + // SclDAType subDaType = types.GetDAType(bda.Type); + + // if (subDaType != null) + // { + // SetPredefinedValuesForSDI(ln, extendedPath, sdi, null, subDaType, types); + // } + + // } + + // } + // } + // } + //} + + + + //object findValue(DataAttribute dataAttribute) + //{ + // object value = null; + + // if(dataAttribute.Parent is DataAttribute dataAttribute1) + // { + // SclDAI sclDAI = getDAI(dataAttribute1.Parent, dataAttribute.Name); + + + // SclSDO sclSDOI = null; + // sclSDOI. + // } + + // return value; + //} + + SclDAI getDAIInternal(SclSDI sclSDI, DataAttribute dataAttribute) + { + SclDAI returnValue = null; + foreach(SclDAI sclDAI1 in sclSDI.SclDAIs) + { + if(sclDAI1.Name == dataAttribute.Name) + { + if (dataAttribute.ObjRef.EndsWith("." + sclSDI.Name + "." + sclDAI1.Name)) + { + + returnValue = sclDAI1; + break; + + } + } + } + + return returnValue; + } + + string getSDIValue(DataAttribute dataAttribute, object DIObject) + { + string value = null; + + SclSDI sclSDI1 = DIObject as SclSDI; + if (sclSDI1 == null) + return value; + + + SclDAI sclDAI = getDAIInternal(sclSDI1, dataAttribute); + + + if (sclDAI != null) + { + + value = sclDAI.Val; + } + + else + { + foreach (SclSDI sclSDI in sclSDI1.SclSDIs) + { + string fValue = getSDIValue(dataAttribute, sclSDI); + if (fValue != null) + { + value = fValue; + break; + } + } + } + + + return value; + + } + + string getDAIValue(DataAttribute dataAttribute, SclDOI sclDOI) + { + if (sclDOI == null) + return null; + + string value = null; + SclDAI sclDAI = sclDOI.SclDAIs.Find(x => x.Name == dataAttribute.Name); + if (sclDAI != null) + { + value = sclDAI.Val; + } + else + { + foreach (SclSDI sclSDI in sclDOI.SclSDIs) + { + string fValue = getSDIValue(dataAttribute, sclSDI); + if (fValue != null) + { + value = fValue; + break; + } + } + + } + + return value; + + } + + string getObjRef(string initialString, SclSDI sclSDI) + { + object parent = sclSDI.Parent; + while(!(parent is SclDOI)) + { + SclSDI sclSDI1 = parent as SclSDI; + parent = sclSDI1.Parent; + } + SclDOI doName = (SclDOI)parent; + initialString += "." + doName.Name; + + + return initialString; + } + + SclDOI getDOIfromSDAI(SclSDI sclSDI) + { + object parent = sclSDI.Parent; + while (!(parent is SclDOI)) + { + SclSDI sclSDI1 = parent as SclSDI; + parent = sclSDI1.Parent; + } + SclDOI doName = (SclDOI)parent; + + + return doName; + } + SclSDI getSDIIInternal(SclSDI sclSDI, DataObject dataObject, LogicalNode logicalNode) + { + SclSDI returnValue = null; + foreach (SclSDI sclSDI1 in sclSDI.SclSDIs) + { + if (sclSDI1.Name == dataObject.Name) + { + string hh = ((LogicalDevice)logicalNode.Parent).Name + "/" + logicalNode.Name; + + string objRefString = getObjRef(hh, sclSDI); + if (dataObject.ObjRef.StartsWith(objRefString)) + { + + returnValue = sclSDI1; + break; + + } + } + } + + return returnValue; + } + + SclSDI getSDI(LogicalNode logicalNode, DataObject dataObject, object DIObject) + { + SclSDI returnValue = null; + SclSDI sclSDI1 = DIObject as SclSDI; + if (sclSDI1 == null) + return null; + + + SclSDI sclSDI_internal = getSDIIInternal(sclSDI1, dataObject, logicalNode); + + + if (sclSDI_internal != null) + { + + return sclSDI_internal; + } + + else + { + foreach (SclSDI sclSDI in sclSDI1.SclSDIs) + { + SclSDI sclSDI2 = getSDI(logicalNode, dataObject, sclSDI); + if (sclSDI2 != null) + { + returnValue = sclSDI2; + break; + } + + } + } + + + return returnValue; + + } + + SclDOI getSDO(LogicalNode logicalNode, DataObject dataObject) + { + SclSDI returnSDI = null; + + + foreach (SclDOI sclDOI1 in logicalNode.SclElement.DOIs) + { + foreach(SclSDI sclSDI in sclDOI1.SclSDIs) + { + returnSDI = getSDI(logicalNode, dataObject, sclSDI); + if(returnSDI != null) + { + break; + } + } + + if(returnSDI != null) + { + break; + } + } + if (returnSDI == null) + return null; + else + return getDOIfromSDAI(returnSDI); + + } void printDataAttributes(StreamWriter output, DataAttribute dataAttribute, bool isTransient) { + if (dataAttribute.ObjRef.Contains("serNum")) + { + Console.WriteLine("Debug"); + } + if (dataAttribute.AttributeType != AttributeType.CONSTRUCTED) { //if (value != null) //{ - DataObject dataObject = findDOParent(dataAttribute); //DataObject dataObject = dataAttribute.Parent as DataObject; //LogicalNode logicalNode = dataObject.Parent as LogicalNode; LogicalNode logicalNode = findLNParent(dataObject); + SclDOI sclDOI = logicalNode.SclElement.DOIs.Find(x => x.Name == dataObject.Name); + + if(sclDOI == null) + { + sclDOI = getSDO(logicalNode, dataObject); + } SclDAI sclDAI = getDAI(sclDOI, dataAttribute.Name); - if (sclDAI == null) + + string obValue = getDAIValue(dataAttribute, sclDOI); + + if (obValue == null) { output.WriteLine(";"); return; } - string value = sclDAI.Val; + //string value = sclDAI.Val; + string value = obValue; if (value != null) {