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}."); }
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); } }