Exemplo n.º 1
0
        /// <summary>
        /// Creates a subscription and associate it with the current session.
        /// </summary>
        /// <param name="publishingInterval">The requested publishing interval.</param>
        /// <returns>Instance of class Subscription.</returns>
        /// <exception cref="Exception">Throws and forwards any exception with short error description.</exception>
        public Subscription AddSubscription(int publishingInterval)
        {
            Subscription newSubscription = null;

            try
            {
                Opc.Ua.Client.Subscription innerSubscription = new Opc.Ua.Client.Subscription(m_Session.DefaultSubscription);

                innerSubscription.DisplayName                = "My Subscription Name";
                innerSubscription.PublishingEnabled          = true;
                innerSubscription.PublishingInterval         = publishingInterval; // in milliseconds.
                innerSubscription.KeepAliveCount             = 10;                 // 10*UaRefreshRate  = 5s if UaRefreshRate = 500
                innerSubscription.LifetimeCount              = 100;                // UaRefreshRate*100 = 50s if UaRefreshRate = 500;
                innerSubscription.MaxNotificationsPerPublish = 100;

                // Associate the subscription with the session.
                m_Session.AddSubscription(innerSubscription);

                // Call the server and create the subscription.
                innerSubscription.Create();

                // At this point the subscription is sending publish requests at the keep alive rate.
                // Use the Notification event the session to receive updates when a publish completes.
                //m_Session.Notification += new NotificationEventHandler(Session_Notification);
                m_Session.Notification += new NotificationEventHandler(DataChangedNotification);

                newSubscription                   = new Subscription();
                newSubscription.Session           = m_Session;
                newSubscription.innerSubscription = innerSubscription;
            }
            catch (Exception e)
            {
                // Console.WriteLine(e.Message);
                throw e;
            }

            return(newSubscription);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Добавление тегов к по подписке
        /// </summary>
        public override void AddTags(List <TagId> taglist)
        {
            TagListBackup = taglist;
            if (Activated)
            {
                try
                {
                    var subscription = new Subscription(session.DefaultSubscription)
                    {
                        PublishingInterval = 1
                    };

                    int tag_counter = 0;
                    var list        = new List <MonitoredItem>();

                    //foreach (TagId tag in taglist)
                    //пока конфигуратор пуст поиск делаем по всей сфере
                    foreach (var tag in discoveredTags)
                    {
                        string identifier = "";
                        //if (discoveredTags.ContainsKey(tag.TagName))
                        //пока конфигуратор пуст поиск делаем по всей сфере
                        if (tag.Key.Contains("Sfera"))
                        {
                            //logger.Logged("Info", "#" + PollerId + ": добавляем тег '" + tag.TagName + "' в подписку",
                            logger.Logged("Info", "#" + PollerId + ": добавляем тег '" + tag.Key + "' в подписку",
                                          "OpcUaPoller", "AddTags");
                            //identifier = discoveredTags[tag.TagName];
                            //пока конфигуратор пуст поиск делаем по всей сфере
                            identifier = discoveredTags[tag.Key];
                            tag_counter++;
                            var item = new MonitoredItem(subscription.DefaultItem)
                            {
                                // DisplayName = tag.TagName,
                                DisplayName = tag.Key,
                                StartNodeId = identifier
                            };
                            list.Add(item);
                        }
                        else
                        {
                            logger.Logged("Error",
                                          //"#" + PollerId + ": тег '" + tag.TagName + "' не обнаружен на сервере", "OpcUaPoller",
                                          "#" + PollerId + ": тег '" + tag.Key + "' не обнаружен на сервере", "OpcUaPoller",
                                          "AddTags");
                        }
                    }

                    if (tag_counter > 0)
                    {
                        list.ForEach(i => i.Notification += OnNotification);
                        subscription.AddItems(list);

                        session.AddSubscription(subscription);
                        subscription.Create();

                        logger.Logged("Info",
                                      "Добавлено " + tag_counter + " тегов для контроля с OPC UA сервера #" + PollerId + "",
                                      "OpcUaPoller", "AddTags");
                    }
                    else
                    {
                        logger.Logged("Error", "Не найдено ни одного тега для контроля OPC UA сервера #" + PollerId + "",
                                      "OpcUaPoller", "AddTags");
                    }
                }
                catch (Exception ex)
                {
                    logger.Logged("Error",
                                  "Не удалось добавить теги для контроля OPC UA сервером #" + PollerId + ":" + ex.Message,
                                  "OpcUaPoller", "AddTags");
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Called when a session is created with a server.
        /// </summary>
        private void OnSessionCreated(Session session)
        {
            string commonAppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
            string configFileName = Utils.Format(@"{0}\OPC Foundation\ComPseudoServers\{1}.internal.xml", commonAppDataPath, m_clsid);

            lock (m_lock)
            {
                try
                {
                    m_session = null;
                    m_Subscription = null;
                    m_AreaNodes.Clear();

                    m_session = session;

                    // load the config file.
                    if (File.Exists(configFileName))
                    {
                        XmlSerializer ser = new XmlSerializer(typeof(Configuration));
                        TextReader reader = new StreamReader(configFileName);
                        m_configFile = (Configuration)ser.Deserialize(reader);
                        reader.Close();

                        // set the ActualDataType property
                        for (int ii = 0; ii < m_configFile.Attributes.Length - 1; ii++)
                        {
                            NodeId nodeid = new NodeId(m_configFile.Attributes[ii].strDataTypeNodeId);
                            m_configFile.Attributes[ii].ActualDataType = DataTypes.GetSystemType(nodeid, EncodeableFactory.GlobalFactory);
                        }
                    }
                    else
                    {
                        InitConfigInfo(configFileName);
                    }

                    // Obtain the current server table, generate index mapping tables (client->server, server->client)
                    // and update the client side namespace table if necessary due to server changes
                    GenerateNamespaceIndexMappings(m_clsid);

                    // The client side namespace table may have been updated if the server namespace table
                    // has changed therefore save the updated client table.
                    SaveConfigInfo(configFileName);
                    
                    // fetch type tree.
                    m_session.FetchTypeTree(Opc.Ua.ObjectTypeIds.BaseEventType);
                    m_session.FetchTypeTree(Opc.Ua.ReferenceTypeIds.References);
                    
                    //Create UA Event Subscription if none configured in the registry
                    m_Subscription = new Opc.Ua.Client.Subscription(m_session.DefaultSubscription);
                    m_Subscription.PublishingEnabled = true;
                    m_Subscription.PublishingInterval = m_configFile.ProxySubscriptionSettings.PublishingInterval;
                    m_Subscription.KeepAliveCount = m_configFile.ProxySubscriptionSettings.KeepAliveCount;
                    m_Subscription.LifetimeCount = m_configFile.ProxySubscriptionSettings.LifetimeCount;
                    m_Subscription.Priority = m_configFile.ProxySubscriptionSettings.Priority;
                    m_Subscription.MaxNotificationsPerPublish = m_configFile.ProxySubscriptionSettings.MaxNotificationsPerPublish;

                    m_session.AddSubscription(m_Subscription);
                    m_Subscription.Create();
                    m_KeepAliveInterval = (int)(m_Subscription.CurrentPublishingInterval * m_Subscription.CurrentKeepAliveCount);

                    // Add Server object as the only monitored item to this subscription

                    NodeId nodeId_Server = new NodeId(Opc.Ua.Objects.Server);

                    MonitoredItem monitoredItem = CreateMonitoredItemForEvents(nodeId_Server);
                    m_Subscription.AddItem(monitoredItem);
                    m_Subscription.ApplyChanges();

                    AreaNode areaNode = new AreaNode();
                    areaNode.AreaName = "/";
                    ++areaNode.RefCount;
                    areaNode.MonitoredItem = monitoredItem;
                    m_notifiers.Add(monitoredItem.ClientHandle, areaNode);
                    m_AreaNodes.Add("/", areaNode);

                    m_Subscription.Session.Call(
                        Opc.Ua.ObjectTypes.ConditionType,
                        Methods.ConditionType_ConditionRefresh,
                        m_Subscription.Id);
                }
                catch (Exception e)
                {
                    Utils.Trace(e, "Initializing server after create.");
                    throw ComUtils.CreateComException(e);
                }
            }
        }