/// <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]); } } } }
/// <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); } }