Пример #1
0
        public MethodState CreateAddMethodState(
            NodeState parent, AasUaBaseEntity.CreateMode mode,
            string browseDisplayName,
            Argument[] inputArgs       = null, Argument[] outputArgs = null, NodeId referenceTypeFromParentId = null,
            NodeId methodDeclarationId = null, GenericMethodCalledEventHandler onCalled = null)
        {
            // method node
            var m = new MethodState(parent);

            m.BrowseName  = "" + browseDisplayName;
            m.DisplayName = "" + browseDisplayName;
            m.Description = new LocalizedText("en", browseDisplayName);
            m.NodeId      = nodeMgr.New(nodeMgr.SystemContext, mode, m);
            if (methodDeclarationId != null)
            {
                m.MethodDeclarationId = methodDeclarationId;
            }

            m.Executable     = true;
            m.UserExecutable = true;

            nodeMgr.AddPredefinedNode(nodeMgr.SystemContext, m);
            if (parent != null)
            {
                parent.AddChild(m);
            }

            if (referenceTypeFromParentId != null)
            {
                if (parent != null)
                {
                    parent.AddReference(referenceTypeFromParentId, false, m.NodeId);
                    if (referenceTypeFromParentId == ReferenceTypeIds.HasComponent)
                    {
                        m.AddReference(referenceTypeFromParentId, true, parent.NodeId);
                    }
                    if (referenceTypeFromParentId == ReferenceTypeIds.HasProperty)
                    {
                        m.AddReference(referenceTypeFromParentId, true, parent.NodeId);
                    }
                }
            }

            // can have inputs, outputs
            for (int i = 0; i < 2; i++)
            {
                // pretty argument list
                var arguments = (i == 0) ? inputArgs : outputArgs;
                if (arguments == null || arguments.Length < 1)
                {
                    continue;
                }

                // make a property for this
                var prop = CreateAddPropertyState <Argument[]>(
                    m, mode,
                    (i == 0) ? "InputArguments" : "OutputArguments",
                    DataTypeIds.Argument,
                    arguments,
                    ReferenceTypeIds.HasProperty,
                    typeDefinitionId: VariableTypeIds.PropertyType,
                    valueRank: 1);

                // explicitely add arguments ass well?
                if (i == 0)
                {
                    m.InputArguments = prop;
                }

                if (i == 1)
                {
                    m.OutputArguments = prop;
                }
            }

            // event handler
            if (onCalled != null)
            {
                m.OnCallMethod = onCalled;
            }


            return(m);
        }
        // small helpers for the main collector methods
        #region Collector helpers
        private void createMethod(NodeState parent, MethodState method, PropertyState inputs, PropertyState output, GenericMethodCalledEventHandler methodToBeCalled)
        {
            // a method to start the process.
            MethodState start = new MethodState(parent);

            start.NodeId          = method.NodeId;
            start.BrowseName      = method.BrowseName;
            start.DisplayName     = method.BrowseName.Name;
            start.ReferenceTypeId = ReferenceTypeIds.HasComponent;
            start.UserExecutable  = true;
            start.Executable      = true;

            // add input arguments.
            start.InputArguments                  = new PropertyState <Argument[]>(start);
            start.InputArguments.NodeId           = inputs.NodeId;
            start.InputArguments.BrowseName       = BrowseNames.InputArguments;
            start.InputArguments.DisplayName      = start.InputArguments.BrowseName.Name;
            start.InputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;
            start.InputArguments.ReferenceTypeId  = ReferenceTypeIds.HasProperty;
            start.InputArguments.DataType         = DataTypeIds.Argument;
            start.InputArguments.ValueRank        = ValueRanks.OneDimension;

            List <Argument> args = new List <Argument>();
            Argument        arg;

            foreach (ExtensionObject ext in (ExtensionObject[])inputs.Value)
            {
                arg = (Argument)ext.Body;
                args.Add(arg);
            }
            start.InputArguments.Value = args.ToArray();

            // add output arguments.
            start.OutputArguments                  = new PropertyState <Argument[]>(start);
            start.OutputArguments.NodeId           = output.NodeId;
            start.OutputArguments.BrowseName       = BrowseNames.OutputArguments;
            start.OutputArguments.DisplayName      = start.OutputArguments.BrowseName.Name;
            start.OutputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;
            start.OutputArguments.ReferenceTypeId  = ReferenceTypeIds.HasProperty;
            start.OutputArguments.DataType         = DataTypeIds.Argument;
            start.OutputArguments.ValueRank        = ValueRanks.OneDimension;

            args = new List <Argument>();
            foreach (ExtensionObject ext in (ExtensionObject[])inputs.Value)
            {
                arg = (Argument)ext.Body;
                args.Add(arg);
            }
            start.OutputArguments.Value = args.ToArray();

            parent.AddChild(start);
            AddPredefinedNode(SystemContext, parent);
            // save in dictionary.
            //AddPredefinedNode(SystemContext, process);

            // set up method handlers.
            start.OnCallMethod = new GenericMethodCalledEventHandler(methodToBeCalled);
        }