Пример #1
0
        private void AddMethod(object businessObject, MethodInfo method, ObjectNode node)
        {
            var uaMethodAttribute = method.GetCustomAttribute <UaMethod>();

            if (uaMethodAttribute == null)
            {
                return;
            }

            var uaMethodName = uaMethodAttribute.Name ?? method.Name;
            var settings     = new CreateMethodSettings()
            {
                ParentNodeId    = node.NodeId,
                ReferenceTypeId = ReferenceTypeIds.HasComponent,
                RequestedNodeId = new NodeId($"{node.NodeId.Identifier}.{uaMethodName}", InstanceNamespaceIndex),
                BrowseName      = new QualifiedName(uaMethodName, InstanceNamespaceIndex),
                DisplayName     = uaMethodName,
                Executable      = true,
                InputArguments  = new List <Argument>(),
                OutputArguments = new List <Argument>(),
                ParentAsOwner   = true
            };

            var parameterList = method.GetParameters().Select(p => p).ToList();

            if (ExistsInsertUaState(method))
            {
                parameterList.Remove(parameterList[0]);
            }

            foreach (var parameterInfo in parameterList)
            {
                settings.InputArguments.Add(new Argument
                {
                    DataType    = TypeMapping.MapDataTypeId(parameterInfo.ParameterType),
                    Name        = parameterInfo.Name,
                    Description = new LocalizedText("en", parameterInfo.Name),
                    ValueRank   = ValueRanks.Scalar,
                });
            }

            if (method.ReturnParameter != null && method.ReturnParameter.ParameterType != typeof(void))
            {
                settings.OutputArguments.Add(new Argument
                {
                    DataType    = TypeMapping.MapDataTypeId(method.ReturnParameter.ParameterType),
                    Name        = "Result",
                    Description = new LocalizedText("en", "Result"),
                    ValueRank   = ValueRanks.Scalar
                });
            }

            var methodNode = CreateMethod(Server.DefaultRequestContext, settings);

            methodNode.UserData = new MethodNodeData {
                BusinessObject = businessObject, Method = method
            };
            Logger.Info($"Created method ... {methodNode.NodeId.Identifier}.");
        }
Пример #2
0
        public override void Startup()
        {
            try
            {
                Console.WriteLine("Starting Lesson3bNodeManager.");

                base.Startup();

                // save the namespaces used by this node manager.
                AddNamespaceUri("http://yourcompany.com/lesson03b/");

                // initialize the underlying system.

                // create root folder.
                NodeId rootId = ParsedNodeId.Construct(0, "Root", DefaultNamespaceIndex);

                CreateObjectSettings settings = new CreateObjectSettings()
                {
                    ParentNodeId     = ObjectIds.ObjectsFolder,
                    ReferenceTypeId  = ReferenceTypeIds.Organizes,
                    RequestedNodeId  = rootId,
                    BrowseName       = new QualifiedName("Root", DefaultNamespaceIndex),
                    TypeDefinitionId = ObjectTypeIds.FolderType,

                    NotifierParent = ObjectIds.Server,
                };

                CreateObject(Server.DefaultRequestContext, settings);

                // add controllers.

                NodeId controllerId = ParsedNodeId.Construct(0, "Jemima", DefaultNamespaceIndex);

                // create object.
                settings = new CreateObjectSettings()
                {
                    ParentNodeId     = rootId,
                    ReferenceTypeId  = ReferenceTypeIds.Organizes,
                    RequestedNodeId  = controllerId,
                    BrowseName       = new QualifiedName("Jemima", DefaultNamespaceIndex),
                    TypeDefinitionId = ObjectTypeIds.BaseObjectType,

                    NotifierParent = new NodeId("Root", DefaultNamespaceIndex),
                };

                CreateObject(Server.DefaultRequestContext, settings);


                NodeId variableId = ParsedNodeId.Construct(0, "Jemima", DefaultNamespaceIndex, "Jackey");

                // configure the variable so the SDK will automatically poll the system when it is subscribed.
                // this node manager needs to implement the read/write requests.
                CreateVariableSettings settings2 = new CreateVariableSettings()
                {
                    ParentNodeId     = controllerId,
                    ReferenceTypeId  = ReferenceTypeIds.HasComponent,
                    RequestedNodeId  = variableId,
                    BrowseName       = new QualifiedName("Jackey", DefaultNamespaceIndex),
                    TypeDefinitionId = (true) ? VariableTypeIds.AnalogItemType : VariableTypeIds.DataItemType,
                    DataType         = NodeId.Parse("i=12"),
                    ValueRank        = ValueRanks.Scalar,
                    AccessLevel      = AccessLevels.CurrentReadOrWrite,
                    ValueType        = NodeHandleType.ExternalPolled,
                    ValueData        = new SystemAddress()
                    {
                        Address = 10, Offset = 100
                    },
                    // Value = "Hello World.",
                };

                CreateVariable(Server.DefaultRequestContext, settings2);

                NodeId methodId = ParsedNodeId.Construct(0, "Jemima", DefaultNamespaceIndex, "WriteValue");

                var settings3 = new CreateMethodSettings()
                {
                    ParentNodeId    = controllerId,
                    ReferenceTypeId = ReferenceTypeIds.HasComponent,
                    RequestedNodeId = methodId,
                    BrowseName      = new QualifiedName("WriteValue", DefaultNamespaceIndex),
                    NodeData        = new SystemFunction()
                    {
                        Address = "Address", Function = "WriteValue"
                    },

                    InputArguments = new[]
                    {
                        new Argument()
                        {
                            Name = "Value_String", DataType = DataTypeIds.String, ValueRank = ValueRanks.Any
                        },
                    }
                };
                CreateMethod(Server.DefaultRequestContext, settings3);
            }
            catch (Exception e)
            {
                Console.WriteLine("Failed to start Lesson3bNodeManager. " + e.Message);
            }
        }