Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 96 additions & 53 deletions NodeSetToAML.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@
using System.Reflection;
using System.Xml;
using Opc2Aml;
using Newtonsoft.Json.Linq;


namespace MarkdownProcessor
Expand Down Expand Up @@ -107,6 +106,7 @@ public class NodeSetToAML
private readonly NodeId IntegerNodeId = Opc.Ua.DataTypeIds.Integer;

private readonly System.Xml.Linq.XNamespace defaultNS = "http://www.dke.de/CAEX";
private const string OpcUaTypeOnly = "OpcUa:TypeOnly";
private const string uaNamespaceURI = "http://opcfoundation.org/UA/";
private const string OpcLibInfoNamespace = "http://opcfoundation.org/UA/FX/2021/08/OpcUaLibInfo.xsd";
private UANode structureNode;
Expand Down Expand Up @@ -1678,7 +1678,7 @@ private AttributeType OverrideBooleanAttribute(AttributeSequence seq,
var at = AddModifyAttribute(seq, AttributeName, "Boolean", value);
if (at != null && typeOnly)
{
at.AdditionalInformation.Append("OpcUa:TypeOnly");
at.AdditionalInformation.Append(OpcUaTypeOnly);
}
return at;
}
Expand Down Expand Up @@ -2707,7 +2707,7 @@ private void OverrideAttribute(IClassWithBaseClassReference owner,
a.AttributeDataType = AttType;
a.AttributeValue = value;

a.AdditionalInformation.Append("OpcUa:TypeOnly");
a.AdditionalInformation.Append(OpcUaTypeOnly);
}

private void ProcessReferenceType(ref InterfaceClassLibType icl, NodeId nodeId)
Expand Down Expand Up @@ -2772,7 +2772,7 @@ private void ProcessReferenceType(ref InterfaceClassLibType icl, NodeId nodeId)
AttributeType inverseNameAttribute = AddModifyAttribute(added.Attribute,
"InverseName", "LocalizedText", refnode.InverseName[0].Value);
RemoveUnwantedNodeIdAttribute(inverseNameAttribute);
inverseNameAttribute.AdditionalInformation.Append("OpcUa:TypeOnly");
inverseNameAttribute.AdditionalInformation.Append(OpcUaTypeOnly);
}

// Need typeonly here
Expand All @@ -2798,15 +2798,15 @@ private void ProcessReferenceType(ref InterfaceClassLibType icl, NodeId nodeId)
AttributeType inverseNameAttribute = AddModifyAttribute(
inverseAdded.Attribute, "InverseName", "LocalizedText", refnode.DecodedBrowseName.Name);
RemoveUnwantedNodeIdAttribute(inverseNameAttribute);
inverseNameAttribute.AdditionalInformation.Append("OpcUa:TypeOnly");
inverseNameAttribute.AdditionalInformation.Append(OpcUaTypeOnly);

OverrideAttribute(inverseAdded, IsSource, "xs:boolean", false);
OverrideAttribute(inverseAdded, RefClassConnectsToPath, "xs:string", added.CAEXPath());
}
}

AttributeType nodeIdAttribute = AddModifyAttribute(added.Attribute, "NodeId", "NodeId", new Variant( nodeId ) );
nodeIdAttribute.AdditionalInformation.Append( "OpcUa:TypeOnly" );
nodeIdAttribute.AdditionalInformation.Append( OpcUaTypeOnly );
MinimizeNodeId( nodeIdAttribute );
}

Expand All @@ -2822,6 +2822,21 @@ private void RemoveUnwantedNodeIdAttribute( AttributeType attribute )
}
}

private void RemoveNodeIdsFromDefinition(AttributeType attribute)
{
if (attribute != null)
{
foreach (AttributeType indexAttribute in attribute.Attribute)
{
RemoveUnwantedNodeIdAttribute(indexAttribute);
foreach (AttributeType fieldAttribute in indexAttribute.Attribute)
{
RemoveUnwantedNodeIdAttribute(fieldAttribute);
}
}
}
}

#endregion


Expand All @@ -2847,48 +2862,32 @@ end Mantis #7383 */

private void ProcessEnumerations(ref AttributeTypeType att, NodeId nodeId)
{
NodeId EnumStringsPropertyId = m_modelManager.FindFirstTarget(nodeId, HasPropertyNodeId, true, "EnumStrings");
if (EnumStringsPropertyId != null)
NodeId enumTypeNodeId = m_modelManager.FindFirstTarget(nodeId, HasPropertyNodeId, true, "EnumStrings");
if (enumTypeNodeId == null)
{
UADataType enumNode = FindNode<UADataType>( nodeId );
enumTypeNodeId = m_modelManager.FindFirstTarget(nodeId, HasPropertyNodeId, true, "EnumValues");
}

if (enumTypeNodeId != null)
{
att.AttributeDataType = "xs:string";
UAVariable EnumStrings = FindNode<UAVariable>(EnumStringsPropertyId);

AttributeValueRequirementType stringValueRequirement = new AttributeValueRequirementType( new System.Xml.Linq.XElement( defaultNS + "Constraint" ) );
UADataType MyNode = FindNode<UADataType>(nodeId);
stringValueRequirement.Name = MyNode.DecodedBrowseName.Name + " Constraint";
NominalScaledTypeType stringValueNominalType = stringValueRequirement.New_NominalType();

Opc.Ua.LocalizedText[] EnumValues = EnumStrings.DecodedValue.Value as Opc.Ua.LocalizedText[];
foreach ( Opc.Ua.LocalizedText EnumValue in EnumValues )
if (MyNode.Definition != null && MyNode.Definition.Field != null && MyNode.Definition.Field.Length > 0)
{
stringValueNominalType.RequiredValue.Append( EnumValue.Text );
}
AttributeValueRequirementType stringValueRequirement = new AttributeValueRequirementType(new System.Xml.Linq.XElement(defaultNS + "Constraint"));

att.Constraint.Insert( stringValueRequirement );
return;
}
stringValueRequirement.Name = MyNode.DecodedBrowseName.Name + " Constraint";
NominalScaledTypeType stringValueNominalType = stringValueRequirement.New_NominalType();

NodeId EnumValuesPropertyId = m_modelManager.FindFirstTarget(nodeId, HasPropertyNodeId, true, "EnumValues");
if (EnumValuesPropertyId != null)
{
att.AttributeDataType = "xs:string";
UAVariable EnumValues = FindNode<UAVariable>(EnumValuesPropertyId);
AttributeValueRequirementType stringValueRequirement = new AttributeValueRequirementType( new System.Xml.Linq.XElement( defaultNS + "Constraint" ) );
UADataType MyNode = FindNode<UADataType>(nodeId);

stringValueRequirement.Name = MyNode.DecodedBrowseName.Name + " Constraint";
NominalScaledTypeType stringValueNominalType = stringValueRequirement.New_NominalType();
foreach (DataTypeField field in MyNode.Definition.Field)
{
stringValueNominalType.RequiredValue.Append(field.Name);
}

ExtensionObject[] EnumVals = EnumValues.DecodedValue.Value as ExtensionObject[];
foreach ( ExtensionObject EnumValue in EnumVals )
{
EnumValueType ev = EnumValue.Body as EnumValueType;
stringValueNominalType.RequiredValue.Append( ev.DisplayName.Text );
att.Constraint.Insert(stringValueRequirement);
}

att.Constraint.Insert( stringValueRequirement );
}
}

Expand Down Expand Up @@ -3105,7 +3104,7 @@ private void AddAttributeData( AttributeFamilyType attribute, UANode uaNode )

MinimizeNodeId( nodeIdAttribute );

nodeIdAttribute.AdditionalInformation.Append( "OpcUa:TypeOnly" );
nodeIdAttribute.AdditionalInformation.Append( OpcUaTypeOnly );
}


Expand Down Expand Up @@ -3143,7 +3142,7 @@ private void AddStructureFieldDefinition( AttributeFamilyType attribute, UANode

structureFieldAttribute.RecreateAttributeInstance( structureFieldDefinition as AttributeFamilyType );
structureFieldAttribute.Name = "StructureFieldDefinition";
structureFieldAttribute.AdditionalInformation.Append( "OpcUa:TypeOnly" );
structureFieldAttribute.AdditionalInformation.Append( OpcUaTypeOnly );


// Now fill the data
Expand Down Expand Up @@ -3188,15 +3187,51 @@ private void AddStructureFieldDefinition( AttributeFamilyType attribute, UANode
private void AddEnumerationFieldDefinition(AttributeFamilyType attribute, UANode uaNode)
{
UADataType enumNode = uaNode as UADataType;
if (enumNode != null &&
enumNode.Definition != null &&
if (enumNode != null &&
enumNode.Definition != null &&
enumNode.Definition.Field != null &&
enumNode.Definition.Field.Length > 0 )
enumNode.Definition.Field.Length > 0)
{
string enumPath = BuildLibraryReference(ATLPrefix, Opc.Ua.Namespaces.OpcUa, Enumeration);

if (attribute.RefBaseClassPath.Equals(enumPath))
{
NodeId enumStringsNodeId = m_modelManager.FindFirstTarget(uaNode.DecodedNodeId,
HasPropertyNodeId, true, "EnumStrings");
if (enumStringsNodeId != null)
{
UAVariable enumStrings = FindNode<UAVariable>(enumStringsNodeId);
AttributeType added = AddModifyAttribute(attribute.Attribute, "EnumStrings", "LocalizedText",
enumStrings.DecodedValue, bListOf: true);
if (added != null)
{
added.AdditionalInformation.Append(OpcUaTypeOnly);
RemoveNodeIdsFromDefinition(added);

AttributeType nodeIdAttribute = AddModifyAttribute(added.Attribute,
"NodeId", "NodeId", new Variant(enumStringsNodeId));
}
}
else
{
NodeId EnumValuesPropertyId = m_modelManager.FindFirstTarget(uaNode.DecodedNodeId, HasPropertyNodeId, true, "EnumValues");
if (EnumValuesPropertyId != null)
{
UAVariable enumValues = FindNode<UAVariable>(EnumValuesPropertyId);
AttributeType added = AddModifyAttribute(attribute.Attribute, "EnumValues", "EnumValueType",
enumValues.DecodedValue, bListOf: true);
if (added != null)
{
RemoveNodeIdsFromDefinition(added);

AttributeType nodeIdAttribute = AddModifyAttribute(added.Attribute,
"NodeId", "NodeId", new Variant(EnumValuesPropertyId));

added.AdditionalInformation.Append(OpcUaTypeOnly);
}
}
}

string path = BuildLibraryReference(ATLPrefix, Opc.Ua.Namespaces.OpcUa, "ListOfEnumField");
AttributeFamilyType enumFieldDefinition = m_cAEXDocument.FindByPath(path) as AttributeFamilyType;

Expand All @@ -3205,42 +3240,52 @@ private void AddEnumerationFieldDefinition(AttributeFamilyType attribute, UANode

enumFields.RecreateAttributeInstance(enumFieldDefinition as AttributeFamilyType);
enumFields.Name = "EnumFieldDefinition";
enumFields.AdditionalInformation.Append("OpcUa:TypeOnly");
enumFields.AdditionalInformation.Append(OpcUaTypeOnly);

string enumFieldPath = BuildLibraryReference(ATLPrefix, Opc.Ua.Namespaces.OpcUa, "EnumField");
AttributeFamilyType enumFieldSource = m_cAEXDocument.FindByPath(enumFieldPath) as AttributeFamilyType;

foreach (DataTypeField fieldDefinition in enumNode.Definition.Field)
{
AttributeType fieldAttribute = new AttributeType( new System.Xml.Linq.XElement(defaultNS + "Attribute"));
AttributeType fieldAttribute = new AttributeType(new System.Xml.Linq.XElement(defaultNS + "Attribute"));

fieldAttribute.RecreateAttributeInstance(enumFieldSource);
fieldAttribute.Name = fieldDefinition.Name;

AddModifyAttribute(fieldAttribute.Attribute,
"Name", "String", new Variant(fieldDefinition.Name));

LocalizedText descriptionLocalizedText = new LocalizedText("");

if (fieldDefinition.Description != null && fieldDefinition.Description.Length > 0)
{
LocalizedText localizedText = new LocalizedText(
descriptionLocalizedText = new LocalizedText(
fieldDefinition.Description[0].Locale, fieldDefinition.Description[0].Value);
AddModifyAttribute(fieldAttribute.Attribute,
"Description", "LocalizedText", new Variant(localizedText));
}

AddModifyAttribute(fieldAttribute.Attribute, "Description", "LocalizedText",
new Variant(descriptionLocalizedText));

LocalizedText displayNameLocalizedText = new LocalizedText("");

if (fieldDefinition.DisplayName != null && fieldDefinition.DisplayName.Length > 0)
{
LocalizedText localizedText = new LocalizedText(
displayNameLocalizedText = new LocalizedText(
fieldDefinition.DisplayName[0].Locale, fieldDefinition.DisplayName[0].Value);
AddModifyAttribute(fieldAttribute.Attribute,
"DisplayName", "LocalizedText", new Variant(localizedText));
}

AddModifyAttribute(fieldAttribute.Attribute, "DisplayName", "LocalizedText",
new Variant(displayNameLocalizedText));

AddModifyAttribute(fieldAttribute.Attribute,
"Value", "Int32", new Variant(fieldDefinition.Value));

RemoveNodeIdsFromDefinition(fieldAttribute);

enumFields.Attribute.Insert(fieldAttribute, false, true);
}
RemoveNodeIdsFromDefinition(enumFields);

attribute.Attribute.Insert(enumFields, false, true);
}
}
Expand Down Expand Up @@ -3963,7 +4008,7 @@ private void RemoveTypeOnlyAttributes( AttributeSequence attributes, string path
{
string isTypeOnly = additionalInformation as string;
if ( !string.IsNullOrEmpty( isTypeOnly ) &&
isTypeOnly == "OpcUa:TypeOnly" )
isTypeOnly == OpcUaTypeOnly )
{
attributesToRemove.Add( attribute );
break;
Expand All @@ -3975,7 +4020,6 @@ private void RemoveTypeOnlyAttributes( AttributeSequence attributes, string path

foreach( AttributeType attribute in attributesToRemove )
{
Utils.LogDebug( "{0} Removing TypeOnly Attribute {1}", path, attribute.Name );
attributes.RemoveElement( attribute );
}

Expand All @@ -3986,7 +4030,6 @@ private void RemoveTypeOnlyAttributes( AttributeSequence attributes, string path
}
}


#endregion
}
}
Loading