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

v1.6
unknown 3 months ago
commit 94be484b6a

@ -9,6 +9,7 @@
using IEC61850.SCL.DataModel; using IEC61850.SCL.DataModel;
using System; using System;
using System.IO; using System.IO;
using System.Runtime.Serialization;
namespace IEC61850.SCL namespace IEC61850.SCL
{ {
@ -434,281 +435,144 @@ namespace IEC61850.SCL
return null; return null;
} }
DataObject findDOParent(DataAttribute dataAttribute) SclDAI getNestedDAI(SclDOI initialDO, string name)
{
DataObject parentObject = null;
while (!(dataAttribute.Parent is DataObject))
{ {
dataAttribute = dataAttribute.Parent as DataAttribute; string[] parts = name.Split('.');
}
parentObject = dataAttribute.Parent as DataObject;
return parentObject; object obj = null;
Object foundObject = initialDO;
SclDAI sclDAI = null;
} for( int i = 1; i < parts.Length; i++)
LogicalNode findLNParent(DataObject dataObject)
{ {
LogicalNode parentObject = null; if (i == 1)
foundObject = initialDO.SclSDIs.Find(x => x.Name == parts[1]);
while (!(dataObject.Parent is LogicalNode)) else if (i == parts.Length - 1)
{ {
dataObject = dataObject.Parent as DataObject; SclSDI sclSDI = foundObject as SclSDI;
} sclDAI = sclSDI?.SclDAIs.Find(x => x.Name == parts[i]);
parentObject = dataObject.Parent as LogicalNode;
return parentObject;
} }
else
public SclDataAttributeDefinition GetDA(string name, SclDOType doType)
{
foreach (SclDataAttributeDefinition sclDa in doType.DataAttributes)
{ {
if (sclDa.Name != null && sclDa.Name.Equals(name)) if (foundObject is SclSDI sclSDI)
return sclDa; foundObject = sclSDI.SclSDIs.Find(x => x.Name == parts[i]);
} }
return null;
}
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 sclDAI;
} }
return returnValue; DataObject findDOParent(DataAttribute dataAttribute)
}
string getSDIValue(DataAttribute dataAttribute, object DIObject)
{ {
string value = null; DataObject parentObject = null;
SclSDI sclSDI1 = DIObject as SclSDI;
if (sclSDI1 == null)
return value;
SclDAI sclDAI = getDAIInternal(sclSDI1, dataAttribute);
if (sclDAI != null) while (!(dataAttribute.Parent is DataObject))
{ {
dataAttribute = dataAttribute.Parent as DataAttribute;
value = sclDAI.Val;
} }
parentObject = dataAttribute.Parent as DataObject;
else while((parentObject.Parent is LogicalNode) == false)
{ {
foreach (SclSDI sclSDI in sclSDI1.SclSDIs) parentObject = parentObject.Parent as DataObject;
{
string fValue = getSDIValue(dataAttribute, sclSDI);
if (fValue != null)
{
value = fValue;
break;
}
}
} }
return parentObject;
return value;
} }
string getDAIValue(DataAttribute dataAttribute, SclDOI sclDOI) LogicalNode findLNParent(DataObject dataObject)
{ {
if (sclDOI == null) LogicalNode parentObject = null;
return null;
string value = null; while (!(dataObject.Parent is LogicalNode))
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; dataObject = dataObject.Parent as DataObject;
break;
}
}
} }
parentObject = dataObject.Parent as LogicalNode;
return value;
}
string getObjRef(string initialString, SclSDI sclSDI) return parentObject;
{
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;
//string recreateObjectReference(DataObject dataObject, SclSDI sclSDI, LogicalNode logicalNode)
//{
// string result = "";
return doName; // object parent = sclSDI.Parent;
} // while (!(parent is SclDOI))
SclSDI getSDIIInternal(SclSDI sclSDI, DataObject dataObject, LogicalNode logicalNode) // {
{ // SclSDI sclSDI1 = parent as SclSDI;
SclSDI returnValue = null; // parent = sclSDI1.Parent;
foreach (SclSDI sclSDI1 in sclSDI.SclSDIs)
{
if (sclSDI1.Name == dataObject.Name)
{
string hh = ((LogicalDevice)logicalNode.Parent).Name + "/" + logicalNode.Name;
string objRefString = getObjRef(hh, sclSDI); // result = result.Insert(0, "." + sclSDI1.Name);
if (dataObject.ObjRef.StartsWith(objRefString)) // }
{ // SclDOI doName = (SclDOI)parent;
// result = result.Insert(0, doName.Name);
returnValue = sclSDI1; // LogicalDevice logicalDevice = logicalNode.Parent as LogicalDevice;
break;
} // result = result.Insert(0, logicalDevice.Name + "/" + logicalNode.Name + ".");
}
}
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); // return result;
//}
if (sclSDI_internal != null) string getStippedObjRef(string objRef)
{ {
string result = "";
return sclSDI_internal; int index = objRef.IndexOf('.');
}
else if (index >= 0 && index < objRef.Length - 1)
{
foreach (SclSDI sclSDI in sclSDI1.SclSDIs)
{ {
SclSDI sclSDI2 = getSDI(logicalNode, dataObject, sclSDI); result = objRef.Substring(index + 1);
if (sclSDI2 != null)
{
returnValue = sclSDI2;
break;
}
}
}
return returnValue;
} }
SclDOI getSDO(LogicalNode logicalNode, DataObject dataObject) return result;
{
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) void printDataAttributes(StreamWriter output, DataAttribute dataAttribute, bool isTransient)
{ {
if (dataAttribute.ObjRef.Contains("serNum"))
{
Console.WriteLine("Debug");
}
if (dataAttribute.AttributeType != AttributeType.CONSTRUCTED) if (dataAttribute.AttributeType != AttributeType.CONSTRUCTED)
{ {
DataObject dataObject = findDOParent(dataAttribute); DataObject dataObject = findDOParent(dataAttribute);
LogicalNode logicalNode = findLNParent(dataObject); LogicalNode logicalNode = findLNParent(dataObject);
LogicalDevice logicalDevice = logicalNode.Parent as LogicalDevice;
string value = null;
SclDOI sclDOI = logicalNode.SclElement.DOIs.Find(x => x.Name == dataObject.Name); SclDOI sclDOI = logicalNode.SclElement.DOIs.Find(x => x.Name == dataObject.Name);
if (sclDOI == null) if(sclDOI == null)
{ {
sclDOI = getSDO(logicalNode, dataObject); output.WriteLine(";");
} return;
SclDAI sclDAI = getDAI(sclDOI, dataAttribute.Name);
string obValue = getDAIValue(dataAttribute, sclDOI);
if (obValue == null) }
SclDAI sclDAI = sclDOI.SclDAIs.Find(x => x.Name == dataAttribute.Name);
if (sclDAI != null && dataAttribute.ObjRef == logicalDevice.Name + "/" + logicalNode.Name + "." + sclDOI.Name + "." + sclDAI.Name)
{ {
output.WriteLine(";"); value = sclDAI.Val;
}
return; else
{
string strippedObjRef = getStippedObjRef(dataAttribute.ObjRef);
sclDAI = getNestedDAI(sclDOI, strippedObjRef);
value = sclDAI?.Val;
} }
string value = obValue;
if (value != null) if (value != null)
{ {
@ -721,7 +585,7 @@ namespace IEC61850.SCL
{ {
if (sclEnumType.EnumValues.Count > 0) if (sclEnumType.EnumValues.Count > 0)
{ {
SclEnumVal sclEnumVal = sclEnumType.EnumValues[0]; SclEnumVal sclEnumVal = sclEnumType.EnumValues.Find(x => x.SymbolicName == value);
int value1 = sclEnumVal.Ord; int value1 = sclEnumVal.Ord;
output.Write("=" + sclEnumVal.Ord); output.Write("=" + sclEnumVal.Ord);

@ -14,6 +14,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Xml.Linq;
using DataSet = IEC61850.SCL.DataModel.DataSet; using DataSet = IEC61850.SCL.DataModel.DataSet;
namespace StaticModelGenerator namespace StaticModelGenerator
@ -318,6 +319,46 @@ namespace StaticModelGenerator
return iecString.Replace('.', '$'); return iecString.Replace('.', '$');
} }
DataObject findDOParent(DataAttribute dataAttribute)
{
DataObject parentObject = null;
while (!(dataAttribute.Parent is DataObject))
{
dataAttribute = dataAttribute.Parent as DataAttribute;
}
parentObject = dataAttribute.Parent as DataObject;
while ((parentObject.Parent is LogicalNode) == false)
{
parentObject = parentObject.Parent as DataObject;
}
return parentObject;
}
LogicalNode findLNParent(DataObject dataObject)
{
LogicalNode parentObject = null;
while (!(dataObject.Parent is LogicalNode))
{
dataObject = dataObject.Parent as DataObject;
}
parentObject = dataObject.Parent as LogicalNode;
return parentObject;
}
private void createDataObjectCStructure(List<C_DO_DA_Structure> c_DO_DA_Structures, string dataAttributeSibling, string lnRef, DataObject dataObject, object parent, bool isTransiente, object sclDOI, int arrayIdx) private void createDataObjectCStructure(List<C_DO_DA_Structure> c_DO_DA_Structures, string dataAttributeSibling, string lnRef, DataObject dataObject, object parent, bool isTransiente, object sclDOI, int arrayIdx)
{ {
C_DataObjectStructure c_DataObjectStructure = new C_DataObjectStructure(); C_DataObjectStructure c_DataObjectStructure = new C_DataObjectStructure();
@ -398,6 +439,10 @@ namespace StaticModelGenerator
DataObjectOrAttribute dataObjectOrAttribute1 = dataObject.DataObjectsAndAttributes.First(); DataObjectOrAttribute dataObjectOrAttribute1 = dataObject.DataObjectsAndAttributes.First();
if (dataObjectOrAttribute1 is DataAttribute da) if (dataObjectOrAttribute1 is DataAttribute da)
firstDataAttributeName = da.Name; firstDataAttributeName = da.Name;
else
{
firstDataAttributeName = lnRef;
}
c_ArrayDataObjectStructure.child = c_ArrayDataObjectStructure.objRef + "_" + dataObject.DataObjectsAndAttributes.First().Name; c_ArrayDataObjectStructure.child = c_ArrayDataObjectStructure.objRef + "_" + dataObject.DataObjectsAndAttributes.First().Name;
@ -407,6 +452,8 @@ namespace StaticModelGenerator
{ {
SclSDI sclSDO = getSDI(sclDOI, dataObject.Name); SclSDI sclSDO = getSDI(sclDOI, dataObject.Name);
firstDataAttributeName += "_" + dataObject.Name;
createDataObjectCStructure(c_DO_DA_Structures, c_DataObjectStructure.objRef, firstDataAttributeName, doObj, dataObject, isDoTransient, sclSDO, -1); createDataObjectCStructure(c_DO_DA_Structures, c_DataObjectStructure.objRef, firstDataAttributeName, doObj, dataObject, isDoTransient, sclSDO, -1);
} }
@ -429,11 +476,17 @@ namespace StaticModelGenerator
DataObjectOrAttribute dataObjectOrAttribute1 = dataObject.DataObjectsAndAttributes.First(); DataObjectOrAttribute dataObjectOrAttribute1 = dataObject.DataObjectsAndAttributes.First();
if (dataObjectOrAttribute1 is DataAttribute da) if (dataObjectOrAttribute1 is DataAttribute da)
firstDataAttributeName = da.Name; firstDataAttributeName = da.Name;
else
{
firstDataAttributeName = lnRef;
}
foreach (DataObjectOrAttribute dataObjectOrAttribute in dataObject.DataObjectsAndAttributes) foreach (DataObjectOrAttribute dataObjectOrAttribute in dataObject.DataObjectsAndAttributes)
{ {
if (dataObjectOrAttribute is DataObject doObj) if (dataObjectOrAttribute is DataObject doObj)
{ {
firstDataAttributeName += "_" + dataObject.Name;
SclSDI sclSDO = getSDI(sclDOI, dataObject.Name); SclSDI sclSDO = getSDI(sclDOI, dataObject.Name);
createDataObjectCStructure(c_DO_DA_Structures, c_DataObjectStructure.objRef, firstDataAttributeName, doObj, dataObject, isDoTransient, sclSDO, -1); createDataObjectCStructure(c_DO_DA_Structures, c_DataObjectStructure.objRef, firstDataAttributeName, doObj, dataObject, isDoTransient, sclSDO, -1);
@ -604,11 +657,35 @@ namespace StaticModelGenerator
} }
} }
SclDAI sclDAI = getDAI(daiObj, dataAttribute.Name); DataObject dataObject = findDOParent(dataAttribute);
LogicalNode logicalNode = findLNParent(dataObject);
LogicalDevice logicalDevice = logicalNode.Parent as LogicalDevice;
string value = null;
SclDOI sclDOI = logicalNode.SclElement.DOIs.Find(x => x.Name == dataObject.Name);
SclDAI sclDAI1 = null;
if (sclDOI != null)
{
SclDAI sclDAI = sclDOI.SclDAIs.Find(x => x.Name == dataAttribute.Name);
if (sclDAI != null && dataAttribute.ObjRef == logicalDevice.Name + "/" + logicalNode.Name + "." + sclDOI.Name + "." + sclDAI.Name)
{
sclDAI1 = sclDAI;
}
else
{
sclDAI1 = getNestedDAI(sclDOI, dataAttribute.ObjRef);
}
}
if (sclDAI != null) if (sclDAI1 != null)
if (sclDAI.Val != null) if (sclDAI1.Val != null)
printValue(c_DataAttributeStructure, sclDAI.Val); printValue(c_DataAttributeStructure, sclDAI1.Val);
} }
SclDAI getDAI(object parent, string name) SclDAI getDAI(object parent, string name)
@ -637,6 +714,67 @@ namespace StaticModelGenerator
return null; return null;
} }
SclSDI getSDINested(object parent, string name)
{
if (parent == null)
return null;
if (parent is SclDOI sclDOI)
return sclDOI.SclSDIs.Find(x => x.Name == name);
else if (parent is SclSDI sclSDI)
return sclSDI.SclSDIs.Find(x => x.Name == name);
else
return null;
}
string getStippedObjRef(string objRef)
{
string result = "";
int index = objRef.IndexOf('.');
if (index >= 0 && index < objRef.Length - 1)
{
result = objRef.Substring(index + 1);
}
return result;
}
SclDAI getNestedDAI(SclDOI initialDO, string name)
{
string strippedObjRef = getStippedObjRef(name);
string[] parts = strippedObjRef.Split('.');
object obj = null;
Object foundObject = initialDO;
SclDAI sclDAI = null;
for (int i = 1; i < parts.Length; i++)
{
if (i == 1)
foundObject = initialDO.SclSDIs.Find(x => x.Name == parts[1]);
else if (i == parts.Length - 1)
{
SclSDI sclSDI = foundObject as SclSDI;
sclDAI = sclSDI?.SclDAIs.Find(x => x.Name == parts[i]);
}
else
{
if (foundObject is SclSDI sclSDI)
foundObject = sclSDI.SclSDIs.Find(x => x.Name == parts[i]);
}
}
return sclDAI;
}
private void printValue(C_DataAttributeStructure c_DataAttributeStructure, string value) private void printValue(C_DataAttributeStructure c_DataAttributeStructure, string value)
{ {
C_InitializeValues c_InitializeValue = new C_InitializeValues(); C_InitializeValues c_InitializeValue = new C_InitializeValues();
@ -653,6 +791,9 @@ namespace StaticModelGenerator
switch (c_DataAttributeStructure.DataAttribute.AttributeType) switch (c_DataAttributeStructure.DataAttribute.AttributeType)
{ {
case AttributeType.INT8:
case AttributeType.INT16:
case AttributeType.INT32:
case AttributeType.INT64: case AttributeType.INT64:
c_InitializeValue.c_text += "MmsValue_newIntegerFromInt32(" + value + ");"; c_InitializeValue.c_text += "MmsValue_newIntegerFromInt32(" + value + ");";
break; break;
@ -688,6 +829,9 @@ namespace StaticModelGenerator
} }
break; break;
case AttributeType.INT8U:
case AttributeType.INT16U:
case AttributeType.INT24U:
case AttributeType.INT32U: case AttributeType.INT32U:
c_InitializeValue.c_text += "MmsValue_newUnsignedFromUint32(" + value + ");"; c_InitializeValue.c_text += "MmsValue_newUnsignedFromUint32(" + value + ");";
break; break;
@ -737,7 +881,11 @@ namespace StaticModelGenerator
c_InitializeValue.c_text += "MmsValue_newUtcTimeByMsTime(" + value + ");"; c_InitializeValue.c_text += "MmsValue_newUtcTimeByMsTime(" + value + ");";
break; break;
case AttributeType.VISIBLE_STRING_32:
case AttributeType.VISIBLE_STRING_64:
case AttributeType.VISIBLE_STRING_129:
case AttributeType.VISIBLE_STRING_255: case AttributeType.VISIBLE_STRING_255:
case AttributeType.VISIBLE_STRING_65:
c_InitializeValue.c_text += "MmsValue_newVisibleString(\"" + value + "\");"; c_InitializeValue.c_text += "MmsValue_newVisibleString(\"" + value + "\");";
break; break;

Loading…
Cancel
Save