/// <summary> /// 浏览一个节点的引用 /// </summary> /// <param name="tag">节点值</param> /// <returns>引用节点描述</returns> public ReferenceDescription[] BrowseNodeReference(string tag) { NodeId sourceId = new NodeId(tag); // 该节点可以读取到方法 BrowseDescription nodeToBrowse1 = new BrowseDescription( ); nodeToBrowse1.NodeId = sourceId; nodeToBrowse1.BrowseDirection = BrowseDirection.Forward; nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.Aggregates; nodeToBrowse1.IncludeSubtypes = true; nodeToBrowse1.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method); nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All; // 该节点无论怎么样都读取不到方法 // find all nodes organized by the node. BrowseDescription nodeToBrowse2 = new BrowseDescription( ); nodeToBrowse2.NodeId = sourceId; nodeToBrowse2.BrowseDirection = BrowseDirection.Forward; nodeToBrowse2.ReferenceTypeId = ReferenceTypeIds.Organizes; nodeToBrowse2.IncludeSubtypes = true; nodeToBrowse2.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable); nodeToBrowse2.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection( ); nodesToBrowse.Add(nodeToBrowse1); nodesToBrowse.Add(nodeToBrowse2); // fetch references from the server. ReferenceDescriptionCollection references = FormUtils.Browse(m_session, nodesToBrowse, false); return(references.ToArray( )); }
private ReferenceDescriptionCollection GetReferenceDescriptionCollection(NodeId sourceId) { TaskCompletionSource <ReferenceDescriptionCollection> task = new TaskCompletionSource <ReferenceDescriptionCollection>(); // find all of the components of the node. BrowseDescription nodeToBrowse1 = new BrowseDescription(); nodeToBrowse1.NodeId = sourceId; nodeToBrowse1.BrowseDirection = BrowseDirection.Forward; nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.Aggregates; nodeToBrowse1.IncludeSubtypes = true; nodeToBrowse1.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method | NodeClass.ReferenceType | NodeClass.ObjectType | NodeClass.View | NodeClass.VariableType | NodeClass.DataType); nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All; // find all nodes organized by the node. BrowseDescription nodeToBrowse2 = new BrowseDescription(); nodeToBrowse2.NodeId = sourceId; nodeToBrowse2.BrowseDirection = BrowseDirection.Forward; nodeToBrowse2.ReferenceTypeId = ReferenceTypeIds.Organizes; nodeToBrowse2.IncludeSubtypes = true; nodeToBrowse2.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method | NodeClass.View | NodeClass.ReferenceType | NodeClass.ObjectType | NodeClass.VariableType | NodeClass.DataType); nodeToBrowse2.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse1); nodesToBrowse.Add(nodeToBrowse2); // fetch references from the server. ReferenceDescriptionCollection references = FormUtils.Browse(m_OpcUaClient.Session, nodesToBrowse, false); return(references); }
/// <summary>浏览一个节点的引用</summary> /// <param name="tag"></param> /// <returns></returns> public ReferenceDescription[] BrowseNodeReference(string tag) { NodeId nodeId = new NodeId(tag); BrowseDescription browseDescription1 = new BrowseDescription(); browseDescription1.NodeId = nodeId; browseDescription1.BrowseDirection = BrowseDirection.Forward; browseDescription1.ReferenceTypeId = ReferenceTypeIds.Aggregates; browseDescription1.IncludeSubtypes = true; browseDescription1.NodeClassMask = 7U; browseDescription1.ResultMask = 63U; BrowseDescription browseDescription2 = new BrowseDescription(); browseDescription2.NodeId = nodeId; browseDescription2.BrowseDirection = BrowseDirection.Forward; browseDescription2.ReferenceTypeId = ReferenceTypeIds.Organizes; browseDescription2.IncludeSubtypes = true; browseDescription2.NodeClassMask = 3U; browseDescription2.ResultMask = 63U; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(browseDescription1); nodesToBrowse.Add(browseDescription2); return(FormUtils.Browse(this.m_session, nodesToBrowse, false).ToArray()); }
/// <summary> /// Populates the branch in the tree view. /// </summary> /// <param name="sourceId">The NodeId of the Node to browse.</param> /// <param name="nodes">The node collect to populate.</param> private async Task PopulateBranch(NodeId sourceId, TreeNodeCollection nodes) { try { nodes.Clear(); // find all of the components of the node. BrowseDescription nodeToBrowse1 = new BrowseDescription(); nodeToBrowse1.NodeId = sourceId; nodeToBrowse1.BrowseDirection = BrowseDirection.Forward; nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.Aggregates; nodeToBrowse1.IncludeSubtypes = true; nodeToBrowse1.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable); nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All; // find all nodes organized by the node. BrowseDescription nodeToBrowse2 = new BrowseDescription(); nodeToBrowse2.NodeId = sourceId; nodeToBrowse2.BrowseDirection = BrowseDirection.Forward; nodeToBrowse2.ReferenceTypeId = ReferenceTypeIds.Organizes; nodeToBrowse2.IncludeSubtypes = true; nodeToBrowse2.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable); nodeToBrowse2.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse1); nodesToBrowse.Add(nodeToBrowse2); Cursor.Current = Cursors.WaitCursor; // fetch references from the server. ReferenceDescriptionCollection references = await Task.Run(() => FormUtils.Browse(m_groupLog.Server.Connection.Session, nodesToBrowse, false)); Cursor.Current = Cursors.Default; // process results. for (int ii = 0; ii < references.Count; ii++) { ReferenceDescription target = references[ii]; // add node. TreeNode child = new TreeNode(Utils.Format("{0}", target)); child.Tag = target; child.Nodes.Add(new TreeNode()); nodes.Add(child); if (target.NodeClass == NodeClass.Variable) { child.ImageKey = "label_icon"; child.SelectedImageKey = "label_icon"; } } } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
/// <summary> /// Populates the branch in the tree view. /// </summary> /// <param name="sourceId">The NodeId of the Node to browse.</param> /// <param name="nodes">The node collect to populate.</param> private void PopulateBranch(NodeId sourceId, TreeNodeCollection nodes) { try { nodes.Clear(); // find all of the components of the node. BrowseDescription nodeToBrowse1 = new BrowseDescription(); nodeToBrowse1.NodeId = sourceId; nodeToBrowse1.BrowseDirection = BrowseDirection.Forward; nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.Aggregates; nodeToBrowse1.IncludeSubtypes = true; nodeToBrowse1.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable); nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All; // find all nodes organized by the node. BrowseDescription nodeToBrowse2 = new BrowseDescription(); nodeToBrowse2.NodeId = sourceId; nodeToBrowse2.BrowseDirection = BrowseDirection.Forward; nodeToBrowse2.ReferenceTypeId = ReferenceTypeIds.Organizes; nodeToBrowse2.IncludeSubtypes = true; nodeToBrowse2.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable); nodeToBrowse2.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse1); nodesToBrowse.Add(nodeToBrowse2); // fetch references from the server. ReferenceDescriptionCollection references = FormUtils.Browse(m_session, nodesToBrowse, false); // process results. for (int ii = 0; ii < references.Count; ii++) { ReferenceDescription target = references[ii]; // add node. TreeNode child = new TreeNode(Utils.Format("{0}", target)); child.Tag = target; child.Nodes.Add(new TreeNode()); nodes.Add(child); } // update the attributes display. DisplayAttributes(sourceId); } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
private static void BrowseRootTree2(Session session) { Console.WriteLine("Browse the server namespace."); ReferenceDescriptionCollection refs; Byte[] cp; netCalls++; session.Browse(null, null, ObjectIds.ObjectsFolder, 0u, BrowseDirection.Forward, ReferenceTypeIds.HierarchicalReferences, true, (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out cp, out refs); Console.WriteLine("DisplayName: BrowseName, NodeClass"); BrowseDescriptionCollection bc = new BrowseDescriptionCollection(); foreach (var rd in refs) { totalNodes++; Console.WriteLine("{0}: {1}, {2}", rd.DisplayName, rd.BrowseName, rd.NodeClass); BrowseDescription bd = new BrowseDescription(); bd.NodeId = (NodeId)rd.NodeId; bd.BrowseDirection = BrowseDirection.Forward; bd.ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences; bd.IncludeSubtypes = true; bd.NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method; bc.Add(bd); } BrowseTree2(session, bc, ""); Console.WriteLine($"Total Nodes: {nodeList.Count}"); }
/// <summary> /// 读取一个节点的指定属性 /// </summary> /// <param name="nodeId"></param> /// <param name="attribute"></param> /// <returns></returns> private DataValue ReadNoteDataValueAttributes(NodeId nodeId, uint attribute) { NodeId sourceId = nodeId; ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = sourceId; nodeToRead.AttributeId = attribute; nodesToRead.Add(nodeToRead); int startOfProperties = nodesToRead.Count; // find all of the pror of the node. BrowseDescription nodeToBrowse1 = new BrowseDescription(); nodeToBrowse1.NodeId = sourceId; nodeToBrowse1.BrowseDirection = BrowseDirection.Forward; nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.HasProperty; nodeToBrowse1.IncludeSubtypes = true; nodeToBrowse1.NodeClassMask = 0; nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse1); // fetch property references from the server. ReferenceDescriptionCollection references = FormUtils.Browse(CommonMethods.opcUaClient.Session, nodesToBrowse, false); if (references == null) { return(null); } for (int ii = 0; ii < references.Count; ii++) { // ignore external references. if (references[ii].NodeId.IsAbsolute) { continue; } ReadValueId nodeToRead2 = new ReadValueId(); nodeToRead2.NodeId = (NodeId)references[ii].NodeId; nodeToRead2.AttributeId = Attributes.Value; nodesToRead.Add(nodeToRead2); } // read all values. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; CommonMethods.opcUaClient.Session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); return(results[0]); }
/// <summary> /// Handles the BeforeExpand event of the BrowseTV control. /// </summary> private void BrowseTV_BeforeExpand(object sender, TreeViewCancelEventArgs e) { try { ReferenceDescription reference = (ReferenceDescription)e.Node.Tag; e.Node.Nodes.Clear(); // build list of references to browse. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); for (int ii = 0; ii < m_referenceTypeIds.Length; ii++) { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = m_rootId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = m_referenceTypeIds[ii]; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; if (reference != null) { nodeToBrowse.NodeId = (NodeId)reference.NodeId; } nodesToBrowse.Add(nodeToBrowse); } // add the childen to the control. ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, View, nodesToBrowse, false); for (int ii = 0; references != null && ii < references.Count; ii++) { reference = references[ii]; // ignore out of server references. if (reference.NodeId.IsAbsolute) { continue; } TreeNode child = new TreeNode(reference.ToString()); child.Nodes.Add(new TreeNode()); child.Tag = reference; e.Node.Nodes.Add(child); } } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
/// <summary> /// Create a browse description from a node id collection. /// </summary> /// <param name="nodeIdCollection">The node id collection.</param> /// <param name="template">The template for the browse description for each node id.</param> public static BrowseDescriptionCollection CreateBrowseDescriptionCollectionFromNodeId( NodeIdCollection nodeIdCollection, BrowseDescription template) { var browseDescriptionCollection = new BrowseDescriptionCollection(); foreach (var nodeId in nodeIdCollection) { BrowseDescription browseDescription = (BrowseDescription)template.MemberwiseClone(); browseDescription.NodeId = nodeId; browseDescriptionCollection.Add(browseDescription); } return(browseDescriptionCollection); }
/// <summary>读取一个节点的所有属性</summary> /// <param name="tag"></param> /// <returns></returns> //public OpcuaNodeAttribute[] ReadNoteAttributes(string tag) //{ // NodeId nodeId = new NodeId(tag); // ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); // for (uint index = 2; index <= 22U; ++index) // nodesToRead.Add(new ReadValueId() // { // NodeId = nodeId, // AttributeId = index // }); // int count = nodesToRead.Count; // BrowseDescription browseDescription = new BrowseDescription(); // browseDescription.NodeId = nodeId; // browseDescription.BrowseDirection = BrowseDirection.Forward; // browseDescription.ReferenceTypeId = ReferenceTypeIds.HasProperty; // browseDescription.IncludeSubtypes = true; // browseDescription.NodeClassMask = 0U; // browseDescription.ResultMask = 63U; // BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); // nodesToBrowse.Add(browseDescription); // ReferenceDescriptionCollection descriptionCollection = FormUtils.Browse(this.m_session, nodesToBrowse, false); // if (descriptionCollection == null) // return new OpcuaNodeAttribute[0]; // for (int index = 0; index < descriptionCollection.Count; ++index) // { // if (!descriptionCollection[index].NodeId.IsAbsolute) // nodesToRead.Add(new ReadValueId() // { // NodeId = (NodeId)descriptionCollection[index].NodeId, // AttributeId = 13U // }); // } // DataValueCollection results = (DataValueCollection)null; // DiagnosticInfoCollection diagnosticInfos = (DiagnosticInfoCollection)null; // this.m_session.Read((RequestHeader)null, 0.0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); // ClientBase.ValidateResponse((IList)results, (IList)nodesToRead); // ClientBase.ValidateDiagnosticInfos(diagnosticInfos, (IList)nodesToRead); // List<OpcNodeAttribute> opcNodeAttributeList = new List<OpcNodeAttribute>(); // for (int index = 0; index < results.Count; ++index) // { // OpcNodeAttribute opcNodeAttribute1 = new OpcNodeAttribute(); // BuiltInType builtInType; // if (index < count) // { // if (!(results[index].StatusCode == 2150957056U)) // { // opcNodeAttribute1.Name = Attributes.GetBrowseName(nodesToRead[index].AttributeId); // if (StatusCode.IsBad(results[index].StatusCode)) // { // opcNodeAttribute1.Type = Utils.Format("{0}", (object)Attributes.GetDataTypeId(nodesToRead[index].AttributeId)); // opcNodeAttribute1.Value = (object)Utils.Format("{0}", (object)results[index].StatusCode); // } // else // { // TypeInfo typeInfo = TypeInfo.Construct(results[index].Value); // OpcNodeAttribute opcNodeAttribute2 = opcNodeAttribute1; // builtInType = typeInfo.BuiltInType; // string str = builtInType.ToString(); // opcNodeAttribute2.Type = str; // if (typeInfo.ValueRank >= 0) // opcNodeAttribute1.Type += "[]"; // opcNodeAttribute1.Value = results[index].Value; // } // } // else // continue; // } // else if (!(results[index].StatusCode == 2150891520U)) // { // opcNodeAttribute1.Name = Utils.Format("{0}", (object)descriptionCollection[index - count]); // if (StatusCode.IsBad(results[index].StatusCode)) // { // opcNodeAttribute1.Type = string.Empty; // opcNodeAttribute1.Value = (object)Utils.Format("{0}", (object)results[index].StatusCode); // } // else // { // TypeInfo typeInfo = TypeInfo.Construct(results[index].Value); // OpcNodeAttribute opcNodeAttribute2 = opcNodeAttribute1; // builtInType = typeInfo.BuiltInType; // string str = builtInType.ToString(); // opcNodeAttribute2.Type = str; // if (typeInfo.ValueRank >= 0) // opcNodeAttribute1.Type += "[]"; // opcNodeAttribute1.Value = results[index].Value; // } // } // else // continue; // opcNodeAttributeList.Add(opcNodeAttribute1); // } // return opcNodeAttributeList.ToArray(); //} /// <summary>读取一个节点的所有属性</summary> /// <param name="tag"></param> /// <returns></returns> public DataValue[] ReadNoteDataValueAttributes(string tag) { NodeId nodeId = new NodeId(tag); ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); for (uint index = 1; index <= 22U; ++index) { nodesToRead.Add(new ReadValueId() { NodeId = nodeId, AttributeId = index }); } int count = nodesToRead.Count; BrowseDescription browseDescription = new BrowseDescription(); browseDescription.NodeId = nodeId; browseDescription.BrowseDirection = BrowseDirection.Forward; browseDescription.ReferenceTypeId = ReferenceTypeIds.HasProperty; browseDescription.IncludeSubtypes = true; browseDescription.NodeClassMask = 0U; browseDescription.ResultMask = 63U; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(browseDescription); ReferenceDescriptionCollection descriptionCollection = FormUtils.Browse(this.m_session, nodesToBrowse, false); if (descriptionCollection == null) { return(new DataValue[0]); } for (int index = 0; index < descriptionCollection.Count; ++index) { if (!descriptionCollection[index].NodeId.IsAbsolute) { nodesToRead.Add(new ReadValueId() { NodeId = (NodeId)descriptionCollection[index].NodeId, AttributeId = 13U }); } } DataValueCollection results = (DataValueCollection)null; DiagnosticInfoCollection diagnosticInfos = (DiagnosticInfoCollection)null; this.m_session.Read((RequestHeader)null, 0.0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse((IList)results, (IList)nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, (IList)nodesToRead); return(results.ToArray()); }
/// <summary> /// Gets the list of references to follow. /// </summary> private BrowseDescriptionCollection CreateNodesToBrowse() { BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); if (ReferenceTypeIds != null && ReferenceTypeIds.Length > 0) { for (int ii = 0; ii < ReferenceTypeIds.Length; ii++) { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = NodeId; nodeToBrowse.BrowseDirection = BrowseDirection; nodeToBrowse.ReferenceTypeId = ReferenceTypeIds[ii]; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; nodesToBrowse.Add(nodeToBrowse); } } else { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = NodeId; nodeToBrowse.BrowseDirection = BrowseDirection; nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.References; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; nodesToBrowse.Add(nodeToBrowse); } return(nodesToBrowse); }
static void Browse(Session session) { DiagnosticInfoCollection diagnosticInfos; BrowseDescriptionCollection bc = new BrowseDescriptionCollection(); BrowseDescription bd = new BrowseDescription(); bd.BrowseDirection = BrowseDirection.Forward; NodeId nodeId = Opc.Ua.Objects.ObjectsFolder; do { Console.WriteLine("\n Enter nodeId to Browse (or q to exit)"); string s = Console.ReadLine(); if (s == "q") { break; } if (s.Length == 0) { nodeId = Opc.Ua.Objects.ObjectsFolder; } else { nodeId = new NodeId(s); } bc.Clear(); bd.NodeId = nodeId; bc.Add(bd); BrowseResultCollection results; ResponseHeader rh = session.Browse(null, null, 100, bc, out results, out diagnosticInfos); foreach (BrowseResult res in results) { foreach (ReferenceDescription rdc in res.References) { Console.WriteLine(String.Format(" Node = {0} (namespace {1}) {2}", rdc.NodeId.ToString(), rdc.NodeId.NamespaceIndex, Environment.NewLine)); } } } while (true); }
/// <summary> /// /// </summary> /// <param name="session"></param> /// <param name="targetId"></param> /// <param name="m_referenceTypeIds"></param> /// <returns></returns> public ReferenceDescriptionCollection Browse(NodeId targetId, params NodeId[] m_referenceTypeIds) { BrowseDescriptionCollection nb = new BrowseDescriptionCollection(); for (int ii = 0; ii < m_referenceTypeIds.Length; ii++) { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = targetId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = m_referenceTypeIds[ii]; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; nb.Add(nodeToBrowse); } return(Browse(this.m_session, nb, false)); }
private static void BrowseTree2(Session session, BrowseDescriptionCollection bdCollection, string sPre) { BrowseResultCollection br = new BrowseResultCollection(); DiagnosticInfoCollection dc = new DiagnosticInfoCollection(); netCalls++; Console.WriteLine($"Getting: {bdCollection.Count}"); if (bdCollection.Count != 0) { session.Browse(null, null, (uint)1000000, bdCollection, out br, out dc); if (br != null) { if (bdCollection.Count != br.Count) { Console.WriteLine($"NOT EQUAL: DC Count = {dc.Count}"); } int i = 0; BrowseDescriptionCollection bc = new BrowseDescriptionCollection(); foreach (var b in br) { nodeList.Add(b); var inNode = bdCollection[i]; foreach (var n in b.References) { BrowseDescription bd = new BrowseDescription(); bd.NodeId = (NodeId)n.NodeId; bd.BrowseDirection = BrowseDirection.Forward; bd.ReferenceTypeId = ReferenceTypeIds.HasChild; bd.IncludeSubtypes = true; bd.NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method; bc.Add(bd); } } BrowseTree2(session, bc, "KN"); } } }
/// <summary> /// Reads the attribute values in order to compare them to the returned results. /// </summary> private bool VerifyTypeDefinitions( Node node, BrowseDescription description, ReferenceDescriptionCollection references) { // check if nothing to do. if (references.Count == 0) { return true; } bool success = true; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); for (int ii = 0; ii < references.Count; ii++) { ReferenceDescription reference = references[ii]; if ((description.ResultMask & (uint)BrowseResultMask.TypeDefinition) == 0) { if (!NodeId.IsNull(reference.TypeDefinition)) { success = false; Log( "Unexpected TypeDefinition returned for Node '{0}'. NodeId = {1}, TargetId = {2}, TypeDefinition = {3}", node, node.NodeId, reference.NodeId, reference.TypeDefinition); } continue; } // ignore invalid or external references. if (reference == null || reference.NodeId == null || reference.NodeId.IsAbsolute) { continue; } BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = (NodeId)reference.NodeId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.IncludeSubtypes = false; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.HasTypeDefinition; nodeToBrowse.ResultMask = (uint)BrowseResultMask.None; nodeToBrowse.Handle = references[ii]; nodesToBrowse.Add(nodeToBrowse); } // nothing more to do if no type definitions requested. if ((description.ResultMask & (uint)BrowseResultMask.TypeDefinition) == 0) { return success; } // browse. BrowseResultCollection results; DiagnosticInfoCollection diagnosticInfos; RequestHeader requestHeader = new RequestHeader(); requestHeader.ReturnDiagnostics = 0; Session.Browse( null, m_view, 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); // check diagnostics. if (diagnosticInfos != null && diagnosticInfos.Count > 0) { Log("Returned non-empty DiagnosticInfos array when Browsing TypeDefinition while Browsing Node '{0}'. NodeId = {1}", node, node.NodeId); return false; } bool error = false; for (int ii = 0; ii < nodesToBrowse.Count; ii++) { BrowseResult result = results[ii]; if (StatusCode.IsBad(result.StatusCode)) { error = true; Log( "Browse TypeDefinition Failed for Node '{0}'. NodeId = {1}, TargetId = {2}, Status = {3}", node, node.NodeId, nodesToBrowse[ii].NodeId, results[0].StatusCode); continue; } ReferenceDescription reference = (ReferenceDescription)nodesToBrowse[ii].Handle; if (result.References.Count == 0) { if (!NodeId.IsNull(reference.TypeDefinition)) { error = true; Log( "Unexpected TypeDefinition returned for Node '{0}'. NodeId = {1}, TargetId = {2}, TypeDefinition = {3}", node, node.NodeId, nodesToBrowse[ii].NodeId, reference.TypeDefinition); continue; } } else { if (result.References.Count != 1) { error = true; Log( "Too many TypeDefinitions returned for Node '{0}'. NodeId = {1}, TargetId = {2}, Count = {3}", node, node.NodeId, nodesToBrowse[ii].NodeId, result.References.Count); continue; } if (result.References[0].NodeId != reference.TypeDefinition) { error = true; Log( "Incorrect TypeDefinition returned for Node '{0}'. NodeId = {1}, TargetId = {2}, Expected = {3}, Actual = {4}", node, node.NodeId, nodesToBrowse[ii].NodeId, result.References[0].NodeId, reference.TypeDefinition); continue; } } } return !error; }
/// <summary> /// Browses the address space and returns the references found. /// </summary> public static ReferenceDescriptionCollection Browse(Session session, ViewDescription view, BrowseDescription nodeToBrowse, bool throwOnError) { try { ReferenceDescriptionCollection references = new ReferenceDescriptionCollection(); // construct browse request. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, view, 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); do { // check for error. if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } // process results. for (int ii = 0; ii < results[0].References.Count; ii++) { references.Add(results[0].References[ii]); } // check if all references have been fetched. if (results[0].References.Count == 0 || results[0].ContinuationPoint == null) { break; } // continue browse operation. ByteStringCollection continuationPoints = new ByteStringCollection(); continuationPoints.Add(results[0].ContinuationPoint); session.BrowseNext( null, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); } while (true); //return complete list. return references; } catch (Exception exception) { if (throwOnError) { throw new ServiceResultException(exception, StatusCodes.BadUnexpectedError); } return null; } }
/// <summary> /// Browses the specified node. /// </summary> public ReferenceDescriptionCollection Browse(NodeId nodeId) { if (m_session == null) { throw new ServiceResultException(StatusCodes.BadServerNotConnected, "Cannot browse if not connected to a server."); } try { m_browseInProgress = true; // construct request. BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = m_browseDirection; nodeToBrowse.ReferenceTypeId = m_referenceTypeId; nodeToBrowse.IncludeSubtypes = m_includeSubtypes; nodeToBrowse.NodeClassMask = m_nodeClassMask; nodeToBrowse.ResultMask = m_resultMask; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // make the call to the server. BrowseResultCollection results; DiagnosticInfoCollection diagnosticInfos; ResponseHeader responseHeader = m_session.Browse( null, m_view, m_maxReferencesReturned, nodesToBrowse, out results, out diagnosticInfos); // ensure that the server returned valid results. Session.ValidateResponse(results, nodesToBrowse); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); // check if valid. if (StatusCode.IsBad(results[0].StatusCode)) { throw ServiceResultException.Create(results[0].StatusCode, 0, diagnosticInfos, responseHeader.StringTable); } // fetch initial set of references. byte[] continuationPoint = results[0].ContinuationPoint; ReferenceDescriptionCollection references = results[0].References; // process any continuation point. while (continuationPoint != null) { ReferenceDescriptionCollection additionalReferences; if (!m_continueUntilDone && m_MoreReferences != null) { BrowserEventArgs args = new BrowserEventArgs(references); m_MoreReferences(this, args); // cancel browser and return the references fetched so far. if (args.Cancel) { BrowseNext(ref continuationPoint, true); return references; } m_continueUntilDone = args.ContinueUntilDone; } additionalReferences = BrowseNext(ref continuationPoint, false); references.AddRange(additionalReferences); } // return the results. return references; } finally { m_browseInProgress = false; } }
/// <summary> /// Begins an asynchronous invocation of the Browse service. /// </summary> /// <param name="requestHeader">The request header.</param> /// <param name="view">The view to browse.</param> /// <param name="nodeToBrowse">The node to browse.</param> /// <param name="maxResultsToReturn">The maximum number of returned values..</param> /// <param name="browseDirection">The browse direction.</param> /// <param name="referenceTypeId">The reference type id.</param> /// <param name="includeSubtypes">If set to <c>true</c> the subtypes of the ReferenceType will be included in the browse.</param> /// <param name="nodeClassMask">The node class mask.</param> /// <param name="callback">The callback.</param> /// <param name="asyncState"></param> /// <returns></returns> public IAsyncResult BeginBrowse( RequestHeader requestHeader, ViewDescription view, NodeId nodeToBrowse, uint maxResultsToReturn, BrowseDirection browseDirection, NodeId referenceTypeId, bool includeSubtypes, uint nodeClassMask, AsyncCallback callback, object asyncState) { BrowseDescription description = new BrowseDescription(); description.NodeId = nodeToBrowse; description.BrowseDirection = browseDirection; description.ReferenceTypeId = referenceTypeId; description.IncludeSubtypes = includeSubtypes; description.NodeClassMask = nodeClassMask; description.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(description); return BeginBrowse( requestHeader, view, maxResultsToReturn, nodesToBrowse, callback, asyncState); }
/// <summary> /// Reads the properties for the node. /// </summary> private void ReadProperties(NodeId nodeId) { // build list of references to browse. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasProperty; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = (uint)NodeClass.Variable; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; nodesToBrowse.Add(nodeToBrowse); // find properties. ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, View, nodesToBrowse, false); // build list of properties to read. ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); for (int ii = 0; references != null && ii < references.Count; ii++) { ReferenceDescription reference = references[ii]; // ignore out of server references. if (reference.NodeId.IsAbsolute) { continue; } ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = (NodeId)reference.NodeId; nodeToRead.AttributeId = Attributes.Value; nodeToRead.Handle = reference; nodesToRead.Add(nodeToRead); } if (nodesToRead.Count == 0) { return; } // read the properties. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); // add the results to the display. for (int ii = 0; ii < results.Count; ii++) { ReferenceDescription reference = (ReferenceDescription)nodesToRead[ii].Handle; TypeInfo typeInfo = TypeInfo.Construct(results[ii].Value); // add the metadata for the attribute. ListViewItem item = new ListViewItem(reference.ToString()); item.SubItems.Add(typeInfo.BuiltInType.ToString()); if (typeInfo.ValueRank >= 0) { item.SubItems[1].Text += "[]"; } // add the value. if (StatusCode.IsBad(results[ii].StatusCode)) { item.SubItems.Add(results[ii].StatusCode.ToString()); } else { item.SubItems.Add(results[ii].WrappedValue.ToString()); } item.Tag = new AttributeInfo() { NodeToRead = nodesToRead[ii], Value = results[ii] }; item.ImageIndex = ClientUtils.GetImageIndex(m_session, NodeClass.Variable, Opc.Ua.VariableTypeIds.PropertyType, false); // display in list. AttributesLV.Items.Add(item); } }
/// <summary> /// Creates a browse description for a node class test. /// </summary> private void AddNodeClassTest( Node node, NodeClass nodeClassMask, List<Node> nodes, BrowseDescriptionCollection nodesToBrowse, List<ReferenceDescriptionCollection> references, bool clearLists) { if (clearLists) { nodes.Clear(); nodesToBrowse.Clear(); references.Clear(); } nodes.Add(node); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = node.NodeId; nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.References; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.BrowseDirection = BrowseDirection.Both; nodeToBrowse.NodeClassMask = (uint)nodeClassMask; nodeToBrowse.ResultMask = (uint)(BrowseResultMask.DisplayName | BrowseResultMask.NodeClass | BrowseResultMask.ReferenceTypeId | BrowseResultMask.IsForward); nodesToBrowse.Add(nodeToBrowse); references.Add(new ReferenceDescriptionCollection()); }
private void ReadNode(NodeId nodeid, bool ignoreroot, bool ignorechildren, String DriverName) { INode node = m_session.NodeCache.Find(nodeid); if (node != null) { //TreeNode root = new TreeNode(node.ToString()); //root.ImageIndex = ClientUtils.GetImageIndex(m_session, node.NodeClass, node.TypeDefinitionId, false); //root.SelectedImageIndex = ClientUtils.GetImageIndex(m_session, node.NodeClass, node.TypeDefinitionId, true); ReferenceDescription reference = new ReferenceDescription(); reference.NodeId = node.NodeId; reference.NodeClass = node.NodeClass; reference.BrowseName = node.BrowseName; reference.DisplayName = node.DisplayName; reference.TypeDefinition = node.TypeDefinitionId; // build list of attributes to read. ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); foreach (uint attributeId in Attributes.GetIdentifiers()) { ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = (NodeId)reference.NodeId; nodeToRead.AttributeId = attributeId; nodesToRead.Add(nodeToRead); } // read the attributes. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); if (ignoreroot == false) { //Log(results[0].ToString() + " \t| " + results[3].ToString() + " \t| "+ results[4].ToString() + " \t| " + results[12].ToString()); Log("UID:" + S80(results[(int)Attributes.NodeId - 1].ToString()) + " \tBrowseName: " + s40(results[(int)Attributes.BrowseName - 1].ToString()) + " \tDisplayName: " + s40(results[(int)Attributes.DisplayName - 1].ToString()) + " \tDescription: " + S80(results[(int)Attributes.Description - 1].ToString()) + " \tValue: " + results[(int)Attributes.Value - 1].ToString()); dr = dt.NewRow(); dr["UID"] = results[(int)Attributes.NodeId - 1].ToString(); dr["BrowseName"] = results[(int)Attributes.BrowseName - 1].ToString(); dr["DisplayName"] = results[(int)Attributes.DisplayName - 1].ToString(); dr["Description"] = results[(int)Attributes.Description - 1].ToString(); dr["Value"] = results[(int)Attributes.Value - 1].ToString(); dr["Name"] = DriverName; dt.Rows.Add(dr); if (results[(int)Attributes.AccessLevel - 1].Value != null) { if (((byte)(results[(int)Attributes.AccessLevel - 1].GetValue(typeof(byte))) & AccessLevels.HistoryRead) == AccessLevels.HistoryRead) { //gv.DataSource = dt; ReadHistory(DateTime.Now.AddDays(-1), DateTime.Now, new NodeId(results[0].ToString()), 25, ""); } } } if (ignorechildren == false) { BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeid; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HierarchicalReferences; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; if (reference != null) { nodeToBrowse.NodeId = (NodeId)reference.NodeId; } nodesToBrowse.Add(nodeToBrowse); ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, null, nodesToBrowse, false); for (int ii = 0; references != null && ii < references.Count; ii++) { reference = references[ii]; // build list of attributes to read. nodesToRead = new ReadValueIdCollection(); foreach (uint attributeId in Attributes.GetIdentifiers()) { ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = (NodeId)reference.NodeId; nodeToRead.AttributeId = attributeId; nodesToRead.Add(nodeToRead); } // read the attributes. results = null; diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); // Log("UID:"+results[0].ToString() + " \tBrowseName: " + results[(int)Attributes.BrowseName].ToString() + " \tDisplayName: " + results[(int)Attributes.DisplayName].ToString() + " \tDescription: " + results[(int)Attributes.Description].ToString() + " \t| " + results[(int)Attributes.Value].ToString()); //Log("UID:" + S80(results[(int)Attributes.NodeId - 1].ToString()) + " \tBrowseName: " + results[(int)Attributes.BrowseName - 1].ToString() + " \tDisplayName: " + results[(int)Attributes.DisplayName - 1].ToString() + " \tDescription: " + results[(int)Attributes.Description - 1].ToString() + " \tValue: " + results[(int)Attributes.Value - 1].ToString()); Log("UID:" + S80(results[(int)Attributes.NodeId - 1].ToString()) + " \tBrowseName: " + s40(results[(int)Attributes.BrowseName - 1].ToString()) + " \tDisplayName: " + s40(results[(int)Attributes.DisplayName - 1].ToString()) + " \tDescription: " + S80(results[(int)Attributes.Description - 1].ToString()) + " \tValue: " + results[(int)Attributes.Value - 1].ToString()); dr = dt.NewRow(); dr["UID"] = results[(int)Attributes.NodeId - 1].ToString(); dr["BrowseName"] = results[(int)Attributes.BrowseName - 1].ToString(); dr["DisplayName"] = results[(int)Attributes.DisplayName - 1].ToString(); dr["Description"] = results[(int)Attributes.Description - 1].ToString(); dr["Value"] = results[(int)Attributes.Value - 1].ToString(); dt.Rows.Add(dr); try { if (results[(int)Attributes.AccessLevel - 1].Value != null) { if (((byte)(results[(int)Attributes.AccessLevel - 1].GetValue(typeof(byte))) & AccessLevels.HistoryRead) == AccessLevels.HistoryRead) { //gv.DataSource = dt; ReadHistory(DateTime.Today, DateTime.Now, new NodeId(results[0].ToString()), 25, ""); } } else { if (results[(int)Attributes.Value - 1].Value == null) { // gv.DataSource = dt; ReadNode(new NodeId(results[(int)Attributes.NodeId - 1].ToString()), true, false, ""); } } } catch { Log("V=" + results[17].ToString()); } } } } }
/// <summary> /// Sends the browse request to the server. /// </summary> /// <param name="session">The session.</param> /// <param name="nodesToBrowse">The nodes to browse.</param> /// <returns></returns> private BrowseResultCollection BrowseBlock(Session session, BrowseDescriptionCollection nodesToBrowse) { try { // Utils.Trace("Browsing {0} Nodes", nodesToBrowse.Count); ViewDescription view = new ViewDescription(); Dictionary<int,BrowseResult> combinedResults = new Dictionary<int, BrowseResult>(); // initialize the table of indexes used to correlate results. BrowseDescriptionCollection browseOperations = nodesToBrowse; List<int> browseIndexes = new List<int>(); for (int ii = 0; ii < nodesToBrowse.Count; ii++) { browseIndexes.Add(ii); } BrowseDescriptionCollection unprocessedOperations = new BrowseDescriptionCollection(); List<int> unprocessedBrowseIndexes = new List<int>(); while (browseOperations.Count > 0) { // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, view, 0, browseOperations, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, browseOperations); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, browseOperations); unprocessedOperations.Clear(); unprocessedBrowseIndexes.Clear(); ByteStringCollection continuationPoints = new ByteStringCollection(); List<int> continuationPointIndexes = new List<int>(); for (int ii = 0; ii < browseOperations.Count; ii++) { int index = browseIndexes[ii]; // Utils.Trace("{0}/{1}/{2}", browseOperations[ii].NodeId, browseOperations[ii].ReferenceTypeId, results[ii].References.Count); // look up results. BrowseResult combinedResult = null; if (!combinedResults.TryGetValue(index, out combinedResult)) { combinedResults[index] = combinedResult = new BrowseResult(); } // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { // this error indicates that the server does not have enough simultaneously active // continuation points. This request will need to be resent after the other operations // have been completed and their continuation points released. if (results[ii].StatusCode == StatusCodes.BadNoContinuationPoints) { unprocessedOperations.Add(browseOperations[ii]); unprocessedBrowseIndexes.Add(index); continue; } // save error. if (StatusCode.IsGood(combinedResult.StatusCode)) { combinedResult.StatusCode = results[ii].StatusCode; } continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. combinedResult.References.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null && results[ii].ContinuationPoint.Length > 0) { continuationPoints.Add(results[ii].ContinuationPoint); continuationPointIndexes.Add(index); } } // process continuation points. ByteStringCollection revisedContinuationPoints = new ByteStringCollection(); List<int> revisedContinuationPointIndexes = new List<int>(); while (continuationPoints.Count > 0) { bool releaseContinuationPoints = false; // continue browse operation. session.BrowseNext( null, releaseContinuationPoints, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); revisedContinuationPoints.Clear(); revisedContinuationPointIndexes.Clear(); for (int ii = 0; ii < continuationPoints.Count; ii++) { int index = continuationPointIndexes[ii]; // look up results. BrowseResult combinedResult = null; if (!combinedResults.TryGetValue(index, out combinedResult)) { combinedResults[index] = new BrowseResult(); } // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { // save error. if (StatusCode.IsGood(combinedResult.StatusCode)) { combinedResult.StatusCode = results[ii].StatusCode; } continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. combinedResult.References.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null && results[ii].ContinuationPoint.Length > 0) { revisedContinuationPoints.Add(results[ii].ContinuationPoint); revisedContinuationPointIndexes.Add(index); } } // check if browsing must continue; continuationPoints = revisedContinuationPoints; continuationPointIndexes = revisedContinuationPointIndexes; } // check if unprocessed results exist. browseOperations = unprocessedOperations; browseIndexes = unprocessedBrowseIndexes; } // reconstruct list of combined results. BrowseResultCollection finalResults = new BrowseResultCollection(); for (int ii = 0; ii < nodesToBrowse.Count; ii++) { BrowseResult combinedResult = null; if (!combinedResults.TryGetValue(ii, out combinedResult)) { combinedResult = new BrowseResult(); } finalResults.Add(combinedResult); } // return complete list. return finalResults; } catch (Exception e) { throw ComUtils.CreateComException(e, ResultIds.E_FAIL); } }
/// <summary> /// Sends the browse request to the server. /// </summary> /// <param name="session">The session.</param> /// <param name="nodesToBrowse">The nodes to browse.</param> /// <returns></returns> private BrowseResultCollection Browse(Session session, BrowseDescriptionCollection nodesToBrowse) { BrowseResultCollection results = null; // break the request into smaller blocks. if (m_browseBlockSize > 0 && nodesToBrowse.Count > m_browseBlockSize) { results = new BrowseResultCollection(); for (int ii = 0; ii < nodesToBrowse.Count; ii += m_browseBlockSize) { BrowseDescriptionCollection x = new BrowseDescriptionCollection(); for (int jj = ii; jj < ii + m_browseBlockSize && jj < nodesToBrowse.Count; jj++) { x.Add(nodesToBrowse[jj]); } BrowseResultCollection y = BrowseBlock(session, x); results.AddRange(y); } return results; } // small enough to do directly. return BrowseBlock(session, nodesToBrowse); }
/// <summary> /// Prepares a browse request for the children of a node. /// </summary> /// <param name="nodeId">The node id.</param> /// <param name="nodesToBrowse">The nodes to browse.</param> private int PrepareBrowseElementBrowseRequest( NodeId nodeId, BrowseDescriptionCollection nodesToBrowse) { int index = nodesToBrowse.Count; BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.Organizes; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable); nodeToBrowse.ResultMask = (uint)(BrowseResultMask.DisplayName | BrowseResultMask.BrowseName | BrowseResultMask.NodeClass); nodesToBrowse.Add(nodeToBrowse); nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasChild; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable); nodeToBrowse.ResultMask = (uint)(BrowseResultMask.DisplayName | BrowseResultMask.BrowseName | BrowseResultMask.NodeClass); nodesToBrowse.Add(nodeToBrowse); return index; }
/// <summary> /// Browses the children of the node and updates the tree. /// </summary> private bool BrowseChildren(TreeNode parent) { ReferenceDescription reference = parent.Tag as ReferenceDescription; if (reference == null) { return false; } parent.Nodes.Clear(); if (reference.NodeId.IsAbsolute) { return false; } BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = (NodeId)reference.NodeId; nodeToBrowse.BrowseDirection = m_browseDirection; nodeToBrowse.ReferenceTypeId = m_referenceTypeId; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)(int)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); ViewDescription view = null; if (NodeId.IsNull(m_viewId)) { view = new ViewDescription(); view.ViewId = m_viewId; view.Timestamp = DateTime.MinValue; view.ViewVersion = 0; } BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Browse( null, view, 0, nodesToBrowse, out results, out diagnosticInfos); if (results.Count != 1 || StatusCode.IsBad(results[0].StatusCode)) { return false; } UpdateNode(parent, results[0].References); while (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { ByteStringCollection continuationPoints = new ByteStringCollection(); continuationPoints.Add(results[0].ContinuationPoint); m_session.BrowseNext( null, parent == null, continuationPoints, out results, out diagnosticInfos); if (results.Count != 1 || StatusCode.IsBad(results[0].StatusCode)) { return false; } UpdateNode(parent, results[0].References); } return true; }
/// <summary> /// Returns the next reference. /// </summary> /// <returns>The next reference that meets the browse criteria.</returns> public override IReference Next() { lock (DataLock) { IReference reference = null; // enumerate pre-defined references. // always call first to ensure any pushed-back references are returned first. reference = base.Next(); if (reference != null) { return reference; } // don't start browsing huge number of references when only internal references are requested. if (InternalOnly) { return null; } if (m_stage == Stage.Begin) { // construct request. BrowseDescription nodeToBrowse = new BrowseDescription(); NodeId startId = ObjectIds.ObjectsFolder; if (m_source != null) { startId = m_mapper.ToRemoteId(m_source.NodeId); } nodeToBrowse.NodeId = startId; nodeToBrowse.BrowseDirection = this.BrowseDirection; nodeToBrowse.ReferenceTypeId = this.ReferenceType; nodeToBrowse.IncludeSubtypes = this.IncludeSubtypes; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; ResponseHeader responseHeader = m_client.Browse( null, null, 0, nodesToBrowse, out results, out diagnosticInfos); // these do sanity checks on the result - make sure response matched the request. ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); m_position = 0; m_references = null; m_continuationPoint = null; m_stage = Stage.References; // check status. if (StatusCode.IsGood(results[0].StatusCode)) { m_references = results[0].References; m_continuationPoint = results[0].ContinuationPoint; reference = NextChild(); if (reference != null) { return reference; } } } if (m_stage == Stage.References) { reference = NextChild(); if (reference != null) { return reference; } if (m_source == null && IsRequired(ReferenceTypes.HasNotifier, false)) { // construct request. BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = ObjectIds.Server; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = ReferenceTypes.HasNotifier; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; ResponseHeader responseHeader = m_client.Browse( null, null, 0, nodesToBrowse, out results, out diagnosticInfos); // these do sanity checks on the result - make sure response matched the request. ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); m_position = 0; m_references = null; m_continuationPoint = null; m_stage = Stage.Notifiers; // check status. if (StatusCode.IsGood(results[0].StatusCode)) { m_references = results[0].References; m_continuationPoint = results[0].ContinuationPoint; } } m_stage = Stage.Notifiers; } if (m_stage == Stage.Notifiers) { reference = NextChild(); if (reference != null) { return reference; } m_stage = Stage.Done; } // all done. return null; } }
/// <summary> /// Handles the BeforeExpand event of the BrowseTV control. /// </summary> private void BrowseTV_BeforeExpand(object sender, TreeViewCancelEventArgs e) { try { ReferenceDescription reference = (ReferenceDescription)e.Node.Tag; e.Node.Nodes.Clear(); // build list of references to browse. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); for (int ii = 0; ii < m_referenceTypeIds.Length; ii++) { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = m_rootId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = m_referenceTypeIds[ii]; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; if (reference != null) { nodeToBrowse.NodeId = (NodeId)reference.NodeId; } nodesToBrowse.Add(nodeToBrowse); } // add the childen to the control. SortedDictionary<ExpandedNodeId, TreeNode> dictionary = new SortedDictionary<ExpandedNodeId, TreeNode>(); ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, View, nodesToBrowse, false); for (int ii = 0; references != null && ii < references.Count; ii++) { reference = references[ii]; // ignore out of server references. if (reference.NodeId.IsAbsolute) { continue; } if (dictionary.ContainsKey(reference.NodeId)) { continue; } TreeNode child = new TreeNode(reference.ToString()); child.Nodes.Add(new TreeNode()); child.Tag = reference; if (!reference.TypeDefinition.IsAbsolute) { try { if (!m_typeImageMapping.ContainsKey((NodeId)reference.TypeDefinition)) { List<NodeId> nodeIds = ClientUtils.TranslateBrowsePaths(m_session, (NodeId)reference.TypeDefinition, m_session.NamespaceUris, Opc.Ua.BrowseNames.Icon); if (nodeIds.Count > 0 && nodeIds[0] != null) { DataValue value = m_session.ReadValue(nodeIds[0]); byte[] bytes = value.Value as byte[]; if (bytes != null) { System.IO.MemoryStream istrm = new System.IO.MemoryStream(bytes); Image icon = Image.FromStream(istrm); BrowseTV.ImageList.Images.Add(icon); m_typeImageMapping[(NodeId)reference.TypeDefinition] = BrowseTV.ImageList.Images.Count - 1; } } } } catch (Exception exception) { Utils.Trace(exception, "Error loading image."); } } int index = 0; if (!m_typeImageMapping.TryGetValue((NodeId)reference.TypeDefinition, out index)) { child.ImageIndex = ClientUtils.GetImageIndex(m_session, reference.NodeClass, reference.TypeDefinition, false); child.SelectedImageIndex = ClientUtils.GetImageIndex(m_session, reference.NodeClass, reference.TypeDefinition, true); } else { child.ImageIndex = index; child.SelectedImageIndex = index; } dictionary[reference.NodeId] = child; } // add nodes to tree. foreach (TreeNode node in dictionary.Values.OrderBy(i => i.Text)) { e.Node.Nodes.Add(node); } } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
/// <summary> /// Invokes the Browse service. /// </summary> /// <param name="requestHeader">The request header.</param> /// <param name="view">The view to browse.</param> /// <param name="nodeToBrowse">The node to browse.</param> /// <param name="maxResultsToReturn">The maximum number of returned values.</param> /// <param name="browseDirection">The browse direction.</param> /// <param name="referenceTypeId">The reference type id.</param> /// <param name="includeSubtypes">If set to <c>true</c> the subtypes of the ReferenceType will be included in the browse.</param> /// <param name="nodeClassMask">The node class mask.</param> /// <param name="continuationPoint">The continuation point.</param> /// <param name="references">The list of node references.</param> /// <returns></returns> public virtual ResponseHeader Browse( RequestHeader requestHeader, ViewDescription view, NodeId nodeToBrowse, uint maxResultsToReturn, BrowseDirection browseDirection, NodeId referenceTypeId, bool includeSubtypes, uint nodeClassMask, out byte[] continuationPoint, out ReferenceDescriptionCollection references) { BrowseDescription description = new BrowseDescription(); description.NodeId = nodeToBrowse; description.BrowseDirection = browseDirection; description.ReferenceTypeId = referenceTypeId; description.IncludeSubtypes = includeSubtypes; description.NodeClassMask = nodeClassMask; description.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(description); BrowseResultCollection results; DiagnosticInfoCollection diagnosticInfos; ResponseHeader responseHeader = Browse( requestHeader, view, maxResultsToReturn, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(new ServiceResult(results[0].StatusCode, 0, diagnosticInfos, responseHeader.StringTable)); } continuationPoint = results[0].ContinuationPoint; references = results[0].References; return responseHeader; }
/// <summary> /// Displays the attributes and properties in the attributes view. /// </summary> /// <param name="sourceId">The NodeId of the Node to browse.</param> private void DisplayAttributes(NodeId sourceId) { try { AttributesView.Items.Clear(); ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); // attempt to read all possible attributes. for (uint ii = Attributes.NodeClass; ii <= Attributes.UserExecutable; ii++) { ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = sourceId; nodeToRead.AttributeId = ii; nodesToRead.Add(nodeToRead); } int startOfProperties = nodesToRead.Count; // find all of the pror of the node. BrowseDescription nodeToBrowse1 = new BrowseDescription(); nodeToBrowse1.NodeId = sourceId; nodeToBrowse1.BrowseDirection = BrowseDirection.Forward; nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.HasProperty; nodeToBrowse1.IncludeSubtypes = true; nodeToBrowse1.NodeClassMask = 0; nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse1); // fetch property references from the server. ReferenceDescriptionCollection references = Browse(m_server, nodesToBrowse, false); if (references == null) { return; } for (int ii = 0; ii < references.Count; ii++) { // ignore external references. if (references[ii].NodeId.IsAbsolute) { continue; } ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = (NodeId)references[ii].NodeId; nodeToRead.AttributeId = Attributes.Value; nodesToRead.Add(nodeToRead); } // read all values. OperationContext context = new OperationContext(new RequestHeader(), RequestType.Browse); DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_server.CurrentInstance.NodeManager.Read( context, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ListViewItem idnode = new ListViewItem("NodeID"); idnode.SubItems.Add(sourceId.ToString()); AttributesView.Items.Add(idnode); // process results. for (int ii = 0; ii < results.Count; ii++) { string name = null; string datatype = null; string value = null; // process attribute value. if (ii < startOfProperties) { // ignore attributes which are invalid for the node. if (results[ii].StatusCode == StatusCodes.BadAttributeIdInvalid) { continue; } // get the name of the attribute. name = Attributes.GetBrowseName(nodesToRead[ii].AttributeId); // display any unexpected error. if (StatusCode.IsBad(results[ii].StatusCode)) { datatype = Utils.Format("{0}", Attributes.GetDataTypeId(nodesToRead[ii].AttributeId)); value = Utils.Format("{0}", results[ii].StatusCode); } // display the value. else { TypeInfo typeInfo = TypeInfo.Construct(results[ii].Value); datatype = typeInfo.BuiltInType.ToString(); if (typeInfo.ValueRank >= ValueRanks.OneOrMoreDimensions) { datatype += "[]"; } value = Utils.Format("{0}", results[ii].Value); } } // process property value. else { // ignore properties which are invalid for the node. if (results[ii].StatusCode == StatusCodes.BadNodeIdUnknown) { continue; } // get the name of the property. name = Utils.Format("{0}", references[ii - startOfProperties]); // display any unexpected error. if (StatusCode.IsBad(results[ii].StatusCode)) { datatype = String.Empty; value = Utils.Format("{0}", results[ii].StatusCode); } // display the value. else { TypeInfo typeInfo = TypeInfo.Construct(results[ii].Value); datatype = typeInfo.BuiltInType.ToString(); if (typeInfo.ValueRank >= ValueRanks.OneOrMoreDimensions) { datatype += "[]"; } value = Utils.Format("{0}", results[ii].Value); } } // add the attribute name/value to the list view. ListViewItem item = new ListViewItem(name); item.SubItems.Add(value); item.SubItems.Add(datatype); AttributesView.Items.Add(item); } // adjust width of all columns. for (int ii = 0; ii < AttributesView.Columns.Count; ii++) { AttributesView.Columns[ii].Width = -2; } } catch (Exception exception) { ServerUtils.HandleException(this.Text, exception); } }
/// <summary> /// Reads the arguments for the method. /// </summary> private void ReadArguments(NodeId nodeId) { m_inputArguments = null; m_outputArguments = null; // build list of references to browse. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasProperty; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = (uint)NodeClass.Variable; nodeToBrowse.ResultMask = (uint)BrowseResultMask.BrowseName; nodesToBrowse.Add(nodeToBrowse); // find properties. ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, null, nodesToBrowse, false); // build list of properties to read. ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); for (int ii = 0; references != null && ii < references.Count; ii++) { ReferenceDescription reference = references[ii]; // ignore out of server references. if (reference.NodeId.IsAbsolute) { continue; } // ignore other properties. if (reference.BrowseName != Opc.Ua.BrowseNames.InputArguments && reference.BrowseName != Opc.Ua.BrowseNames.OutputArguments) { continue; } ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = (NodeId)reference.NodeId; nodeToRead.AttributeId = Attributes.Value; nodeToRead.Handle = reference; nodesToRead.Add(nodeToRead); } // method has no arguments. if (nodesToRead.Count == 0) { return; } // read the arguments. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); // save the results. for (int ii = 0; ii < results.Count; ii++) { ReferenceDescription reference = (ReferenceDescription)nodesToRead[ii].Handle; if (StatusCode.IsGood(results[ii].StatusCode)) { if (reference.BrowseName == Opc.Ua.BrowseNames.InputArguments) { m_inputArguments = (Argument[])ExtensionObject.ToArray(results[ii].GetValue<ExtensionObject[]>(null), typeof(Argument)); } if (reference.BrowseName == Opc.Ua.BrowseNames.OutputArguments) { m_outputArguments = (Argument[])ExtensionObject.ToArray(results[ii].GetValue<ExtensionObject[]>(null), typeof(Argument)); } } } // set default values for input arguments. if (m_inputArguments != null) { foreach (Argument argument in m_inputArguments) { argument.Value = TypeInfo.GetDefaultValue(argument.DataType, argument.ValueRank, m_session.TypeTree); } } }
/// <summary> /// Browses the address space and returns the references found. /// </summary> public static ReferenceDescriptionCollection Browse(Session session, ViewDescription view, BrowseDescription nodeToBrowse, bool throwOnError) { try { ReferenceDescriptionCollection references = new ReferenceDescriptionCollection(); // construct browse request. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, view, 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); do { // check for error. if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } // process results. for (int ii = 0; ii < results[0].References.Count; ii++) { references.Add(results[0].References[ii]); } // check if all references have been fetched. if (results[0].References.Count == 0 || results[0].ContinuationPoint == null) { break; } // continue browse operation. ByteStringCollection continuationPoints = new ByteStringCollection(); continuationPoints.Add(results[0].ContinuationPoint); session.BrowseNext( null, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); }while (true); //return complete list. return(references); } catch (Exception exception) { if (throwOnError) { throw new ServiceResultException(exception, StatusCodes.BadUnexpectedError); } return(null); } }
/// <summary> /// Browses the address space and returns the references found. /// </summary> public static ReferenceDescriptionCollection Browse(Session session, ViewDescription view, BrowseDescriptionCollection nodesToBrowse, bool throwOnError) { try { ReferenceDescriptionCollection references = new ReferenceDescriptionCollection(); BrowseDescriptionCollection unprocessedOperations = new BrowseDescriptionCollection(); while (nodesToBrowse.Count > 0) { // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, view, 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); ByteStringCollection continuationPoints = new ByteStringCollection(); for (int ii = 0; ii < nodesToBrowse.Count; ii++) { // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { // this error indicates that the server does not have enough simultaneously active // continuation points. This request will need to be resent after the other operations // have been completed and their continuation points released. if (results[ii].StatusCode == StatusCodes.BadNoContinuationPoints) { unprocessedOperations.Add(nodesToBrowse[ii]); } continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. references.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null) { continuationPoints.Add(results[ii].ContinuationPoint); } } // process continuation points. ByteStringCollection revisedContiuationPoints = new ByteStringCollection(); while (continuationPoints.Count > 0) { // continue browse operation. session.BrowseNext( null, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); for (int ii = 0; ii < continuationPoints.Count; ii++) { // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. references.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null) { revisedContiuationPoints.Add(results[ii].ContinuationPoint); } } // check if browsing must continue; revisedContiuationPoints = continuationPoints; } // check if unprocessed results exist. nodesToBrowse = unprocessedOperations; } // return complete list. return references; } catch (Exception exception) { if (throwOnError) { throw new ServiceResultException(exception, StatusCodes.BadUnexpectedError); } return null; } }
/// <summary> /// Browses the node and verifies the results. /// </summary> private bool Browse( List<Node> nodes, BrowseDescriptionCollection nodesToBrowse, List<ReferenceDescriptionCollection> references) { BrowseResultCollection results; DiagnosticInfoCollection diagnosticInfos; RequestHeader requestHeader = new RequestHeader(); requestHeader.ReturnDiagnostics = 0; Session.Browse( requestHeader, m_view, m_maxReferencesPerNode, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); // check diagnostics. if (diagnosticInfos != null && diagnosticInfos.Count > 0) { Log("Returned non-empty DiagnosticInfos array during Browse."); return false; } List<Node> originalNodes = nodes; BrowseDescriptionCollection originalNodesToBrowse = nodesToBrowse; List<ReferenceDescriptionCollection> originalReferences = references; List<Node> remainingNodes = new List<Node>(); BrowseDescriptionCollection remainingNodesToBrowse = new BrowseDescriptionCollection(); List<ReferenceDescriptionCollection> remainingReferences = new List<ReferenceDescriptionCollection>(); ByteStringCollection continuationPoints = new ByteStringCollection(); // process results. for (int ii = 0; ii < results.Count; ii++) { // check status code. if (StatusCode.IsBad(results[ii].StatusCode)) { Log( "HierarchicalBrowseTest Failed for Node '{0}'. Status = {2}, NodeId = {1}", nodes[ii], nodes[ii].NodeId, results[ii].StatusCode); return false; } // check max references. if (m_maxReferencesPerNode > 0 && m_maxReferencesPerNode < results[ii].References.Count) { Log( "Too many references returned for Node '{0}'. NodeId = {1}, Expected = {2}, Actual = {3}", nodes[ii], nodes[ii].NodeId, m_maxReferencesPerNode, results[ii].References.Count); return false; } // verify references returned. if (!VerifyReferences(nodes[ii], nodesToBrowse[ii], results[ii].References)) { return false; } // save references. references[ii].AddRange(results[ii].References); if (results[ii].ContinuationPoint != null) { // check max references. if (results[ii].References.Count == 0) { Log( "No references returned with a continuation point for Node '{0}'. NodeId = {1}, Expected = {2}", nodes[ii], nodes[ii].NodeId, m_maxReferencesPerNode); return false; } // add to list to rebrowse. remainingNodes.Add(nodes[ii]); remainingNodesToBrowse.Add(nodesToBrowse[ii]); remainingReferences.Add(references[ii]); continuationPoints.Add(results[ii].ContinuationPoint); } } // process continuation points. while (continuationPoints.Count > 0) { requestHeader = new RequestHeader(); requestHeader.ReturnDiagnostics = 0; Session.BrowseNext( requestHeader, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); // check diagnostics. if (diagnosticInfos != null && diagnosticInfos.Count > 0) { Log("Returned non-empty DiagnosticInfos array during BrowseNext."); return false; } nodes = remainingNodes; nodesToBrowse = remainingNodesToBrowse; references = remainingReferences; // process results. remainingNodes = new List<Node>(); remainingNodesToBrowse = new BrowseDescriptionCollection(); remainingReferences = new List<ReferenceDescriptionCollection>(); continuationPoints = new ByteStringCollection(); for (int ii = 0; ii < results.Count; ii++) { // check status code. if (StatusCode.IsBad(results[ii].StatusCode)) { Log( "BrowseNext Failed for Node '{0}'. Status = {2}, NodeId = {1}", nodes[ii], nodes[ii].NodeId, results[ii].StatusCode); return false; } // check max references. if (m_maxReferencesPerNode > 0 && m_maxReferencesPerNode < results[ii].References.Count) { Log( "Too many references returned for Node '{0}'. NodeId = {1}, Expected = {2}, Actual = {3}", nodes[ii], nodes[ii].NodeId, m_maxReferencesPerNode, results[ii].References.Count); return false; } // verify references returned. if (!VerifyReferences(nodes[ii], nodesToBrowse[ii], results[ii].References)) { return false; } // save references. references[ii].AddRange(results[ii].References); if (results[ii].ContinuationPoint != null) { // check max references. if (results[ii].References.Count == 0) { Log( "No references returned with a continuation point for Node '{0}'. NodeId = {1}, Expected = {2}", nodes[ii], nodes[ii].NodeId, m_maxReferencesPerNode); return false; } // add to list to rebrowse. remainingNodes.Add(nodes[ii]); remainingNodesToBrowse.Add(nodesToBrowse[ii]); remainingReferences.Add(references[ii]); continuationPoints.Add(results[ii].ContinuationPoint); } } } // verify filters. for (int ii = 0; ii < originalNodes.Count; ii++) { if (!VerifyFilterResults(originalNodes[ii], originalNodesToBrowse[ii], originalReferences[ii])) { return false; } } return true; }
/// <summary> /// Reads the properties for the node. /// </summary> private void ReadProperties(NodeId nodeId) { // build list of references to browse. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasProperty; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = (uint)NodeClass.Variable; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; nodesToBrowse.Add(nodeToBrowse); // find properties. ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, View, nodesToBrowse, false); // build list of properties to read. ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); for (int ii = 0; references != null && ii < references.Count; ii++) { ReferenceDescription reference = references[ii]; // ignore out of server references. if (reference.NodeId.IsAbsolute) { continue; } ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = (NodeId)reference.NodeId; nodeToRead.AttributeId = Attributes.Value; nodeToRead.Handle = reference; nodesToRead.Add(nodeToRead); } if (nodesToRead.Count == 0) { return; } // read the properties. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); // add the results to the display. for (int ii = 0; ii < results.Count; ii++) { ReferenceDescription reference = (ReferenceDescription)nodesToRead[ii].Handle; TypeInfo typeInfo = TypeInfo.Construct(results[ii].Value); // add the metadata for the attribute. ListViewItem item = new ListViewItem(reference.ToString()); item.SubItems.Add(typeInfo.BuiltInType.ToString()); if (typeInfo.ValueRank >= 0) { item.SubItems[1].Text += "[]"; } // add the value. if (StatusCode.IsBad(results[ii].StatusCode)) { item.SubItems.Add(results[ii].StatusCode.ToString()); } else { item.SubItems.Add(results[ii].WrappedValue.ToString()); } item.Tag = results[ii]; // display in list. AttributesLV.Items.Add(item); } // set the column widths. for (int ii = 0; ii < AttributesLV.Columns.Count; ii++) { AttributesLV.Columns[ii].Width = -2; } }
/// <summary> /// Browses the node and verifies the results. /// </summary> protected override bool Browse( Node node, BrowseDescription nodeToBrowse, ReferenceDescriptionCollection references) { List<Node> nodes = new List<Node>(); BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); List<ReferenceDescriptionCollection> referenceLists = new List<ReferenceDescriptionCollection>(); nodes.Add(node); nodesToBrowse.Add(nodeToBrowse); referenceLists.Add(references); return Browse(nodes, nodesToBrowse, referenceLists); }
/// <summary> /// Displays the attributes and properties in the attributes view. /// </summary> /// <param name="sourceId">The NodeId of the Node to browse.</param> private void DisplayAttributes(NodeId sourceId) { try { AttributesLV.Items.Clear(); ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); // attempt to read all possible attributes. for (uint ii = Attributes.NodeClass; ii <= Attributes.UserExecutable; ii++) { ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = sourceId; nodeToRead.AttributeId = ii; nodesToRead.Add(nodeToRead); } int startOfProperties = nodesToRead.Count; // find all of the pror of the node. BrowseDescription nodeToBrowse1 = new BrowseDescription(); nodeToBrowse1.NodeId = sourceId; nodeToBrowse1.BrowseDirection = BrowseDirection.Forward; nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.HasProperty; nodeToBrowse1.IncludeSubtypes = true; nodeToBrowse1.NodeClassMask = 0; nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse1); // fetch property references from the server. ReferenceDescriptionCollection references = FormUtils.Browse(m_session, nodesToBrowse, false); if (references == null) { return; } for (int ii = 0; ii < references.Count; ii++) { // ignore external references. if (references[ii].NodeId.IsAbsolute) { continue; } ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = (NodeId)references[ii].NodeId; nodeToRead.AttributeId = Attributes.Value; nodesToRead.Add(nodeToRead); } // read all values. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); // process results. for (int ii = 0; ii < results.Count; ii++) { string name = null; string datatype = null; string value = null; // process attribute value. if (ii < startOfProperties) { // ignore attributes which are invalid for the node. if (results[ii].StatusCode == StatusCodes.BadAttributeIdInvalid) { continue; } // get the name of the attribute. name = Attributes.GetBrowseName(nodesToRead[ii].AttributeId); // display any unexpected error. if (StatusCode.IsBad(results[ii].StatusCode)) { datatype = Utils.Format("{0}", Attributes.GetDataTypeId(nodesToRead[ii].AttributeId)); value = Utils.Format("{0}", results[ii].StatusCode); } // display the value. else { TypeInfo typeInfo = TypeInfo.Construct(results[ii].Value); datatype = typeInfo.BuiltInType.ToString(); if (typeInfo.ValueRank >= ValueRanks.OneOrMoreDimensions) { datatype += "[]"; } value = Utils.Format("{0}", results[ii].Value); } } // process property value. else { // ignore properties which are invalid for the node. if (results[ii].StatusCode == StatusCodes.BadNodeIdUnknown) { continue; } // get the name of the property. name = Utils.Format("{0}", references[ii-startOfProperties]); // display any unexpected error. if (StatusCode.IsBad(results[ii].StatusCode)) { datatype = String.Empty; value = Utils.Format("{0}", results[ii].StatusCode); } // display the value. else { TypeInfo typeInfo = TypeInfo.Construct(results[ii].Value); datatype = typeInfo.BuiltInType.ToString(); if (typeInfo.ValueRank >= ValueRanks.OneOrMoreDimensions) { datatype += "[]"; } value = Utils.Format("{0}", results[ii].Value); } } // add the attribute name/value to the list view. ListViewItem item = new ListViewItem(name); item.SubItems.Add(datatype); item.SubItems.Add(value); AttributesLV.Items.Add(item); } // adjust width of all columns. for (int ii = 0; ii < AttributesLV.Columns.Count; ii++) { AttributesLV.Columns[ii].Width = -2; } } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
/// <summary> /// 读取一个节点的所有属性 /// </summary> /// <param name="tag">节点值</param> /// <returns>所有的数据</returns> public DataValue[] ReadNoteDataValueAttributes(string tag) { NodeId sourceId = new NodeId(tag); ReadValueIdCollection nodesToRead = new ReadValueIdCollection( ); // attempt to read all possible attributes. // 尝试着去读取所有可能的特性 for (uint ii = Attributes.NodeId; ii <= Attributes.UserExecutable; ii++) { ReadValueId nodeToRead = new ReadValueId( ); nodeToRead.NodeId = sourceId; nodeToRead.AttributeId = ii; nodesToRead.Add(nodeToRead); } int startOfProperties = nodesToRead.Count; // find all of the pror of the node. BrowseDescription nodeToBrowse1 = new BrowseDescription( ); nodeToBrowse1.NodeId = sourceId; nodeToBrowse1.BrowseDirection = BrowseDirection.Forward; nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.HasProperty; nodeToBrowse1.IncludeSubtypes = true; nodeToBrowse1.NodeClassMask = 0; nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection( ); nodesToBrowse.Add(nodeToBrowse1); // fetch property references from the server. ReferenceDescriptionCollection references = FormUtils.Browse(m_session, nodesToBrowse, false); if (references == null) { return(new DataValue[0]); } for (int ii = 0; ii < references.Count; ii++) { // ignore external references. if (references[ii].NodeId.IsAbsolute) { continue; } ReadValueId nodeToRead = new ReadValueId( ); nodeToRead.NodeId = (NodeId)references[ii].NodeId; nodeToRead.AttributeId = Attributes.Value; nodesToRead.Add(nodeToRead); } // read all values. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); return(results.ToArray( )); }
static void Browse(Session session) { DiagnosticInfoCollection diagnosticInfos; BrowseDescriptionCollection bc = new BrowseDescriptionCollection(); BrowseDescription bd = new BrowseDescription(); bd.BrowseDirection = BrowseDirection.Forward; NodeId nodeId = Opc.Ua.Objects.ObjectsFolder; do { Console.WriteLine("\n Enter nodeId to Browse (or q to exit)"); string s = Console.ReadLine(); if (s == "q") break; if (s.Length == 0) { nodeId = Opc.Ua.Objects.ObjectsFolder; } else nodeId = new NodeId(s); bc.Clear(); bd.NodeId = nodeId; bc.Add(bd); BrowseResultCollection results; ResponseHeader rh = session.Browse(null, null, 100, bc, out results, out diagnosticInfos); foreach ( BrowseResult res in results) { foreach (ReferenceDescription rdc in res.References) { Console.WriteLine(String.Format(" Node = {0} (namespace {1}) {2}", rdc.NodeId.ToString(),rdc.NodeId.NamespaceIndex, Environment.NewLine)); } } } while (true); }
/// <summary> /// Returns the next reference. /// </summary> /// <returns>The next reference that meets the browse criteria.</returns> public override IReference Next() { lock (DataLock) { IReference reference = null; // enumerate pre-defined references. // always call first to ensure any pushed-back references are returned first. reference = base.Next(); if (reference != null) { return(reference); } // don't start browsing huge number of references when only internal references are requested. if (InternalOnly) { return(null); } if (m_stage == Stage.Begin) { // construct request. BrowseDescription nodeToBrowse = new BrowseDescription(); NodeId startId = ObjectIds.ObjectsFolder; if (m_source != null) { startId = m_mapper.ToRemoteId(m_source.NodeId); } nodeToBrowse.NodeId = startId; nodeToBrowse.BrowseDirection = this.BrowseDirection; nodeToBrowse.ReferenceTypeId = this.ReferenceType; nodeToBrowse.IncludeSubtypes = this.IncludeSubtypes; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; ResponseHeader responseHeader = m_client.Browse( null, null, 0, nodesToBrowse, out results, out diagnosticInfos); // these do sanity checks on the result - make sure response matched the request. ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); m_position = 0; m_references = null; m_continuationPoint = null; m_stage = Stage.References; // check status. if (StatusCode.IsGood(results[0].StatusCode)) { m_references = results[0].References; m_continuationPoint = results[0].ContinuationPoint; reference = NextChild(); if (reference != null) { return(reference); } } } if (m_stage == Stage.References) { reference = NextChild(); if (reference != null) { return(reference); } if (m_source == null && IsRequired(ReferenceTypes.HasNotifier, false)) { // construct request. BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = ObjectIds.Server; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = ReferenceTypes.HasNotifier; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; ResponseHeader responseHeader = m_client.Browse( null, null, 0, nodesToBrowse, out results, out diagnosticInfos); // these do sanity checks on the result - make sure response matched the request. ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); m_position = 0; m_references = null; m_continuationPoint = null; m_stage = Stage.Notifiers; // check status. if (StatusCode.IsGood(results[0].StatusCode)) { m_references = results[0].References; m_continuationPoint = results[0].ContinuationPoint; } } m_stage = Stage.Notifiers; } if (m_stage == Stage.Notifiers) { reference = NextChild(); if (reference != null) { return(reference); } m_stage = Stage.Done; } // all done. return(null); } }
/// <summary> /// Browses the node and returns the references found. /// </summary> protected virtual bool Browse( Node node, BrowseDescription nodeToBrowse, ReferenceDescriptionCollection references) { BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); BrowseResultCollection results; DiagnosticInfoCollection diagnosticInfos; RequestHeader requestHeader = new RequestHeader(); requestHeader.ReturnDiagnostics = 0; Session.Browse( requestHeader, new ViewDescription(), 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); // check diagnostics. if (diagnosticInfos != null && diagnosticInfos.Count > 0) { Log("Returned non-empty DiagnosticInfos array during Browse."); return false; } // process results. ByteStringCollection continuationPoints = new ByteStringCollection(); for (int ii = 0; ii < results.Count; ii++) { // check status code. if (StatusCode.IsBad(results[ii].StatusCode)) { Log( "Browse Failed for Node '{0}'. Status = {2}, NodeId = {1}", node, node.NodeId, results[ii].StatusCode); return false; } // save references. references.AddRange(results[ii].References); if (results[ii].ContinuationPoint != null) { continuationPoints.Add(results[ii].ContinuationPoint); } } // process continuation points. while (continuationPoints.Count > 0) { requestHeader = new RequestHeader(); requestHeader.ReturnDiagnostics = 0; Session.BrowseNext( requestHeader, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); // check diagnostics. if (diagnosticInfos != null && diagnosticInfos.Count > 0) { Log("Returned non-empty DiagnosticInfos array during BrowseNext."); return false; } continuationPoints.Clear(); // process results. for (int ii = 0; ii < results.Count; ii++) { // check status code. if (StatusCode.IsBad(results[ii].StatusCode)) { Log( "BrowseNext Failed for Node '{0}'. Status = {2}, NodeId = {1}", node, node.NodeId, results[ii].StatusCode); return false; } // save references. references.AddRange(results[ii].References); if (results[ii].ContinuationPoint != null) { // check max references. if (results[ii].References.Count == 0) { Log( "No references returned with a continuation point for Node '{0}'. NodeId = {1}", node, node.NodeId); return false; } continuationPoints.Add(results[ii].ContinuationPoint); } } } return true; }
/// <summary> /// Creates a browse description for a node class test. /// </summary> private void AddReferenceTypeTest( Node node, NodeId referenceTypeId, bool isInverse, bool includeSubtypes, List<Node> nodes, BrowseDescriptionCollection nodesToBrowse, List<ReferenceDescriptionCollection> references, bool clearLists) { if (clearLists) { nodes.Clear(); nodesToBrowse.Clear(); references.Clear(); } nodes.Add(node); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = node.NodeId; nodeToBrowse.ReferenceTypeId = referenceTypeId; nodeToBrowse.IncludeSubtypes = includeSubtypes; nodeToBrowse.BrowseDirection = (isInverse)?BrowseDirection.Inverse:BrowseDirection.Forward; nodeToBrowse.NodeClassMask = (uint)NodeClass.Unspecified; nodeToBrowse.ResultMask = (uint)(BrowseResultMask.DisplayName | BrowseResultMask.NodeClass | BrowseResultMask.ReferenceTypeId | BrowseResultMask.IsForward); nodesToBrowse.Add(nodeToBrowse); references.Add(new ReferenceDescriptionCollection()); }
/// <summary> /// /// </summary> /// <param name="session"></param> /// <param name="nodesToBrowse"></param> /// <returns></returns> public static ReferenceDescriptionCollection BrowsePart(this Session session, BrowseDescriptionCollection nodesToBrowse) { try { ReferenceDescriptionCollection references = new ReferenceDescriptionCollection(); BrowseDescriptionCollection unprocessedOperations = new BrowseDescriptionCollection(); while (nodesToBrowse.Count > 0) { // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, null, 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); for (int ii = 0; ii < nodesToBrowse.Count; ii++) { // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { // this error indicates that the server does not have enough simultaneously active // continuation points. This request will need to be resent after the other operations // have been completed and their continuation points released. if (results[ii].StatusCode == StatusCodes.BadNoContinuationPoints) { unprocessedOperations.Add(nodesToBrowse[ii]); } continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. references.AddRange(results[ii].References); } // check if unprocessed results exist. nodesToBrowse = unprocessedOperations; } // return complete list. return(references); } catch (Exception) { return(null); } }
/// <summary> /// Browses the children of the node and updates the tree. /// </summary> private bool BrowseChildren(TreeNode parent) { ReferenceDescription reference = parent.Tag as ReferenceDescription; if (reference == null) { return(false); } parent.Nodes.Clear(); if (reference.NodeId.IsAbsolute) { return(false); } BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = (NodeId)reference.NodeId; nodeToBrowse.BrowseDirection = m_browseDirection; nodeToBrowse.ReferenceTypeId = m_referenceTypeId; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)(int)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); ViewDescription view = null; if (NodeId.IsNull(m_viewId)) { view = new ViewDescription(); view.ViewId = m_viewId; view.Timestamp = DateTime.MinValue; view.ViewVersion = 0; } BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Browse( null, view, 0, nodesToBrowse, out results, out diagnosticInfos); if (results.Count != 1 || StatusCode.IsBad(results[0].StatusCode)) { return(false); } UpdateNode(parent, results[0].References); while (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { ByteStringCollection continuationPoints = new ByteStringCollection(); continuationPoints.Add(results[0].ContinuationPoint); m_session.BrowseNext( null, parent == null, continuationPoints, out results, out diagnosticInfos); if (results.Count != 1 || StatusCode.IsBad(results[0].StatusCode)) { return(false); } UpdateNode(parent, results[0].References); } return(true); }
/// <summary> /// Browses the address space and returns the references found. /// </summary> public static ReferenceDescriptionCollection Browse(Session session, ViewDescription view, BrowseDescriptionCollection nodesToBrowse, bool throwOnError) { try { ReferenceDescriptionCollection references = new ReferenceDescriptionCollection(); BrowseDescriptionCollection unprocessedOperations = new BrowseDescriptionCollection(); while (nodesToBrowse.Count > 0) { // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, view, 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); ByteStringCollection continuationPoints = new ByteStringCollection(); for (int ii = 0; ii < nodesToBrowse.Count; ii++) { // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { // this error indicates that the server does not have enough simultaneously active // continuation points. This request will need to be resent after the other operations // have been completed and their continuation points released. if (results[ii].StatusCode == StatusCodes.BadNoContinuationPoints) { unprocessedOperations.Add(nodesToBrowse[ii]); } continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. references.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null) { continuationPoints.Add(results[ii].ContinuationPoint); } } // process continuation points. ByteStringCollection revisedContiuationPoints = new ByteStringCollection(); while (continuationPoints.Count > 0) { // continue browse operation. session.BrowseNext( null, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); for (int ii = 0; ii < continuationPoints.Count; ii++) { // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. references.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null) { revisedContiuationPoints.Add(results[ii].ContinuationPoint); } } // check if browsing must continue; revisedContiuationPoints = continuationPoints; } // check if unprocessed results exist. nodesToBrowse = unprocessedOperations; } // return complete list. return(references); } catch (Exception exception) { if (throwOnError) { throw new ServiceResultException(exception, StatusCodes.BadUnexpectedError); } return(null); } }
/// <summary> /// Fetches the references for the node. /// </summary> private List<ReferenceDescription> Browse(Session session, NodeId nodeId) { List<ReferenceDescription> references = new List<ReferenceDescription>(); // specify the references to follow and the fields to return. BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.References; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.BrowseDirection = BrowseDirection.Both; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; ResponseHeader responseHeader = session.Browse( null, null, 2, nodesToBrowse, out results, out diagnosticInfos); // these do sanity checks on the result - make sure response matched the request. ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); // check status. if (StatusCode.IsBad(results[0].StatusCode)) { // embed the diagnostic information in a exception. throw ServiceResultException.Create(results[0].StatusCode, 0, diagnosticInfos, responseHeader.StringTable); } // add first batch. references.AddRange(results[0].References); // check if server limited the results. while (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { ByteStringCollection continuationPoints = new ByteStringCollection(); continuationPoints.Add(results[0].ContinuationPoint); // continue browse operation. responseHeader = session.BrowseNext( null, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); // check status. if (StatusCode.IsBad(results[0].StatusCode)) { // embed the diagnostic information in a exception. throw ServiceResultException.Create(results[0].StatusCode, 0, diagnosticInfos, responseHeader.StringTable); } // add next batch. references.AddRange(results[0].References); } return references; }
/// <summary> /// Finds the targets for the specified reference. /// </summary> private static List <NodeId> FindTargetOfReference(Session session, List <NodeId> nodeIds, NodeId referenceTypeId, bool throwOnError) { try { // construct browse request. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeIds[ii]; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = referenceTypeId; nodeToBrowse.IncludeSubtypes = false; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.None; nodesToBrowse.Add(nodeToBrowse); } // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, null, 1, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); List <NodeId> targetIds = new List <NodeId>(); ByteStringCollection continuationPoints = new ByteStringCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { targetIds.Add(null); // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { continue; } // check for continuation point. if (results[ii].ContinuationPoint != null && results[ii].ContinuationPoint.Length > 0) { continuationPoints.Add(results[ii].ContinuationPoint); } // get the node id. if (results[ii].References.Count > 0) { if (NodeId.IsNull(results[ii].References[0].NodeId) || results[ii].References[0].NodeId.IsAbsolute) { continue; } targetIds[ii] = (NodeId)results[ii].References[0].NodeId; } } // release continuation points. if (continuationPoints.Count > 0) { session.BrowseNext( null, true, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); } //return complete list. return(targetIds); } catch (Exception exception) { if (throwOnError) { throw new ServiceResultException(exception, StatusCodes.BadUnexpectedError); } return(null); } }
private static BrowseDescriptionCollection PrepareBrowseDescriptionCollection( NodeId nodeId, uint nodeClassMask) { // We do not inspect all references, but only organize and HasComponent. BrowseDescriptionCollection browseDescriptionCollection = new BrowseDescriptionCollection(); BrowseDescription nodeToBrowse = new BrowseDescription() { NodeId = nodeId, ReferenceTypeId = ReferenceTypeIds.Organizes, IncludeSubtypes = true, BrowseDirection = BrowseDirection.Forward, NodeClassMask = nodeClassMask, ResultMask = (uint)BrowseResultMask.All }; browseDescriptionCollection.Add(nodeToBrowse); nodeToBrowse = new BrowseDescription() { NodeId = nodeId, ReferenceTypeId = ReferenceTypeIds.HasComponent, IncludeSubtypes = true, BrowseDirection = BrowseDirection.Forward, NodeClassMask = nodeClassMask, ResultMask = (uint)BrowseResultMask.All }; browseDescriptionCollection.Add(nodeToBrowse); nodeToBrowse = new BrowseDescription() { NodeId = nodeId, ReferenceTypeId = ReferenceTypeIds.HasChild, IncludeSubtypes = true, BrowseDirection = BrowseDirection.Forward, NodeClassMask = nodeClassMask, ResultMask = (uint)BrowseResultMask.All }; browseDescriptionCollection.Add(nodeToBrowse); nodeToBrowse = new BrowseDescription() { NodeId = nodeId, ReferenceTypeId = ReferenceTypeIds.HasDescription, IncludeSubtypes = true, BrowseDirection = BrowseDirection.Forward, NodeClassMask = nodeClassMask, ResultMask = (uint)BrowseResultMask.All }; browseDescriptionCollection.Add(nodeToBrowse); nodeToBrowse = new BrowseDescription() { NodeId = nodeId, ReferenceTypeId = ReferenceTypeIds.HasProperty, IncludeSubtypes = true, BrowseDirection = BrowseDirection.Forward, NodeClassMask = nodeClassMask, ResultMask = (uint)BrowseResultMask.All }; browseDescriptionCollection.Add(nodeToBrowse); nodeToBrowse = new BrowseDescription { NodeId = nodeId, BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = ReferenceTypeIds.HasProperty, IncludeSubtypes = true, NodeClassMask = (uint)(NodeClass.Variable | NodeClass.Object), ResultMask = (uint)BrowseResultMask.All }; browseDescriptionCollection.Add(nodeToBrowse); return(browseDescriptionCollection); }
/// <summary> /// Reads the arguments for the method. /// </summary> private void ReadArguments(NodeId nodeId) { m_inputArguments = null; m_outputArguments = null; // build list of references to browse. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasProperty; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = (uint)NodeClass.Variable; nodeToBrowse.ResultMask = (uint)BrowseResultMask.BrowseName; nodesToBrowse.Add(nodeToBrowse); // find properties. ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, null, nodesToBrowse, false); // build list of properties to read. ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); for (int ii = 0; references != null && ii < references.Count; ii++) { ReferenceDescription reference = references[ii]; // ignore out of server references. if (reference.NodeId.IsAbsolute) { continue; } // ignore other properties. if (reference.BrowseName != Opc.Ua.BrowseNames.InputArguments && reference.BrowseName != Opc.Ua.BrowseNames.OutputArguments) { continue; } ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = (NodeId)reference.NodeId; nodeToRead.AttributeId = Attributes.Value; nodeToRead.Handle = reference; nodesToRead.Add(nodeToRead); } // method has no arguments. if (nodesToRead.Count == 0) { return; } // read the arguments. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); // save the results. for (int ii = 0; ii < results.Count; ii++) { ReferenceDescription reference = (ReferenceDescription)nodesToRead[ii].Handle; if (StatusCode.IsGood(results[ii].StatusCode)) { if (reference.BrowseName == Opc.Ua.BrowseNames.InputArguments) { m_inputArguments = (Argument[])ExtensionObject.ToArray(results[ii].GetValue <ExtensionObject[]>(null), typeof(Argument)); } if (reference.BrowseName == Opc.Ua.BrowseNames.OutputArguments) { m_outputArguments = (Argument[])ExtensionObject.ToArray(results[ii].GetValue <ExtensionObject[]>(null), typeof(Argument)); } } } // set default values for input arguments. if (m_inputArguments != null) { foreach (Argument argument in m_inputArguments) { argument.Value = TypeInfo.GetDefaultValue(argument.DataType, argument.ValueRank, m_session.TypeTree); } } }
/// <summary> /// Gets the list of references to follow. /// </summary> private BrowseDescriptionCollection CreateNodesToBrowse() { BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); if (ReferenceTypeIds != null && ReferenceTypeIds.Length > 0) { for (int ii = 0; ii < ReferenceTypeIds.Length; ii++) { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = NodeId; nodeToBrowse.BrowseDirection = BrowseDirection; nodeToBrowse.ReferenceTypeId = ReferenceTypeIds[ii]; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; nodesToBrowse.Add(nodeToBrowse); } } else { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = NodeId; nodeToBrowse.BrowseDirection = BrowseDirection; nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.References; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; nodesToBrowse.Add(nodeToBrowse); } return nodesToBrowse; }
/// <summary> /// 读取一个节点的所有属性 /// </summary> /// <param name="tag">节点信息</param> /// <returns>节点的特性值</returns> public OpcNodeAttribute[] ReadNoteAttributes(string tag) { NodeId sourceId = new NodeId(tag); ReadValueIdCollection nodesToRead = new ReadValueIdCollection( ); // attempt to read all possible attributes. // 尝试着去读取所有可能的特性 for (uint ii = Attributes.NodeClass; ii <= Attributes.UserExecutable; ii++) { ReadValueId nodeToRead = new ReadValueId( ); nodeToRead.NodeId = sourceId; nodeToRead.AttributeId = ii; nodesToRead.Add(nodeToRead); } int startOfProperties = nodesToRead.Count; // find all of the pror of the node. BrowseDescription nodeToBrowse1 = new BrowseDescription( ); nodeToBrowse1.NodeId = sourceId; nodeToBrowse1.BrowseDirection = BrowseDirection.Forward; nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.HasProperty; nodeToBrowse1.IncludeSubtypes = true; nodeToBrowse1.NodeClassMask = 0; nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection( ); nodesToBrowse.Add(nodeToBrowse1); // fetch property references from the server. ReferenceDescriptionCollection references = FormUtils.Browse(m_session, nodesToBrowse, false); if (references == null) { return(new OpcNodeAttribute[0]); } for (int ii = 0; ii < references.Count; ii++) { // ignore external references. if (references[ii].NodeId.IsAbsolute) { continue; } ReadValueId nodeToRead = new ReadValueId( ); nodeToRead.NodeId = (NodeId)references[ii].NodeId; nodeToRead.AttributeId = Attributes.Value; nodesToRead.Add(nodeToRead); } // read all values. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); // process results. List <OpcNodeAttribute> nodeAttribute = new List <OpcNodeAttribute>( ); for (int ii = 0; ii < results.Count; ii++) { OpcNodeAttribute item = new OpcNodeAttribute( ); // process attribute value. if (ii < startOfProperties) { // ignore attributes which are invalid for the node. if (results[ii].StatusCode == StatusCodes.BadAttributeIdInvalid) { continue; } // get the name of the attribute. item.Name = Attributes.GetBrowseName(nodesToRead[ii].AttributeId); // display any unexpected error. if (StatusCode.IsBad(results[ii].StatusCode)) { item.Type = Utils.Format("{0}", Attributes.GetDataTypeId(nodesToRead[ii].AttributeId)); item.Value = Utils.Format("{0}", results[ii].StatusCode); } // display the value. else { TypeInfo typeInfo = TypeInfo.Construct(results[ii].Value); item.Type = typeInfo.BuiltInType.ToString( ); if (typeInfo.ValueRank >= ValueRanks.OneOrMoreDimensions) { item.Type += "[]"; } item.Value = results[ii].Value;//Utils.Format("{0}", results[ii].Value); } } // process property value. else { // ignore properties which are invalid for the node. if (results[ii].StatusCode == StatusCodes.BadNodeIdUnknown) { continue; } // get the name of the property. item.Name = Utils.Format("{0}", references[ii - startOfProperties]); // display any unexpected error. if (StatusCode.IsBad(results[ii].StatusCode)) { item.Type = String.Empty; item.Value = Utils.Format("{0}", results[ii].StatusCode); } // display the value. else { TypeInfo typeInfo = TypeInfo.Construct(results[ii].Value); item.Type = typeInfo.BuiltInType.ToString( ); if (typeInfo.ValueRank >= ValueRanks.OneOrMoreDimensions) { item.Type += "[]"; } item.Value = results[ii].Value; //Utils.Format("{0}", results[ii].Value); } } nodeAttribute.Add(item); } return(nodeAttribute.ToArray( )); }
/// <summary> /// Fetches the references for the node. /// </summary> private List <ReferenceDescription> Browse(Session session, NodeId nodeId) { List <ReferenceDescription> references = new List <ReferenceDescription>(); // specify the references to follow and the fields to return. BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.References; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.BrowseDirection = BrowseDirection.Both; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; ResponseHeader responseHeader = session.Browse( null, null, 2, nodesToBrowse, out results, out diagnosticInfos); // these do sanity checks on the result - make sure response matched the request. ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); // check status. if (StatusCode.IsBad(results[0].StatusCode)) { // embed the diagnostic information in a exception. throw ServiceResultException.Create(results[0].StatusCode, 0, diagnosticInfos, responseHeader.StringTable); } // add first batch. references.AddRange(results[0].References); // check if server limited the results. while (results[0].ContinuationPoint != null && results[0].ContinuationPoint.Length > 0) { ByteStringCollection continuationPoints = new ByteStringCollection(); continuationPoints.Add(results[0].ContinuationPoint); // continue browse operation. responseHeader = session.BrowseNext( null, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); // check status. if (StatusCode.IsBad(results[0].StatusCode)) { // embed the diagnostic information in a exception. throw ServiceResultException.Create(results[0].StatusCode, 0, diagnosticInfos, responseHeader.StringTable); } // add next batch. references.AddRange(results[0].References); } return(references); }
/// <summary> /// Browses the specified node. /// </summary> public ReferenceDescriptionCollection Browse(NodeId nodeId) { if (m_session == null) { throw new ServiceResultException(StatusCodes.BadServerNotConnected, "Cannot browse if not connected to a server."); } try { m_browseInProgress = true; // construct request. BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = m_browseDirection; nodeToBrowse.ReferenceTypeId = m_referenceTypeId; nodeToBrowse.IncludeSubtypes = m_includeSubtypes; nodeToBrowse.NodeClassMask = m_nodeClassMask; nodeToBrowse.ResultMask = m_resultMask; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); // make the call to the server. BrowseResultCollection results; DiagnosticInfoCollection diagnosticInfos; ResponseHeader responseHeader = m_session.Browse( null, m_view, m_maxReferencesReturned, nodesToBrowse, out results, out diagnosticInfos); // ensure that the server returned valid results. Session.ValidateResponse(results, nodesToBrowse); Session.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); // check if valid. if (StatusCode.IsBad(results[0].StatusCode)) { throw ServiceResultException.Create(results[0].StatusCode, 0, diagnosticInfos, responseHeader.StringTable); } // fetch initial set of references. byte[] continuationPoint = results[0].ContinuationPoint; ReferenceDescriptionCollection references = results[0].References; // process any continuation point. while (continuationPoint != null) { ReferenceDescriptionCollection additionalReferences; if (!m_continueUntilDone && m_MoreReferences != null) { BrowserEventArgs args = new BrowserEventArgs(references); m_MoreReferences(this, args); // cancel browser and return the references fetched so far. if (args.Cancel) { BrowseNext(ref continuationPoint, true); return(references); } m_continueUntilDone = args.ContinueUntilDone; } additionalReferences = BrowseNext(ref continuationPoint, false); if (additionalReferences != null && additionalReferences.Count > 0) { references.AddRange(additionalReferences); } else { Utils.LogWarning("Browser: Continuation point exists, but the browse results are null/empty."); break; } } // return the results. return(references); } finally { m_browseInProgress = false; } }
/// <summary> /// Browses the node and returns the references found. /// </summary> protected virtual bool Browse( Node node, BrowseDescription nodeToBrowse, ReferenceDescriptionCollection references) { BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); nodesToBrowse.Add(nodeToBrowse); BrowseResultCollection results; DiagnosticInfoCollection diagnosticInfos; RequestHeader requestHeader = new RequestHeader(); requestHeader.ReturnDiagnostics = 0; Session.Browse( requestHeader, new ViewDescription(), 0, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); // check diagnostics. if (diagnosticInfos != null && diagnosticInfos.Count > 0) { Log("Returned non-empty DiagnosticInfos array during Browse."); return(false); } // process results. ByteStringCollection continuationPoints = new ByteStringCollection(); for (int ii = 0; ii < results.Count; ii++) { // check status code. if (StatusCode.IsBad(results[ii].StatusCode)) { Log( "Browse Failed for Node '{0}'. Status = {2}, NodeId = {1}", node, node.NodeId, results[ii].StatusCode); return(false); } // save references. references.AddRange(results[ii].References); if (results[ii].ContinuationPoint != null) { continuationPoints.Add(results[ii].ContinuationPoint); } } // process continuation points. while (continuationPoints.Count > 0) { requestHeader = new RequestHeader(); requestHeader.ReturnDiagnostics = 0; Session.BrowseNext( requestHeader, false, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); // check diagnostics. if (diagnosticInfos != null && diagnosticInfos.Count > 0) { Log("Returned non-empty DiagnosticInfos array during BrowseNext."); return(false); } continuationPoints.Clear(); // process results. for (int ii = 0; ii < results.Count; ii++) { // check status code. if (StatusCode.IsBad(results[ii].StatusCode)) { Log( "BrowseNext Failed for Node '{0}'. Status = {2}, NodeId = {1}", node, node.NodeId, results[ii].StatusCode); return(false); } // save references. references.AddRange(results[ii].References); if (results[ii].ContinuationPoint != null) { // check max references. if (results[ii].References.Count == 0) { Log( "No references returned with a continuation point for Node '{0}'. NodeId = {1}", node, node.NodeId); return(false); } continuationPoints.Add(results[ii].ContinuationPoint); } } } return(true); }
/// <summary> /// Handles the BeforeExpand event of the BrowseTV control. /// </summary> private void BrowseTV_BeforeExpand(object sender, TreeViewCancelEventArgs e) { try { ReferenceDescription reference = (ReferenceDescription)e.Node.Tag; e.Node.Nodes.Clear(); // build list of references to browse. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); for (int ii = 0; ii < m_referenceTypeIds.Length; ii++) { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = m_rootId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = m_referenceTypeIds[ii]; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; if (reference != null) { nodeToBrowse.NodeId = (NodeId)reference.NodeId; } nodesToBrowse.Add(nodeToBrowse); } // add the childen to the control. SortedDictionary <ExpandedNodeId, TreeNode> dictionary = new SortedDictionary <ExpandedNodeId, TreeNode>(); ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, View, nodesToBrowse, false); for (int ii = 0; references != null && ii < references.Count; ii++) { reference = references[ii]; // ignore out of server references. if (reference.NodeId.IsAbsolute) { continue; } if (dictionary.ContainsKey(reference.NodeId)) { continue; } TreeNode child = new TreeNode(reference.ToString()); child.Nodes.Add(new TreeNode()); child.Tag = reference; if (!reference.TypeDefinition.IsAbsolute) { try { if (!m_typeImageMapping.ContainsKey((NodeId)reference.TypeDefinition)) { List <NodeId> nodeIds = ClientUtils.TranslateBrowsePaths(m_session, (NodeId)reference.TypeDefinition, m_session.NamespaceUris, Opc.Ua.BrowseNames.Icon); if (nodeIds.Count > 0 && nodeIds[0] != null) { DataValue value = m_session.ReadValue(nodeIds[0]); byte[] bytes = value.Value as byte[]; if (bytes != null) { System.IO.MemoryStream istrm = new System.IO.MemoryStream(bytes); Image icon = Image.FromStream(istrm); BrowseTV.ImageList.Images.Add(icon); m_typeImageMapping[(NodeId)reference.TypeDefinition] = BrowseTV.ImageList.Images.Count - 1; } } } } catch (Exception exception) { Utils.Trace(exception, "Error loading image."); } } int index = 0; if (!m_typeImageMapping.TryGetValue((NodeId)reference.TypeDefinition, out index)) { child.ImageIndex = ClientUtils.GetImageIndex(m_session, reference.NodeClass, reference.TypeDefinition, false); child.SelectedImageIndex = ClientUtils.GetImageIndex(m_session, reference.NodeClass, reference.TypeDefinition, true); } else { child.ImageIndex = index; child.SelectedImageIndex = index; } dictionary[reference.NodeId] = child; } // add nodes to tree. foreach (TreeNode node in dictionary.Values.OrderBy(i => i.Text)) { e.Node.Nodes.Add(node); } } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
/// <summary> /// Finds the targets for the specified reference. /// </summary> private static List<NodeId> FindTargetOfReference(Session session, List<NodeId> nodeIds, NodeId referenceTypeId, bool throwOnError) { try { // construct browse request. BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeIds[ii]; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = referenceTypeId; nodeToBrowse.IncludeSubtypes = false; nodeToBrowse.NodeClassMask = 0; nodeToBrowse.ResultMask = (uint)BrowseResultMask.None; nodesToBrowse.Add(nodeToBrowse); } // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, null, 1, nodesToBrowse, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); List<NodeId> targetIds = new List<NodeId>(); ByteStringCollection continuationPoints = new ByteStringCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { targetIds.Add(null); // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { continue; } // check for continuation point. if (results[ii].ContinuationPoint != null && results[ii].ContinuationPoint.Length > 0) { continuationPoints.Add(results[ii].ContinuationPoint); } // get the node id. if (results[ii].References.Count > 0) { if (NodeId.IsNull(results[ii].References[0].NodeId) || results[ii].References[0].NodeId.IsAbsolute) { continue; } targetIds[ii] = (NodeId)results[ii].References[0].NodeId; } } // release continuation points. if (continuationPoints.Count > 0) { session.BrowseNext( null, true, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToBrowse); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse); } //return complete list. return targetIds; } catch (Exception exception) { if (throwOnError) { throw new ServiceResultException(exception, StatusCodes.BadUnexpectedError); } return null; } }