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