/// <summary> /// Вспомогательный метод для инициализации списка тегов с сервера. /// Вызывается при соединении с сервером /// </summary> /// <param name="itemName"></param> void InitTagList(string itemName = "") { var itemIdentifier = new Opc.ItemIdentifier(); itemIdentifier.ItemName = itemName; var browseFilters = new Opc.Da.BrowseFilters(); browseFilters.BrowseFilter = browseFilter.all; var browsePosition = new Opc.Da.BrowsePosition(itemIdentifier, browseFilters); BrowseElement[] browseElements = serverHandle.Browse(itemIdentifier, browseFilters, out browsePosition); if (browseElements != null) { foreach (BrowseElement element in browseElements) { if (element.IsItem) { var item = new Opc.Da.Item { ItemName = element.ItemName }; tagList.Add(item); } else { InitTagList(element.ItemName); } } } }
// Token: 0x060007FD RID: 2045 RVA: 0x00012D64 File Offset: 0x00011D64 public virtual object Clone() { BrowseFilters browseFilters = (BrowseFilters)base.MemberwiseClone(); browseFilters.PropertyIDs = (PropertyID[])((this.PropertyIDs != null) ? this.PropertyIDs.Clone() : null); return(browseFilters); }
/// <summary> /// Метод для поиска всех тегов на ОРС сервере /// </summary> /// <param name="itemName"></param> public void Browse(string itemName = "") { var itemIdentifier = new Opc.ItemIdentifier(); itemIdentifier.ItemName = itemName; var browseFilters = new Opc.Da.BrowseFilters(); browseFilters.BrowseFilter = browseFilter.all; var browsePosition = new Opc.Da.BrowsePosition(itemIdentifier, browseFilters); BrowseElement[] browseElements = serverHandle.Browse(itemIdentifier, browseFilters, out browsePosition); if (browseElements != null) { foreach (BrowseElement element in browseElements) { if (element.IsItem) { Console.WriteLine("Item name : {0}", element.ItemName); } else { Console.WriteLine(); Console.WriteLine("Group name : {0}", element.ItemName); Browse(element.ItemName); } } } }
/// <summary> /// Creates a deep copy of the object. /// </summary> public virtual object Clone() { BrowseFilters clone = (BrowseFilters)MemberwiseClone(); clone.PropertyIDs = (PropertyID[])((PropertyIDs != null)?PropertyIDs.Clone():null); return(clone); }
/// <summary> /// Метод рекурсивного поиска тегов в UA структурах и добавление их в disoveredTags /// </summary> /// <param name="id">объект который надо просканировать</param> private int Browse(Opc.ItemIdentifier id = null) { try { var filters = new Opc.Da.BrowseFilters { BrowseFilter = Opc.Da.browseFilter.all }; Opc.Da.BrowsePosition pos = null; var elements = server.Browse(id, filters, out pos); if (elements != null) { foreach (Opc.Da.BrowseElement element in elements) { if (element.IsItem) { _tags.Add(new Opc.Da.Item { ItemName = element.ItemName }); } if (element.HasChildren) { Browse(new Opc.ItemIdentifier(element.ItemPath, element.ItemName)); } } } return(0); } catch (Exception ex) { return(-1); } }
// Token: 0x06000049 RID: 73 RVA: 0x000035E4 File Offset: 0x000025E4 public BrowseElement[] Browse(ItemIdentifier itemID, BrowseFilters filters, out BrowsePosition position) { if (this.m_server == null) { throw new NotConnectedException(); } return(((IServer)this.m_server).Browse(itemID, filters, out position)); }
// Token: 0x060007CA RID: 1994 RVA: 0x00012ADE File Offset: 0x00011ADE public BrowsePosition(ItemIdentifier itemID, BrowseFilters filters) { if (filters == null) { throw new ArgumentNullException("filters"); } this.m_itemID = ((itemID != null) ? ((ItemIdentifier)itemID.Clone()) : null); this.m_filters = (BrowseFilters)filters.Clone(); }
//public bool IsConnectedToOPCDAServer { get { if (oPCDAServer == null) return false; else return oPCDAServer.IsConnected; } } #endregion public OPCClassicBrowserEngine() { this.OPCGroupSizeLimit = OPCBackEnd.Config.OPCClassic_SubscriptionGroupSizeLimit.ToInt(40); _OPCWrapper = new OpcCom.ServerEnumerator(); _BrowseFilters = new Opc.Da.BrowseFilters() { ReturnAllProperties = true, ReturnPropertyValues = true, BrowseFilter = Opc.Da.browseFilter.all, MaxElementsReturned = 0 }; //Check for Tag Inactivity every 5s. Every call by client will update it's activity. //If tag has been inactive for more than 3x it's update interval, remove the tag from subscription (5s min inactivity time) OPTimer CheckInactivityTimer = new OPTimer("OPC Classic Browser Engine Check Inactivity Timer", 5000); CheckInactivityTimer.Elapsed += (s) => { List <RegisteredTag> InactiveTags = this.RegisteredTags.Values.Where(RT => { if (RT.UpdateIntervalInMS <= 5000) { return((DateTime.Now - RT.LastCalled).TotalMilliseconds > 5000); } else { return((DateTime.Now - RT.LastCalled).TotalMilliseconds > 3 * RT.UpdateIntervalInMS); } }).ToList(); foreach (RegisteredTag InactiveTag in InactiveTags) { foreach (Opc.Da.Server OPCServer in _OPCDAServers) { if (!OPCServer.IsConnected) { continue; } Subscription SubscriptionWhereInactiveTagIs = OPCServer.Subscriptions.FindSubcriptionThatHasItem(InactiveTag.Id, out Item InactiveItem); if (SubscriptionWhereInactiveTagIs != null) { SubscriptionWhereInactiveTagIs.RemoveItems(new ItemIdentifier[] { InactiveItem }); } } this.RegisteredTags.Remove(InactiveTag.Id); } return(Task.CompletedTask); }; CheckInactivityTimer.Start(); }