Example #1
0
        /// <summary>
        /// Adds items to the subscription.
        /// </summary>
        public void AddItems(
            ItemList requestList,
            SubscribeItemValueResult[] replyList,
            bool returnValues,
            ItemResult[]               additemResults)
        {
            lock (this)
            {
                ArrayList indexes = new ArrayList();
                ArrayList items   = new ArrayList();

                for (int ii = 0; ii < requestList.Count; ii++)
                {
                    Item item = new Item(requestList[ii]);

                    // check item path.
                    if ((item.ItemPath != null && item.ItemPath != ItemPath) || (item.ItemPath == null && requestList.ItemPath != ItemPath))
                    {
                        continue;
                    }

                    // check sampling rate.
                    if ((item.SamplingRateSpecified && item.SamplingRate != UpdateRate) || (!item.SamplingRateSpecified && requestList.SamplingRate != UpdateRate))
                    {
                        continue;
                    }

                    // check deadband.
                    if ((item.DeadbandSpecified && item.Deadband != Deadband) || (!item.DeadbandSpecified && requestList.Deadband != Deadband))
                    {
                        continue;
                    }

                    // assign globally unique client handle.
                    item.ClientHandle = item.ItemName + Guid.NewGuid().ToString();

                    if (item.ReqType == null && requestList.ReqType != null)
                    {
                        item.ReqType = requestList.ReqType;
                    }

                    // item can be handled by this subscription.
                    indexes.Add(ii);

                    // copy the item and clear the item path.
                    Item copy = new Item(item);
                    copy.ItemPath = null;
                    items.Add(copy);
                }

                // check if no suitable items found.
                if (indexes.Count == 0)
                {
                    return;
                }

                // add items to subscription.
                ItemResult[] results = m_subscription.AddItems((Item[])items.ToArray(typeof(Item)));

                ItemValueResult[] values = null;

                if (returnValues)
                {
                    values = m_subscription.Read(results);
                }

                // fill-in result list.
                for (int ii = 0; ii < items.Count; ii++)
                {
                    int index = (int)indexes[ii];

                    // return the add item result.
                    additemResults[index] = results[ii];

                    Item item = (Item)items[ii];

                    SubscribeItemValueResult result = new SubscribeItemValueResult();

                    result.ItemName              = item.ItemName;
                    result.ItemPath              = ItemPath;
                    result.ClientHandle          = requestList[index].ClientHandle;
                    result.ServerHandle          = results[ii].ServerHandle;
                    result.SamplingRate          = 0;
                    result.SamplingRateSpecified = false;
                    result.Value              = null;
                    result.Quality            = Quality.Bad;
                    result.QualitySpecified   = false;
                    result.Timestamp          = DateTime.MinValue;
                    result.TimestampSpecified = false;
                    result.ResultID           = results[ii].ResultID;
                    result.DiagnosticInfo     = results[ii].DiagnosticInfo;

                    if (results[ii].SamplingRateSpecified && results[ii].SamplingRate != item.SamplingRate)
                    {
                        result.SamplingRate          = results[ii].SamplingRate;
                        result.SamplingRateSpecified = results[ii].SamplingRateSpecified;
                    }

                    if (values != null)
                    {
                        if (result.ResultID.Succeeded())
                        {
                            result.Value              = values[ii].Value;
                            result.Quality            = values[ii].Quality;
                            result.QualitySpecified   = values[ii].QualitySpecified;
                            result.Timestamp          = values[ii].Timestamp;
                            result.TimestampSpecified = values[ii].TimestampSpecified;
                            result.ResultID           = values[ii].ResultID;
                            result.DiagnosticInfo     = values[ii].DiagnosticInfo;
                        }
                    }

                    // return the value as part of the subscribe response.
                    replyList[index] = result;

                    // save server handle locally.
                    if (result.ResultID.Succeeded())
                    {
                        m_items[(string)item.ClientHandle] = new ItemIdentifier(results[ii]);
                    }
                }
            }
        }
Example #2
0
        /// <summary>
        /// Initializes the object by creating the remote subscription.
        /// </summary>
        public bool Initialize(
            string locale,
            Hashtable servers,
            ItemList requestList,
            SubscribeItemValueResult[] replyList,
            bool returnValues,
            ItemResult[]               results)
        {
            lock (this)
            {
                // find first item that has not been assigned to a subscription.
                Item item  = null;
                int  index = -1;

                for (int ii = 0; ii < requestList.Count; ii++)
                {
                    if (replyList[ii] == null)
                    {
                        item = (Item)requestList[ii];

                        m_itemPath   = (item.ItemPath != null)?item.ItemPath:requestList.ItemPath;
                        m_updateRate = (item.SamplingRateSpecified)?item.SamplingRate:requestList.SamplingRate;
                        m_deadband   = (item.DeadbandSpecified)?item.Deadband:requestList.Deadband;

                        index = ii;
                        break;
                    }
                }

                // no items found.
                if (item == null)
                {
                    return(false);
                }

                // look up the remote server.
                m_server = null;

                if (m_itemPath != null)
                {
                    m_server = (Opc.Da.IServer)servers[m_itemPath];
                }

                // check for invalid item path.
                if (m_server == null)
                {
                    // create error result.
                    results[index] = new ItemResult(item, ResultID.Da.E_UNKNOWN_ITEM_PATH);

                    // create subscribe response.
                    SubscribeItemValueResult result = new SubscribeItemValueResult(item);

                    result.ItemPath = m_itemPath;
                    result.ResultID = ResultID.Da.E_UNKNOWN_ITEM_PATH;

                    replyList[index] = result;
                    return(false);
                }

                // create the subscription.
                try
                {
                    SubscriptionState state = new SubscriptionState();

                    state.Name       = null;
                    state.Active     = true;
                    state.UpdateRate = m_updateRate;
                    state.Deadband   = m_deadband;
                    state.Locale     = locale;
                    state.KeepAlive  = 0;

                    m_subscription = (Opc.Da.ISubscription)m_server.CreateSubscription(state);
                }
                catch (Exception e)
                {
                    if (m_subscription != null)
                    {
                        m_subscription.Dispose();
                        m_subscription = null;
                    }

                    m_server = null;

                    throw e;
                }

                // add items.
                AddItems(requestList, replyList, returnValues, results);
                return(true);
            }
        }