Create/Fill Complex Datastructure

Questions regarding the use of the .NET SDK 2.0 for Server or Client development or integration into customer products ...

Moderator: uasdknet

Post Reply
SysTester
Full Member
Full Member
Posts: 8
Joined: 13 Apr 2016, 18:38

Create/Fill Complex Datastructure

Post by SysTester »

Hey there,

After I managed to get some DataTypeDescription from the Server (without using UAModeler Files) I wanted to create a complex structure, matching the given DataType and pass it to the inputArguments-list.
The question is - how to do that?

Here is, what I've got:

Code: Select all

// Some code for getting Parameters dynamically in combination with Click_Events
// ...

// Create new instance of datatypemanager
DataTypeManager mgr = new DataTypeManager(session);

// Get DataType Description/Dictionary
DataTypeDescription descType = mgr.GetDescriptionFromEncoding(nodeId, true);
DataTypeDictionary myDict = descType.Dictionary;

// BinaryBuilder
BinarySchemaBuilder bBuilder = new BinarySchemaBuilder(myDict.SchemaData);

// Get GenericDataType
GenericStructureDataType dType = (GenericStructureDataType)bBuilder.NewTypeFromDictionary(new XmlQualifiedName("name", "namespace"));

// => So I get the Description of my Datatype, which contains Int32, Double, Bit, Enum...

How can I create a ComplexDataType (ExtensionObject?) reflecting dType-Description, fill this structure with values, and pass it to the inputArgs of a method (for a Call())?

Thank you for your help

User avatar
Support Team
Hero Member
Hero Member
Posts: 3072
Joined: 18 Mar 2011, 15:09

Re: Create/Fill Complex Datastructure

Post by Support Team »

Hello,

You can get the information about the structure using the method NewTypeFromDataType. Using the method from the returned GenericStructureDataType you can construct an instance of GenericEncodeableObject and put it to the inputArguments list.

Code: Select all

public void VectorAdd()
{
    NodeId objectId = new NodeId(UnifiedAutomation.Demo.Model.Objects.Demo_Method, NamespaceIndex);
    NodeId methodId = new NodeId(UnifiedAutomation.Demo.Model.Methods.Demo_Method_VectorAdd, NamespaceIndex);

    DataTypeManager dataTypeManager = new DataTypeManager(Session);
    ModelManager modelManager = new ModelManager(Session);
    MethodDescription methodDescription = modelManager.GetMethodDescription(methodId);

    List<Variant> inputArguments = new List<Variant>();
    List<StatusCode> inputArgumentResults;
    List<Variant> outputArguments;

    foreach (Argument argument in methodDescription.InputArguments)
    {
        if (argument.ValueRank == -1)
        {
            switch (TypeUtils.GetBuiltInType(argument.DataType, Session.Cache))
            {
                case BuiltInType.Boolean:
                    inputArguments.Add(new Variant(true));
                    break;
                // ...
                case BuiltInType.ExtensionObject:
                    {
                        GenericStructureDataType structure = dataTypeManager.NewTypeFromDataType(argument.DataType, null, false);
                        GenericEncodeableObject encodeable = GuessEncodeable(structure);
                        inputArguments.Add(new Variant(encodeable));
                    }
                    break;
            }
        }
    }

    Session.Call(objectId, methodId, inputArguments, out inputArgumentResults, out outputArguments);
}

GenericEncodeableObject GuessEncodeable(GenericStructureDataType dataType)
{
    GenericEncodeableObject encodeable = new GenericEncodeableObject(dataType);

    for (int i=0; i<dataType.Count; i++)
    {
        if (dataType[i].ValueRank == -1)
        {
            switch (dataType[i].TypeDescription.TypeClass)
            {
                case GenericDataTypeClass.Simple:
                    switch ((dataType[i].TypeDescription as GenericSimpleDataType).BuiltInType)
                    {
                        case BuiltInType.Double:
                            encodeable[i] = 1.11;
                            break;
                    }
                    break;
                // ...
                default:break;
            }
        }
    }

    return encodeable;
}


Best regards
Support Team

SysTester
Full Member
Full Member
Posts: 8
Joined: 13 Apr 2016, 18:38

Re: Create/Fill Complex Datastructure

Post by SysTester »

Hello,

thank you for the great support and assistance!

Post Reply