Exemplo n.º 1
0
        public void CanGetId()
        {
            string id  = "_id_";
            var    sut = new SubscriptionTag(id, null);

            sut.Id.Should().BeEquivalentTo("_id_", because: "Id shoud be set by constructor.");
        }
Exemplo n.º 2
0
        public void CanDispose()
        {
            var disposable = A.Fake <IDisposable>();

            var sut = new SubscriptionTag("_id_", disposable);

            sut.Dispose();

            A.CallTo(() => disposable.Dispose()).MustHaveHappenedOnceExactly();
        }
Exemplo n.º 3
0
        /// <summary>
        /// Processes new data.
        /// </summary>
        private void ProcessDataChanges(SubscriptionTag subscriptionTag, NotificationMessage notificationMessage)
        {
            foreach (MonitoredItemNotification change in notificationMessage.GetDataChanges(false))
            {
                if (subscriptionTag.Subscription.FindItemByClientHandle(change.ClientHandle) is
                    MonitoredItem monitoredItem)
                {
                    if (subscriptionTag.ItemsByNodeID.TryGetValue(monitoredItem.StartNodeId.ToString(),
                                                                  out ItemTag itemTag))
                    {
                        Log.WriteLine("{0} {1} = {2} ({3})", CommPhrases.ReceiveNotation,
                                      monitoredItem.DisplayName, change.Value, change.Value.StatusCode);

                        int tagIndex  = itemTag.DeviceTag.Index;
                        int tagStatus = StatusCode.IsGood(change.Value.StatusCode) ?
                                        CnlStatusID.Defined : CnlStatusID.Undefined;

                        if (itemTag.ItemConfig.IsArray && change.Value.Value is Array arrVal)
                        {
                            int       arrLen    = Math.Min(itemTag.ItemConfig.DataLength, arrVal.Length);
                            double[]  arr       = new double[arrLen];
                            TagFormat tagFormat = TagFormat.FloatNumber;

                            for (int i = 0; i < arrLen; i++)
                            {
                                arr[i] = ConvertArrayElem(arrVal.GetValue(i), out TagFormat format);
                                if (i == 0)
                                {
                                    tagFormat = format;
                                }
                            }

                            DeviceData.SetDoubleArray(tagIndex, arr, tagStatus);
                            DeviceTags[tagIndex].Format = tagFormat;
                        }
                        else
                        {
                            SetTagData(tagIndex, change.Value.Value, tagStatus);
                        }
                    }
                    else
                    {
                        Log.WriteLine(Locale.IsRussian ?
                                      "Ошибка: тег \"{0}\" не найден" :
                                      "Error: tag \"{0}\" not found", monitoredItem.StartNodeId);
                    }
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Processes new data.
        /// </summary>
        private void ProcessDataChanges(SubscriptionTag subscriptionTag, NotificationMessage notificationMessage)
        {
            foreach (MonitoredItemNotification change in notificationMessage.GetDataChanges(false))
            {
                MonitoredItem monitoredItem = subscriptionTag.Subscription.FindItemByClientHandle(change.ClientHandle);

                if (monitoredItem != null)
                {
                    if (subscriptionTag.ItemsByNodeID.TryGetValue(monitoredItem.StartNodeId.ToString(),
                                                                  out ItemTag itemTag))
                    {
                        WriteToLog((Localization.UseRussian ? "Приём " : "Receive ") +
                                   monitoredItem.DisplayName + " = " + change.Value + " (" + change.Value.StatusCode + ")");

                        int tagIndex  = itemTag.KPTag.Index;
                        int tagStatus = StatusCode.IsGood(change.Value.StatusCode) ?
                                        BaseValues.CnlStatuses.Defined :
                                        BaseValues.CnlStatuses.Undefined;

                        if (itemTag.ItemConfig.IsArray)
                        {
                            int      arrayLen = itemTag.ItemConfig.ArrayLen;
                            double[] vals     = DecodeArray(change.Value.Value, arrayLen, out TagType tagType);

                            for (int i = 0; i < arrayLen; i++)
                            {
                                SetCurData(tagIndex, vals[i], tagStatus);
                                KPTags[tagIndex].Aux = tagType;
                                tagIndex++;
                            }
                        }
                        else
                        {
                            SetCurData(tagIndex, DecodeItemVal(change.Value.Value, out TagType tagType), tagStatus);
                            itemTag.KPTag.Aux = tagType;
                        }
                    }
                    else
                    {
                        WriteToLog(string.Format(Localization.UseRussian ?
                                                 "Ошибка: тег \"{0}\" не найден" :
                                                 "Error: tag \"{0}\" not found", monitoredItem.StartNodeId));
                    }
                }
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Creates subscriptions according to the configuration.
        /// </summary>
        private bool CreateSubscriptions()
        {
            try
            {
                if (opcSession == null)
                {
                    throw new InvalidOperationException("OPC session must not be null.");
                }

                subscrByID = new Dictionary <uint, SubscriptionTag>();

                foreach (SubscriptionConfig subscriptionConfig in deviceConfig.Subscriptions)
                {
                    if (!subscriptionConfig.Active)
                    {
                        continue;
                    }

                    Subscription subscription = new Subscription(opcSession.DefaultSubscription)
                    {
                        DisplayName        = subscriptionConfig.DisplayName,
                        PublishingInterval = subscriptionConfig.PublishingInterval
                    };

                    SubscriptionTag subscriptionTag = new SubscriptionTag(subscription);

                    foreach (ItemConfig itemConfig in subscriptionConfig.Items)
                    {
                        if (!itemConfig.Active)
                        {
                            continue;
                        }

                        subscription.AddItem(new MonitoredItem(subscription.DefaultItem)
                        {
                            StartNodeId = itemConfig.NodeID,
                            DisplayName = itemConfig.DisplayName
                        });

                        if (itemConfig.Tag is KPTag kpTag)
                        {
                            subscriptionTag.ItemsByNodeID[itemConfig.NodeID] = new ItemTag
                            {
                                ItemConfig = itemConfig,
                                KPTag      = kpTag
                            };
                        }
                    }

                    opcSession.AddSubscription(subscription);
                    subscription.Create();
                    subscrByID[subscription.Id] = subscriptionTag;
                }

                return(true);
            }
            catch (Exception ex)
            {
                WriteToLog((Localization.UseRussian ?
                            "Ошибка при создании подписок: " :
                            "Error creating subscriptions: ") + ex);
                return(false);
            }
        }