/// <summary> /// Adds a set of items to a subscription. /// </summary> private void DoAddItems() { try { // assign globally unique client handle. TsCDaItem[] items = ItemsCTRL.GetItems(); foreach (TsCDaItem item in items) { item.ClientHandle = Guid.NewGuid().ToString(); } // add items to subscription. m_items = m_subscription.AddItems(items); // move to add items panel. BackBTN.Enabled = true; NextBTN.Enabled = false; CancelBTN.Visible = false; DoneBTN.Visible = true; OptionsBTN.Visible = false; SubscriptionCTRL.Visible = true; BrowseCTRL.Visible = false; ItemsCTRL.Visible = false; ResultsCTRL.Visible = true; // update controls with actual values. SubscriptionCTRL.Set(m_subscription.State); ResultsCTRL.Initialize(m_server, null, m_items); } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Adds a set of items to a subscription. /// </summary> private void DoAddItems() { try { // assign globally unique client handle. TsCDaItem[] items = itemsCtrl_.GetItems(); foreach (TsCDaItem item in items) { item.ClientHandle = Guid.NewGuid().ToString(); } // add items to subscription. mItems_ = mSubscription_.AddItems(items); // move to add items panel. backBtn_.Enabled = true; nextBtn_.Enabled = false; cancelBtn_.Visible = false; doneBtn_.Visible = true; optionsBtn_.Visible = false; browseCtrl_.Visible = true; itemsCtrl_.Visible = false; resultsCtrl_.Visible = true; // update controls with actual values. resultsCtrl_.Initialize(mServer_, null, mItems_); } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Edits items in the specified subscription. /// </summary> private void EditItem(TreeNode node, TsCDaSubscription subscription, TsCDaItem item) { try { // save existing item id. OpcItem itemId = new OpcItem(item); TsCDaItem[] items = new ItemListEditDlg().ShowDialog(new TsCDaItem[] { item }, false, false); if (items == null) { return; } // modify an existing item. if (itemId.Key == items[0].Key) { subscription.ModifyItems((int)TsCDaStateMask.All, items); } // add/remove item because the item id changed. else { items = subscription.AddItems(items); subscription.RemoveItems(new OpcItem[] { itemId }); } node.Text = items[0].ItemName; node.Tag = items[0]; } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Set things in motion so your service can do its work. /// </summary> protected override void OnStart(string[] args) { const string serverName = "opcda://localhost/Technosoftware.DaSample"; try { myDaServer = new TsCDaServer(); myDaServer.Connect(serverName); OpcServerStatus status = myDaServer.GetServerStatus(); // Add a group with default values Active = true and UpdateRate = 500ms TsCDaSubscriptionState groupState = new TsCDaSubscriptionState(); groupState.Name = "MyGroup"; // Group Name group = (TsCDaSubscription)myDaServer.CreateSubscription(groupState); // Add Items TsCDaItem[] items = new TsCDaItem[3]; TsCDaItemResult[] itemResults; items[0] = new TsCDaItem(); items[0].ItemName = "SimulatedData.Ramp"; // Item Name items[0].ClientHandle = 100; // Client Handle items[0].MaxAgeSpecified = true; items[0].MaxAge = Int32.MaxValue; items[1] = new TsCDaItem(); items[1].ItemName = "SimulatedData.Random"; // Item Name items[1].ClientHandle = 150; // Client Handle items[2] = new TsCDaItem(); items[2].ItemName = "InOut_I4"; // Item Name items[2].ClientHandle = 200; // Client Handle TsCDaItem[] arAddedItems; itemResults = group.AddItems(items); for (int i = 0; i < itemResults.GetLength(0); i++) { if (itemResults[i].Result.IsError()) { Console.WriteLine(" Item " + itemResults[i].ItemName + "could not be added to the group"); } } arAddedItems = itemResults; group.DataChangedEvent += new TsCDaDataChangedEventHandler(DataChangeHandler); Console.WriteLine("Wait 5 seconds ..."); //System.Threading.Thread.Sleep(5000); } catch (OpcResultException e) { Console.WriteLine(" " + e.Message); return; } catch (Exception e) { Console.WriteLine(" " + e.Message); return; } }
//---------------------------------------------------------------------------------------------------------------------- // btnAddItem_Click //-------------------- // This method tries to add the specified item to the preceding added group object. //---------------------------------------------------------------------------------------------------------------------- private void btnAddItem_Click(object sender, System.EventArgs e) { try { TsCDaSubscriptionState groupState = new TsCDaSubscriptionState(); groupState.Name = "MyGroup"; // Group Name m_pOpcGroup = (TsCDaSubscription)m_OpcDaServer.CreateSubscription(groupState); TsCDaItemResult[] res; TsCDaItem[] items = new TsCDaItem[1]; items[0] = new TsCDaItem(); items[0].ItemName = txtboxOpcItem.Text; // Item Name items[0].ClientHandle = 100; // Client Handle res = m_pOpcGroup.AddItems(items); if (res[0].Result.IsSuccess()) { if (!(res[0].Result.IsOk())) // Note: Since this sample adds only one item it's required that AddItems() { return; // succeeds for all specified items (in this case only one). } else { m_arAddedItems = res; } } else { MessageBox.Show("AddItems() method failed: " + res[0].Result.Description(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } /// All succeeded, update buttons and text fields txtboxOpcItem.Enabled = false; btnAddItem.Enabled = false; btnRead.Enabled = true; btnWrite.Enabled = true; txtboxWrite.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
//---------------------------------------------------------------------------------------------------------------------- // btnAddItem_Click //-------------------- // This method tries to add the specified item to the preceding added group object. //---------------------------------------------------------------------------------------------------------------------- private void btnAddItem_Click(object sender, System.EventArgs e) { try { TsCDaSubscriptionState groupState = new TsCDaSubscriptionState(); groupState.Name = "MyGroup"; // Group Name groupState.ClientHandle = "test"; groupState.Deadband = 0; groupState.UpdateRate = 1000; groupState.KeepAlive = 10000; m_pOpcGroup = (TsCDaSubscription)m_OpcDaServer.CreateSubscription(groupState); TsCDaItemResult[] itemResults; TsCDaItem[] items = new TsCDaItem[1]; items[0] = new TsCDaItem(); items[0].ItemName = txtboxOpcItem.Text; // Item Name items[0].ClientHandle = 100; // Client Handle itemResults = m_pOpcGroup.AddItems(items); m_arAddedItems = itemResults; /// Activate data change subscription m_pOpcGroup.DataChangedEvent += new TsCDaDataChangedEventHandler(DataChangeHandler); /// All succeeded, update buttons and text fields txtboxOpcItem.Enabled = false; btnAddItem.Enabled = false; btnRead.Enabled = true; btnRefresh.Enabled = true; btnCancel.Enabled = true; btnWrite.Enabled = true; txtboxWrite.Enabled = true; chboxNotifications.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
/// <summary> /// Edits items in the specified subscription. /// </summary> private void EditItems(TreeNode node, TsCDaSubscription subscription) { try { // save item ids to detect item id changes. OpcItem[] itemIDs = new OpcItem[subscription.Items.Length]; for (int ii = 0; ii < itemIDs.Length; ii++) { itemIDs[ii] = new OpcItem(subscription.Items[ii]); } // edit the items. TsCDaItem[] items = new ItemListEditDlg().ShowDialog(subscription.Items, false, false); if (items == null) { return; } // separate the items in lists depending on whether item id changed. ArrayList insertItems = new ArrayList(); ArrayList updateItems = new ArrayList(); ArrayList deleteItems = new ArrayList(); for (int ii = 0; ii < itemIDs.Length; ii++) { if (items[ii].Key != itemIDs[ii].Key) { insertItems.Add(items[ii]); deleteItems.Add(itemIDs[ii]); } else { updateItems.Add(items[ii]); } } // update existing items. if (updateItems.Count > 0) { subscription.ModifyItems((int)TsCDaStateMask.All, (TsCDaItem[])updateItems.ToArray(typeof(TsCDaItem))); } // insert new items. if (insertItems.Count > 0) { subscription.AddItems((TsCDaItem[])insertItems.ToArray(typeof(TsCDaItem))); } // delete old items. if (deleteItems.Count > 0) { subscription.RemoveItems((OpcItem[])deleteItems.ToArray(typeof(OpcItem))); } // update tree. node.Nodes.Clear(); foreach (TsCDaItem item in subscription.Items) { AddItem(node, item); } node.Expand(); } catch (Exception e) { MessageBox.Show(e.Message); } }
void OnCreateSubscription() { // Создаём объект подписки var subscriptionState = new TsCDaSubscriptionState { Name = "MySubscription", ClientHandle = "MySubscriptionId", Deadband = 0, UpdateRate = 1000, KeepAlive = 10000 }; _activeSubscription = (TsCDaSubscription)_activeOpcServer.CreateSubscription(subscriptionState); // Добавляем в объект подписки выбранные теги var x = 0; List<TsCDaItem> list = new List<TsCDaItem>(); foreach (var item in CheckedTags) { var tag = new TsCDaItem { ItemName = item.Element.ItemName, ClientHandle = 100 + x // Уникальный Id определяемый пользователем }; list.Add(tag); ++x; } // Добавляем теги и проверяем результат данной операции var results = _activeSubscription.AddItems(list.ToArray()); var errors = results.Where(result => result.Result.IsError()); if (errors.Count() > 0) { StringBuilder msg = new StringBuilder(); msg.Append("Не удалось добавить теги для подписки. Возникли ошибки в тегах:"); foreach (var error in errors) { msg.Append(String.Format("ItemName={0} ClientHandle={1} Description={2}; ", error.ItemName, error.ClientHandle, error.Result.Description())); } throw new InvalidOperationException(msg.ToString()); } _activeSubscription.DataChangedEvent += _dataChangeEventHandler; }