示例#1
0
        /// <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);
                    }
                }
            }
        }
示例#2
0
        // 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);
        }
示例#3
0
        /// <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);
                    }
                }
            }
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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);
            }
        }
示例#6
0
 // 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));
 }
示例#7
0
 // 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();
 }
示例#8
0
        //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();
        }