/// <summary> /// Removes a previously created subscription. /// </summary> private void UndoCreate() { try { mServer_.CancelSubscription(mSubscription_); } catch (Exception e) { MessageBox.Show(e.Message); } finally { if (mSubscription_ != null) { mSubscription_.Dispose(); } mSubscription_ = null; } // move to edit subscription panel. backBtn_.Enabled = false; nextBtn_.Enabled = true; cancelBtn_.Visible = true; doneBtn_.Visible = false; optionsBtn_.Visible = false; subscriptionCtrl_.Visible = true; browseCtrl_.Visible = false; itemsCtrl_.Visible = true; resultsCtrl_.Visible = false; }
/// <summary> /// Edit the specified subscription. /// </summary> private void EditSubscription(TreeNode node, TsCDaSubscription subscription) { try { TsCDaSubscriptionState state = new SubscriptionListEditDlg().ShowDialog(subscription.Server, subscription.State); if (state == null) { return; } subscription.ModifyState((int)TsCDaStateMask.All, state); node.Text = subscription.Name; if (SubscriptionModified != null) { SubscriptionModified(subscription, !state.Active); } } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Prompts the use to select items for the write request. /// </summary> public TsCDaItemValueResult[] ShowDialog(TsCDaServer server) { if (server == null) { throw new ArgumentNullException("server"); } mServer_ = server; mSubscription_ = null; mSynchronous_ = true; backBtn_.Enabled = false; nextBtn_.Enabled = true; cancelBtn_.Visible = true; doneBtn_.Visible = false; browseCtrl_.Visible = true; subscriptionCtrl_.Visible = false; itemsCtrl_.Visible = true; resultsCtrl_.Visible = false; browseCtrl_.ShowSingleServer(mServer_, null); itemsCtrl_.Initialize(mServer_, null); ShowDialog(); // ensure server connection in the browse control are closed. browseCtrl_.Clear(); return(mValues_); }
/// <summary> /// Creates a subscription with the specified parameters. /// </summary> private void DoCreate() { try { // assign a globally unique handle to the subscription. TsCDaSubscriptionState state = (TsCDaSubscriptionState)subscriptionCtrl_.Get(); state.ClientHandle = Guid.NewGuid().ToString(); // create the subscription. mSubscription_ = (TsCDaSubscription)mServer_.CreateSubscription(state); // move to add items panel. backBtn_.Enabled = true; nextBtn_.Enabled = true; cancelBtn_.Visible = false; doneBtn_.Visible = true; optionsBtn_.Visible = true; subscriptionCtrl_.Visible = false; browseCtrl_.Visible = true; itemsCtrl_.Visible = true; resultsCtrl_.Visible = false; } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Lookups the error text for the specified error id. /// </summary> private string GetErrorText(object subscriptionHandle, OpcResult resultID) { if (ShowErrorTextMI.Checked) { // display nothing for ok results. if (resultID == OpcResult.S_OK) { return(""); } // fetch the error text from the server. string errorText = null; try { TsCDaSubscription subscription = (TsCDaSubscription)m_subscriptions[subscriptionHandle]; string locale = (subscription != null)?subscription.Locale:CultureInfo.CurrentCulture.Name; errorText = m_server.GetErrorText(locale, resultID); } catch { errorText = null; } // return the result; return((errorText != null)?errorText:""); } // return the result id as a string. return(resultID.ToString()); }
/// <summary> /// Stop this service. /// </summary> protected override void OnStop() { try { Console.WriteLine("Remove Groups ..."); if (group != null) { group.Dispose(); group = null; } Console.WriteLine("Disconnect from Server ..."); if (myDaServer != null) { myDaServer.Disconnect(); myDaServer = null; } Console.WriteLine("Done."); } catch (OpcResultException e) { Console.WriteLine(" " + e.Message); return; } catch (Exception e) { Console.WriteLine(" " + e.Message); return; } }
/// <summary> /// Prompts the use to select items for the read request. /// </summary> public TsCDaItemValueResult[] ShowDialog(TsCDaSubscription subscription, bool synchronous) { if (subscription == null) { throw new ArgumentNullException("subscription"); } m_server = subscription.Server; m_subscription = subscription; m_synchronous = synchronous; BackBTN.Enabled = false; NextBTN.Enabled = true; CancelBTN.Visible = true; DoneBTN.Visible = false; OptionsBTN.Visible = true; BrowseCTRL.Visible = false; SubscriptionCTRL.Visible = true; ItemsCTRL.Visible = true; ResultsCTRL.Visible = false; SubscriptionCTRL.Initialize(m_subscription); ItemsCTRL.Initialize(m_server, null, m_subscription.Items); ShowDialog(); return(m_values); }
/// <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> /// Prompts the use to select items for the read request. /// </summary> public TsCDaItemValueResult[] ShowDialog(TsCDaSubscription subscription, bool synchronous) { if (subscription == null) { throw new ArgumentNullException("subscription"); } mServer_ = subscription.Server; mSubscription_ = subscription; mSynchronous_ = synchronous; backBtn_.Enabled = false; nextBtn_.Enabled = true; cancelBtn_.Visible = true; doneBtn_.Visible = false; optionsBtn_.Visible = true; browseCtrl_.Visible = false; subscriptionCtrl_.Visible = true; itemsCtrl_.Visible = true; resultsCtrl_.Visible = false; subscriptionCtrl_.Initialize(mSubscription_); itemsCtrl_.Initialize(null, mSubscription_.Items); ShowDialog(); return(mValues_); }
/// <summary> /// Prompts a user to add items to a subscitpion with a modal dialog. /// </summary> public TsCDaItemResult[] ShowDialog(TsCDaSubscription subscription) { if (subscription == null) { throw new ArgumentNullException("subscription"); } mServer_ = subscription.Server; mSubscription_ = subscription; mItems_ = null; backBtn_.Enabled = false; nextBtn_.Enabled = true; cancelBtn_.Visible = true; doneBtn_.Visible = false; optionsBtn_.Visible = true; browseCtrl_.Visible = true; itemsCtrl_.Visible = true; resultsCtrl_.Visible = false; browseCtrl_.ShowSingleServer(mServer_, null); itemsCtrl_.Initialize(null); ShowDialog(); // ensure server connection in the browse control are closed. browseCtrl_.Clear(); return(mItems_); }
/// <summary> /// Prompts a user to create a new subscription with a modal dialog. /// </summary> public TsCDaSubscription ShowDialog(TsCDaServer server) { if (server == null) { throw new ArgumentNullException("server"); } m_server = server; m_subscription = null; m_items = null; BackBTN.Enabled = false; NextBTN.Enabled = true; CancelBTN.Visible = true; DoneBTN.Visible = false; OptionsBTN.Visible = false; SubscriptionCTRL.Visible = true; BrowseCTRL.Visible = false; ItemsCTRL.Visible = true; ResultsCTRL.Visible = false; SubscriptionCTRL.Server = m_server; SubscriptionCTRL.Set(null); BrowseCTRL.ShowSingleServer(m_server, null); ItemsCTRL.Initialize((TsCDaItem)null); ShowDialog(); // ensure server connection in the browse control are closed. BrowseCTRL.Clear(); return(m_subscription); }
/// <summary> /// Creates a subscription with the specified parameters. /// </summary> private void DoCreate() { try { // assign a globally unique handle to the subscription. TsCDaSubscriptionState state = (TsCDaSubscriptionState)SubscriptionCTRL.Get(); state.ClientHandle = Guid.NewGuid().ToString(); // create the subscription. m_subscription = (TsCDaSubscription)m_server.CreateSubscription(state); // move to add items panel. BackBTN.Enabled = true; NextBTN.Enabled = true; CancelBTN.Visible = false; DoneBTN.Visible = true; OptionsBTN.Visible = true; SubscriptionCTRL.Visible = false; BrowseCTRL.Visible = true; ItemsCTRL.Visible = true; ResultsCTRL.Visible = false; } 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; } }
/// <summary> /// Initializes the control with the specified server. /// </summary> public void Initialize(TsCDaSubscription subscription) { if (subscription == null) { throw new ArgumentNullException("subscription"); } AddSubscription(null, subscription); }
/// <summary> /// Called when a subscription is added or removed from the control. /// </summary> public void OnSubscriptionModified(TsCDaSubscription subscription, bool deleted) { if (subscription == null) { return; } if (!deleted) { // check if the subscription is already added to the control. if (m_items.Contains(subscription.ClientHandle)) { return; } // register for data updates. subscription.DataChangedEvent += new TsCDaDataChangedEventHandler(OnDataChangeEvent); // add to subscription list. m_subscriptions.Add(subscription.ClientHandle, subscription); m_items.Add(subscription.ClientHandle, new ArrayList()); } else { // check if the subscription is already removed from the control. if (!m_items.Contains(subscription.ClientHandle)) { return; } // unregister for data updates. subscription.DataChangedEvent -= new TsCDaDataChangedEventHandler(OnDataChangeEvent); // remove all items for the subscription. ArrayList existingItemList = (ArrayList)m_items[subscription.ClientHandle]; foreach (ListViewItem listItem in existingItemList) { EditComplexValueDlg dialog = (EditComplexValueDlg)m_viewers[listItem]; if (dialog != null) { dialog.Close(); m_viewers.Remove(listItem); } listItem.Remove(); } // remove from subscription list. m_subscriptions.Remove(subscription.ClientHandle); m_items.Remove(subscription.ClientHandle); } }
/// <summary> /// Refreshes the items of a subscription. /// </summary> private void Refresh(TsCDaSubscription subscription) { try { subscription.Refresh(); } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Toggles the enabled state of a subscription. /// </summary> private void SetEnabled(TsCDaSubscription subscription, bool enabled) { try { subscription.SetEnabled(enabled); } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Called when the close button is clicked. /// </summary> private void DoneBTN_Click(object sender, System.EventArgs e) { if (sender == cancelBtn_) { try { mServer_.CancelSubscription(mSubscription_); } catch {} mSubscription_ = null; } DialogResult = DialogResult.Cancel; Close(); }
/// <summary> /// Called when the close button is clicked. /// </summary> private void DoneBTN_Click(object sender, System.EventArgs e) { if (sender == CancelBTN) { try { m_server.CancelSubscription(m_subscription); } catch {} m_subscription = null; } DialogResult = DialogResult.Cancel; Close(); }
/// <summary> /// Remove an item in the specified subscription. /// </summary> private void RemoveItem(TreeNode node, TsCDaSubscription subscription, TsCDaItem item) { try { subscription.RemoveItems(new OpcItem[] { item }); node.Remove(); } catch (Exception e) { MessageBox.Show(e.Message); } }
//---------------------------------------------------------------------------------------------------------------------- // 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); } }
/// <summary> /// Adds items to the specified subscription. /// </summary> private void AddItems(TreeNode node, TsCDaSubscription subscription) { TsCDaItemResult[] items = new SubscriptionAddItemsDlg().ShowDialog(subscription); // update tree with new items. if (items != null) { foreach (TsCDaItemResult item in items) { if (item.Result.Succeeded()) { AddItem(node, item); } } node.Expand(); } }
/// <summary> /// Toggles the active state of a subscription. /// </summary> private void SetActive(TsCDaSubscription subscription, bool active) { try { TsCDaSubscriptionState state = new TsCDaSubscriptionState(); state.Active = active; subscription.ModifyState((int)TsCDaStateMask.Active, state); if (SubscriptionModified != null) { SubscriptionModified(subscription, !state.Active); } } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Toggles the active state of a subscription. /// </summary> private void SetActive(TreeNode node, TsCDaSubscription subscription, TsCDaItem item, bool active) { try { item.Active = active; item.ActiveSpecified = true; TsCDaItem[] items = subscription.ModifyItems((int)TsCDaStateMask.Active, new TsCDaItem[] { item }); if (items != null) { node.Tag = items[0]; } } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Deletes the specified subscription. /// </summary> private void DeleteSubscription(TreeNode node, TsCDaSubscription subscription) { if (SubscriptionModified != null) { SubscriptionModified(subscription, true); } try { TsCDaServer server = subscription.Server; server.CancelSubscription(subscription); subscription.Dispose(); } catch (Exception e) { MessageBox.Show(e.Message); } node.Remove(); }
//---------------------------------------------------------------------------------------------------------------------- // 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> /// Adds a subscription into the tree. /// </summary> private void AddSubscription(TreeNode parent, TsCDaSubscription subscription) { TreeNode child = new TreeNode(subscription.Name); child.ImageIndex = child.SelectedImageIndex = Resources.IMAGE_ENVELOPE; child.Tag = subscription; foreach (TsCDaItem item in subscription.Items) { AddItem(child, item); } if (parent != null) { parent.Nodes.Add(child); } else { subscriptionTv_.Nodes.Add(child); child.Expand(); } }
/// <summary> /// Executes an asynchronous read and displays the results. /// </summary> public TsCDaItemValueResult[] ShowDialog(TsCDaSubscription subscription, TsCDaItem[] items) { if (subscription == null) { throw new ArgumentNullException("subscription"); } m_subscription = subscription; m_items = items; m_values = null; m_results = null; BeginRequest(); // show dialog. if (ShowDialog() != DialogResult.OK) { return(null); } // return results. return((TsCDaItemValueResult[])m_results); }
/// <summary> /// Executes an asynchronous read and displays the results. /// </summary> public OpcItemResult[] ShowDialog(TsCDaSubscription subscription, TsCDaItemValue[] values) { if (subscription == null) { throw new ArgumentNullException("subscription"); } mSubscription_ = subscription; mItems_ = null; mValues_ = values; mResults_ = null; BeginRequest(); // show dialog. if (ShowDialog() != DialogResult.OK) { return(null); } // return results. return((OpcItemResult[])mResults_); }
/// <summary> /// Disconnects from the server and clears all objects. /// </summary> private void Disconnect(TreeNode node, TsCDaServer server) { // remove all subscriptions. foreach (TreeNode child in node.Nodes) { if (IsSubscriptionNode(child)) { if (SubscriptionModified != null) { SubscriptionModified((TsCDaSubscription)child.Tag, true); } TsCDaSubscription subscription = (TsCDaSubscription)child.Tag; server.CancelSubscription(subscription); subscription.Dispose(); } } // disconnect server. server.Disconnect(); // remove tree from view. node.Remove(); }
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; }
void OnCancelSubscription() { //_activeSubscription.Cancel() _activeOpcServer.CancelSubscription(_activeSubscription); _activeSubscription.DataChangedEvent -= _dataChangeEventHandler; _activeSubscription.Dispose(); _activeSubscription = null; }