/// <summary>
 /// Initializes a new instance of the <see cref="MonitoredItemAttribute"/> class.
 /// </summary>
 /// <param name="nodeId">the NodeId to monitor.</param>
 /// <param name="attributeId">the attribute to monitor.</param>
 /// <param name="indexRange">the range of array indexes to monitor.</param>
 /// <param name="samplingInterval">the sampling interval.</param>
 /// <param name="queueSize">the length of the queue used by the server to buffer values.</param>
 /// <param name="discardOldest">a value indicating whether to discard the oldest entries in the queue when it is full.</param>
 /// <param name="dataChangeTrigger">the properties that trigger a data change.</param>
 /// <param name="deadbandType">the type of deadband calculation.</param>
 /// <param name="deadbandValue">the deadband value.</param>
 public MonitoredItemAttribute(string nodeId = null, uint attributeId = AttributeIds.Value, string indexRange = null, int samplingInterval = -1, uint queueSize = 0, bool discardOldest = true, DataChangeTrigger dataChangeTrigger = DataChangeTrigger.StatusValue, DeadbandType deadbandType = DeadbandType.None, double deadbandValue = 0.0)
 {
     this.NodeId = nodeId;
     this.AttributeId = attributeId;
     this.IndexRange = indexRange;
     this.SamplingInterval = samplingInterval;
     this.QueueSize = queueSize;
     this.DiscardOldest = discardOldest;
     this.DataChangeTrigger = dataChangeTrigger;
     this.DeadbandType = deadbandType;
     this.DeadbandValue = deadbandValue;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="MonitoredItemAttribute"/> class.
 /// </summary>
 /// <param name="nodeId">the NodeId to monitor.</param>
 /// <param name="attributeId">the attribute to monitor.</param>
 /// <param name="indexRange">the range of array indexes to monitor.</param>
 /// <param name="samplingInterval">the sampling interval.</param>
 /// <param name="queueSize">the length of the queue used by the server to buffer values.</param>
 /// <param name="discardOldest">a value indicating whether to discard the oldest entries in the queue when it is full.</param>
 /// <param name="dataChangeTrigger">the properties that trigger a data change.</param>
 /// <param name="deadbandType">the type of deadband calculation.</param>
 /// <param name="deadbandValue">the deadband value.</param>
 public MonitoredItemAttribute(string nodeId, uint attributeId = AttributeIds.Value, string?indexRange = null, int samplingInterval = -1, uint queueSize = 0, bool discardOldest = true, DataChangeTrigger dataChangeTrigger = DataChangeTrigger.StatusValue, DeadbandType deadbandType = DeadbandType.None, double deadbandValue = 0.0)
 {
     NodeId            = nodeId;
     AttributeId       = attributeId;
     IndexRange        = indexRange;
     SamplingInterval  = samplingInterval;
     QueueSize         = queueSize;
     DiscardOldest     = discardOldest;
     DataChangeTrigger = dataChangeTrigger;
     DeadbandType      = deadbandType;
     DeadbandValue     = deadbandValue;
 }
Example #3
0
 internal static DataMonitoredItem BuildMonitoredItem(this KSpiceVariableData info, DataChangeTrigger trigger, double samplingInterval)
 {
     return(new DataMonitoredItem(info.nodeId)
     {
         DataChangeTrigger = trigger,
         SamplingInterval = samplingInterval,
         UserData = info
     });
 }
        /// <summary>
        /// Prompts the user to edit the monitored item.
        /// </summary>
        public bool ShowDialog(Session session, MonitoredItem monitoredItem, bool isEvent)
        {
            if (!monitoredItem.Created)
            {
                NodeBTN.Session      = session;
                NodeBTN.SelectedNode = monitoredItem.StartNodeId;
            }

            // hide fields not used for events.
            NodeLB.Visible             = !monitoredItem.Created;
            NodeTB.Visible             = !monitoredItem.Created;
            NodeBTN.Visible            = !monitoredItem.Created;
            AttributeLB.Visible        = !isEvent && !monitoredItem.Created;
            AttributeCB.Visible        = !isEvent && !monitoredItem.Created;
            IndexRangeLB.Visible       = !isEvent && !monitoredItem.Created;
            IndexRangeTB.Visible       = !isEvent && !monitoredItem.Created;
            DataEncodingLB.Visible     = !isEvent && !monitoredItem.Created;
            DataEncodingCB.Visible     = !isEvent && !monitoredItem.Created;
            MonitoringModeLB.Visible   = !monitoredItem.Created;
            MonitoringModeCB.Visible   = !monitoredItem.Created;
            SamplingIntervalLB.Visible = true;
            SamplingIntervalUP.Visible = true;
            QueueSizeLB.Visible        = !isEvent;
            QueueSizeUP.Visible        = !isEvent;
            DiscardOldestLB.Visible    = true;
            DiscardOldestCK.Visible    = true;
            DeadbandTypeLB.Visible     = !isEvent;
            DeadbandTypeCB.Visible     = !isEvent;
            DeadbandValueLB.Visible    = !isEvent;
            DeadbandValueUP.Visible    = !isEvent;
            TriggerTypeLB.Visible      = !isEvent;
            TriggerTypeCB.Visible      = !isEvent;

            // fill in values.
            SamplingIntervalUP.Value = monitoredItem.SamplingInterval;
            DiscardOldestCK.Checked  = monitoredItem.DiscardOldest;

            if (!isEvent)
            {
                AttributeCB.SelectedIndex     = (int)(monitoredItem.AttributeId - 1);
                IndexRangeTB.Text             = monitoredItem.IndexRange;
                MonitoringModeCB.SelectedItem = monitoredItem.MonitoringMode;
                QueueSizeUP.Value             = monitoredItem.QueueSize;

                DataChangeFilter filter = monitoredItem.Filter as DataChangeFilter;

                if (filter != null)
                {
                    DeadbandTypeCB.SelectedItem = (DeadbandType)filter.DeadbandType;
                    DeadbandValueUP.Value       = (decimal)filter.DeadbandValue;
                    TriggerTypeCB.SelectedItem  = filter.Trigger;
                }

                if (!monitoredItem.Created)
                {
                    // fetch the available encodings for the first node in the list from the server.
                    IVariableBase variable = session.NodeCache.Find(monitoredItem.StartNodeId) as IVariableBase;

                    DataEncodingCB.Items.Add(new EncodingInfo());
                    DataEncodingCB.SelectedIndex = 0;

                    if (variable != null)
                    {
                        if (session.NodeCache.IsTypeOf(variable.DataType, Opc.Ua.DataTypeIds.Structure))
                        {
                            foreach (INode encoding in session.NodeCache.Find(variable.DataType, Opc.Ua.ReferenceTypeIds.HasEncoding, false, true))
                            {
                                DataEncodingCB.Items.Add(new EncodingInfo()
                                {
                                    EncodingName = encoding.BrowseName
                                });

                                if (monitoredItem.Encoding == encoding.BrowseName)
                                {
                                    DataEncodingCB.SelectedIndex = DataEncodingCB.Items.Count - 1;
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                AttributeCB.SelectedIndex = ((int)Attributes.EventNotifier - 1);
            }

            if (base.ShowDialog() != DialogResult.OK)
            {
                return(false);
            }

            // update monitored item.
            if (!monitoredItem.Created)
            {
                monitoredItem.StartNodeId    = NodeBTN.SelectedNode;
                monitoredItem.DisplayName    = session.NodeCache.GetDisplayText(monitoredItem.StartNodeId);
                monitoredItem.RelativePath   = null;
                monitoredItem.AttributeId    = (uint)(AttributeCB.SelectedIndex + 1);
                monitoredItem.MonitoringMode = (MonitoringMode)MonitoringModeCB.SelectedItem;
            }

            monitoredItem.SamplingInterval = (int)SamplingIntervalUP.Value;
            monitoredItem.DiscardOldest    = DiscardOldestCK.Checked;

            if (!isEvent)
            {
                if (!monitoredItem.Created)
                {
                    monitoredItem.IndexRange = IndexRangeTB.Text.Trim();
                    monitoredItem.Encoding   = ((EncodingInfo)DataEncodingCB.SelectedItem).EncodingName;
                }

                monitoredItem.QueueSize = (uint)QueueSizeUP.Value;

                DataChangeTrigger trigger      = (DataChangeTrigger)TriggerTypeCB.SelectedItem;
                DeadbandType      deadbandType = (DeadbandType)DeadbandTypeCB.SelectedItem;

                if (monitoredItem.Filter != null || deadbandType != DeadbandType.None || trigger != DataChangeTrigger.StatusValue)
                {
                    DataChangeFilter filter = new DataChangeFilter();
                    filter.DeadbandType  = (uint)deadbandType;
                    filter.DeadbandValue = (double)DeadbandValueUP.Value;
                    filter.Trigger       = trigger;
                    monitoredItem.Filter = filter;
                }
            }
            else
            {
                if (!monitoredItem.Created)
                {
                    monitoredItem.IndexRange = null;
                    monitoredItem.Encoding   = null;
                }

                monitoredItem.QueueSize = 0;
                monitoredItem.Filter    = new EventFilter();
            }

            return(true);
        }