/// <summary> /// Adds an item to the list view. /// </summary> public void AddItem(TsCDaItem item) { // create list view item. ListViewItem listItem = new ListViewItem(item.ItemName, Resources.IMAGE_YELLOW_SCROLL); // add appropriate sub-items. listItem.SubItems.Add(OpcClientSdk.OpcConvert.ToString(GetFieldValue(item, ITEM_PATH))); listItem.SubItems.Add(OpcClientSdk.OpcConvert.ToString(GetFieldValue(item, REQUESTED_TYPE))); listItem.SubItems.Add(OpcClientSdk.OpcConvert.ToString(GetFieldValue(item, MAXIMUM_AGE))); listItem.SubItems.Add(OpcClientSdk.OpcConvert.ToString(GetFieldValue(item, ACTIVE))); listItem.SubItems.Add(OpcClientSdk.OpcConvert.ToString(GetFieldValue(item, DEADBAND))); listItem.SubItems.Add(OpcClientSdk.OpcConvert.ToString(GetFieldValue(item, SAMPLING_RATE))); listItem.SubItems.Add(OpcClientSdk.OpcConvert.ToString(GetFieldValue(item, ENABLE_BUFFERING))); // save item object as list view item tag. listItem.Tag = item; // insert/add item to list view. if (item == m_template) { ItemListLV.Items.Insert(0, listItem); } else { ItemListLV.Items.Add(listItem); } // adjust columns. AdjustColumns(); }
/// <summary> /// Edits the item template. /// </summary> private void EditTemplate(TsCDaItem template) { // prompt user to edit the template. TsCDaItem[] templates = new ItemListEditDlg().ShowDialog(new TsCDaItem[] { template }, IsReadItem, false); if (templates == null || templates.Length != 1) { return; } // get existing items without applying defaults. ArrayList items = new ArrayList(); foreach (ListViewItem item in ItemListLV.Items) { if (item.Tag != null && item.Tag.GetType() == typeof(TsCDaItem)) { if (item.Tag != m_template) { items.Add(item.Tag); } } } // re-initialize the list with the new template. Initialize(templates[0]); // add items back. foreach (TsCDaItem item in items) { AddItem(item); } }
/// <summary> /// Copy values from control into object - throw exceptions on error. /// </summary> public object Get() { TsCDaItem item = new TsCDaItem(m_identifier); item.ItemName = ItemNameTB.Text; item.ItemPath = ItemPathTB.Text; item.ReqType = (ReqTypeSpecifiedCB.Checked)?ReqTypeCTRL.SelectedType:null; item.MaxAge = (MaxAgeSpecifiedCB.Checked)?(int)MaxAgeCTRL.Value * 1000:0; item.MaxAgeSpecified = MaxAgeSpecifiedCB.Checked; item.Active = (ActiveSpecifiedCB.Checked)?ActiveCB.Checked:false; item.ActiveSpecified = ActiveSpecifiedCB.Checked; item.Deadband = (DeadbandSpecifiedCB.Checked)?(float)DeadbandCTRL.Value:0; item.DeadbandSpecified = DeadbandSpecifiedCB.Checked; item.SamplingRate = (SamplingRateSpecifiedCB.Checked)?(int)SamplingRateCTRL.Value:0; item.SamplingRateSpecified = SamplingRateSpecifiedCB.Checked; item.EnableBuffering = (EnableBufferSpecifiedCB.Checked)?EnableBufferingCB.Checked:false; item.EnableBufferingSpecified = EnableBufferSpecifiedCB.Checked; // update the item id to reflect selections for complex data. try { GetComplexItem(item); } catch (Exception e) { MessageBox.Show(e.Message); item.ItemName = ItemNameTB.Text; item.ItemPath = ItemPathTB.Text; } return(item); }
/// <summary> /// Adds an item to the list view. /// </summary> public void AddItem(TsCDaItem item) { // create list view item. ListViewItem listItem = new ListViewItem(item.ItemName, Resources.IMAGE_YELLOW_SCROLL); // add appropriate sub-items. listItem.SubItems.Add(Technosoftware.DaAeHdaClient.OpcConvert.ToString(GetFieldValue(item, ItemPath))); listItem.SubItems.Add(Technosoftware.DaAeHdaClient.OpcConvert.ToString(GetFieldValue(item, RequestedType))); listItem.SubItems.Add(Technosoftware.DaAeHdaClient.OpcConvert.ToString(GetFieldValue(item, MaximumAge))); listItem.SubItems.Add(Technosoftware.DaAeHdaClient.OpcConvert.ToString(GetFieldValue(item, Active))); listItem.SubItems.Add(Technosoftware.DaAeHdaClient.OpcConvert.ToString(GetFieldValue(item, Deadband))); listItem.SubItems.Add(Technosoftware.DaAeHdaClient.OpcConvert.ToString(GetFieldValue(item, SamplingRate))); listItem.SubItems.Add(Technosoftware.DaAeHdaClient.OpcConvert.ToString(GetFieldValue(item, EnableBuffering))); // save item object as list view item tag. listItem.Tag = item; // insert/add item to list view. if (item == mTemplate_) { itemListLv_.Items.Insert(0, listItem); } else { itemListLv_.Items.Add(listItem); } // adjust columns. AdjustColumns(); }
/// <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> /// Copy values from control into object - throw exceptions on error. /// </summary> public object Get() { TsCDaItem item = new TsCDaItem(mIdentifier_); item.ItemName = itemNameTb_.Text; item.ItemPath = itemPathTb_.Text; item.ReqType = (reqTypeSpecifiedCb_.Checked)?reqTypeCtrl_.SelectedType:null; item.MaxAge = (maxAgeSpecifiedCb_.Checked)?(int)maxAgeCtrl_.Value * 1000:0; item.MaxAgeSpecified = maxAgeSpecifiedCb_.Checked; item.Active = (activeSpecifiedCb_.Checked)?activeCb_.Checked:false; item.ActiveSpecified = activeSpecifiedCb_.Checked; item.Deadband = (deadbandSpecifiedCb_.Checked)?(float)deadbandCtrl_.Value:0; item.DeadbandSpecified = deadbandSpecifiedCb_.Checked; item.SamplingRate = (samplingRateSpecifiedCb_.Checked)?(int)samplingRateCtrl_.Value:0; item.SamplingRateSpecified = samplingRateSpecifiedCb_.Checked; item.EnableBuffering = (enableBufferSpecifiedCb_.Checked)?enableBufferingCb_.Checked:false; item.EnableBufferingSpecified = enableBufferSpecifiedCb_.Checked; // update the item id to reflect selections for complex data. try { GetComplexItem(item); } catch (Exception e) { MessageBox.Show(e.Message); item.ItemName = itemNameTb_.Text; item.ItemPath = itemPathTb_.Text; } return(item); }
/// <summary> /// Initializes the control with the specified set of items. /// </summary> public void Initialize(TsCDaItem template, TsCDaItem[] items) { Initialize(template); // add items. if (items != null) { foreach (TsCDaItem item in items) { // clear subscription related fields. if (IsReadItem) { item.ActiveSpecified = false; item.DeadbandSpecified = false; item.SamplingRateSpecified = false; item.EnableBufferingSpecified = false; } AddItem(item); } } // adjust columns. AdjustColumns(); }
/// <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> /// Adds an item into the tree. /// </summary> private void AddItem(TreeNode parent, TsCDaItem item) { TreeNode child = new TreeNode(item.ItemName); child.ImageIndex = child.SelectedImageIndex = Resources.IMAGE_YELLOW_SCROLL; child.Tag = item; parent.Nodes.Add(child); }
/// <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); } }
/// <summary> /// Returns the set of items in the control. /// </summary> public TsCDaItem[] GetItems() { ArrayList items = new ArrayList(); foreach (ListViewItem listItem in ItemListLV.Items) { // skip template. if (listItem.Tag == m_template) { continue; } object field = null; // create copy of item. TsCDaItem item = (TsCDaItem)((TsCDaItem)listItem.Tag).Clone(); // Req Type field = GetFieldValue(item, REQUESTED_TYPE); item.ReqType = (System.Type)field; // Max Age field = GetFieldValue(item, MAXIMUM_AGE); item.MaxAge = (field != null)?(int)field:0; item.MaxAgeSpecified = field != null; // Active field = GetFieldValue(item, ACTIVE); item.Active = (field != null)?(bool)field:false; item.ActiveSpecified = field != null; // Deadband field = GetFieldValue(item, DEADBAND); item.Deadband = (field != null)?(float)field:0; item.DeadbandSpecified = field != null; // Sampling Rate field = GetFieldValue(item, SAMPLING_RATE); item.SamplingRate = (field != null)?(int)field:0; item.SamplingRateSpecified = field != null; // Enable Buffering field = GetFieldValue(item, ENABLE_BUFFERING); item.EnableBuffering = (field != null)?(bool)field:false; item.EnableBufferingSpecified = field != null; // add item to list. items.Add(item); } // convert to array of item objects. return((TsCDaItem[])items.ToArray(typeof(TsCDaItem))); }
/// <summary> /// Returns the set of items in the control. /// </summary> public TsCDaItem[] GetItems() { ArrayList items = new ArrayList(); foreach (ListViewItem listItem in itemListLv_.Items) { // skip template. if (listItem.Tag == mTemplate_) { continue; } object field = null; // create copy of item. TsCDaItem item = (TsCDaItem)((TsCDaItem)listItem.Tag).Clone(); // Req Type field = GetFieldValue(item, RequestedType); item.ReqType = (System.Type)field; // Max Age field = GetFieldValue(item, MaximumAge); item.MaxAge = (field != null)?(int)field:0; item.MaxAgeSpecified = field != null; // Active field = GetFieldValue(item, Active); item.Active = (field != null)?(bool)field:false; item.ActiveSpecified = field != null; // Deadband field = GetFieldValue(item, Deadband); item.Deadband = (field != null)?(float)field:0; item.DeadbandSpecified = field != null; // Sampling Rate field = GetFieldValue(item, SamplingRate); item.SamplingRate = (field != null)?(int)field:0; item.SamplingRateSpecified = field != null; // Enable Buffering field = GetFieldValue(item, EnableBuffering); item.EnableBuffering = (field != null)?(bool)field:false; item.EnableBufferingSpecified = field != null; // add item to list. items.Add(item); } // convert to array of item objects. return((TsCDaItem[])items.ToArray(typeof(TsCDaItem))); }
/// <summary> /// Initializes the control with the specified template item. /// </summary> public void Initialize(TsCDaItem template) { // clear existing items. ItemListLV.Items.Clear(); // create template item. m_template = (template != null)?(TsCDaItem)template.Clone():new TsCDaItem(); m_template.ItemName = "<default>"; // add template to list. AddItem(m_template); // adjust columns. AdjustColumns(); }
/// <summary> /// Copy object values into controls. /// </summary> public void Set(object value) { // check for null value. if (value == null) { SetDefaults(); return; } // cast value to item object. TsCDaItem item = (TsCDaItem)value; // save item identifier (including client and server handles). mIdentifier_ = new OpcItem(item); // update controls. itemNameTb_.Text = item.ItemName; itemPathTb_.Text = item.ItemPath; reqTypeCtrl_.SelectedType = item.ReqType; reqTypeSpecifiedCb_.Checked = item.ReqType != null; maxAgeCtrl_.Value = (item.MaxAgeSpecified)?((decimal)item.MaxAge) / 1000:0; maxAgeSpecifiedCb_.Checked = item.MaxAgeSpecified; activeCb_.Checked = (item.ActiveSpecified)?item.Active:false; activeSpecifiedCb_.Checked = item.ActiveSpecified; deadbandCtrl_.Value = (item.DeadbandSpecified)?(decimal)item.Deadband:0; deadbandSpecifiedCb_.Checked = item.DeadbandSpecified; samplingRateCtrl_.Value = (item.SamplingRateSpecified)?(decimal)item.SamplingRate:0; samplingRateSpecifiedCb_.Checked = item.SamplingRateSpecified; enableBufferingCb_.Checked = (item.EnableBufferingSpecified)?item.EnableBuffering:false; enableBufferSpecifiedCb_.Checked = item.EnableBufferingSpecified; reqTypePn_.Visible = true; complexItemPn_.Visible = false; // initialize complex data controls. try { SetComplexItem(mIdentifier_); } catch (Exception e) { MessageBox.Show(e.Message); reqTypePn_.Visible = true; complexItemPn_.Visible = false; } }
/// <summary> /// Copy object values into controls. /// </summary> public void Set(object value) { // check for null value. if (value == null) { SetDefaults(); return; } // cast value to item object. TsCDaItem item = (TsCDaItem)value; // save item identifier (including client and server handles). m_identifier = new OpcItem(item); // update controls. ItemNameTB.Text = item.ItemName; ItemPathTB.Text = item.ItemPath; ReqTypeCTRL.SelectedType = item.ReqType; ReqTypeSpecifiedCB.Checked = item.ReqType != null; MaxAgeCTRL.Value = (item.MaxAgeSpecified)?((decimal)item.MaxAge) / 1000:0; MaxAgeSpecifiedCB.Checked = item.MaxAgeSpecified; ActiveCB.Checked = (item.ActiveSpecified)?item.Active:false; ActiveSpecifiedCB.Checked = item.ActiveSpecified; DeadbandCTRL.Value = (item.DeadbandSpecified)?(decimal)item.Deadband:0; DeadbandSpecifiedCB.Checked = item.DeadbandSpecified; SamplingRateCTRL.Value = (item.SamplingRateSpecified)?(decimal)item.SamplingRate:0; SamplingRateSpecifiedCB.Checked = item.SamplingRateSpecified; EnableBufferingCB.Checked = (item.EnableBufferingSpecified)?item.EnableBuffering:false; EnableBufferSpecifiedCB.Checked = item.EnableBufferingSpecified; ReqTypePN.Visible = true; ComplexItemPN.Visible = false; // initialize complex data controls. try { SetComplexItem(m_identifier); } catch (Exception e) { MessageBox.Show(e.Message); ReqTypePN.Visible = true; ComplexItemPN.Visible = false; } }
//---------------------------------------------------------------------------------------------------------------------- // 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> /// 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> /// Prompts the user to edit the item list parameters. /// </summary> public TsCDaItem[] ShowDialog(TsCDaItem[] items, bool isReadItems, bool allowEditItemId) { objectCtrl_.IsReadItem = isReadItems; objectCtrl_.AllowEditItemId = allowEditItemId; if (items == null) { items = new TsCDaItem[] { (TsCDaItem)objectCtrl_.Create() } } ; ArrayList results = base.ShowDialog((object[])items, !allowEditItemId); if (results != null && results.Count > 0) { return((TsCDaItem[])results.ToArray(typeof(TsCDaItem))); } return(null); } }
//---------------------------------------------------------------------------------------------------------------------- // 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); } }
private void TestMI_Click(object sender, System.EventArgs e) { try { TsCDaServer server = (TsCDaServer)m_server; TsCDaItem[] items = new TsCDaItem[100]; for (int ii = 0; ii < items.Length; ii++) { items[ii] = new TsCDaItem(); items[ii].ItemName = "Static/ArrayTypes/Object[]"; items[ii].ItemPath = "DA30"; items[ii].ClientHandle = ii; } TsCDaSubscriptionState state = new TsCDaSubscriptionState(); state.Active = true; state.UpdateRate = 1000; ITsCDaSubscription subscription = server.CreateSubscription(state); Thread.Sleep(100); TsCDaItemResult[] results = subscription.AddItems(items); Thread.Sleep(100); subscription.RemoveItems(results); Thread.Sleep(100); server.CancelSubscription(subscription); Thread.Sleep(100); } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Creates a new item. /// </summary> private void NewMI_Click(object sender, System.EventArgs e) { TsCDaItem template = null; // copy the current selection. if (ItemListLV.SelectedItems.Count > 0) { template = (TsCDaItem)((TsCDaItem)ItemListLV.SelectedItems[0].Tag).Clone(); } // prompt user to edit new item. TsCDaItem[] items = new ItemListEditDlg().ShowDialog(new TsCDaItem[] { template }, IsReadItem, true); if (items == null) { return; } // add new items. foreach (TsCDaItem item in items) { AddItem(item); } }
/// <summary> /// Returns the value of the specified field. /// </summary> private object GetFieldValue(TsCDaItem item, int fieldID) { object fieldValue = null; switch (fieldID) { // Item Path case ITEM_PATH: { fieldValue = item.ItemPath; break; } // Req Type case REQUESTED_TYPE: { fieldValue = item.ReqType; if (fieldValue == null) { fieldValue = m_template.ReqType; } break; } // Max Age case MAXIMUM_AGE: { fieldValue = (item.MaxAgeSpecified)?item.MaxAge:fieldValue; if (fieldValue == null) { fieldValue = (m_template.MaxAgeSpecified)?m_template.MaxAge:fieldValue; } break; } // Active case ACTIVE: { fieldValue = (item.ActiveSpecified)?item.Active:fieldValue; if (fieldValue == null) { fieldValue = (m_template.ActiveSpecified)?m_template.Active:fieldValue; } break; } // Deadband case DEADBAND: { fieldValue = (item.DeadbandSpecified)?item.Deadband:fieldValue; if (fieldValue == null) { fieldValue = (m_template.DeadbandSpecified)?m_template.Deadband:fieldValue; } break; } // Sampling Rate case SAMPLING_RATE: { fieldValue = (item.SamplingRateSpecified)?item.SamplingRate:fieldValue; if (fieldValue == null) { fieldValue = (m_template.SamplingRateSpecified)?m_template.SamplingRate:fieldValue; } break; } // Enable Buffering case ENABLE_BUFFERING: { fieldValue = (item.EnableBufferingSpecified)?item.EnableBuffering:fieldValue; if (fieldValue == null) { fieldValue = (m_template.EnableBufferingSpecified)?m_template.EnableBuffering:fieldValue; } break; } } return(fieldValue); }
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; }
/// <summary> /// Updates the state of context menu. /// </summary> private void SubscriptionTV_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { // ignore left button actions. if (e.Button != MouseButtons.Right) { return; } // selects the item that was right clicked on. TreeNode clickedNode = subscriptionTv_.GetNodeAt(e.X, e.Y); // no item clicked on - do nothing. if (clickedNode == null) { return; } // force selection to clicked node. subscriptionTv_.SelectedNode = clickedNode; // disable everything. serverViewStatusMi_.Enabled = false; serverBrowseItemsMi_.Enabled = false; serverReadItemsMi_.Enabled = false; serverWriteItemsMi_.Enabled = false; serverDisconnectMi_.Enabled = false; subscriptionCreateMi_.Enabled = false; subscriptionDeleteMi_.Enabled = false; subscriptionAddItemsMi_.Enabled = false; subscriptionEditItemsMi_.Enabled = false; subscriptionEditMi_.Enabled = false; subscriptionReadMi_.Enabled = false; subscriptionWriteMi_.Enabled = false; subscriptionRefreshMi_.Enabled = false; subscriptionActiveMi_.Enabled = false; subscriptionEnabledMi_.Enabled = false; itemEditMi_.Enabled = false; itemRemoveMi_.Enabled = false; if (IsServerNode(clickedNode)) { subscriptionTv_.ContextMenuStrip = serverPopupMenu_; serverViewStatusMi_.Enabled = true; serverBrowseItemsMi_.Enabled = true; serverReadItemsMi_.Enabled = true; serverWriteItemsMi_.Enabled = true; serverDisconnectMi_.Enabled = true; subscriptionCreateMi_.Enabled = true; return; } if (IsSubscriptionNode(clickedNode)) { subscriptionTv_.ContextMenuStrip = subscriptionPopupMenu_; subscriptionEditMi_.Enabled = true; subscriptionDeleteMi_.Enabled = clickedNode.Parent != null; subscriptionAddItemsMi_.Enabled = true; subscriptionEditItemsMi_.Enabled = clickedNode.Parent != null; subscriptionReadMi_.Enabled = clickedNode.Parent != null; subscriptionWriteMi_.Enabled = clickedNode.Parent != null; subscriptionRefreshMi_.Enabled = clickedNode.Parent != null; subscriptionActiveMi_.Enabled = clickedNode.Parent != null; subscriptionEnabledMi_.Enabled = clickedNode.Parent != null; subscriptionActiveMi_.Checked = ((TsCDaSubscription)clickedNode.Tag).Active; subscriptionEnabledMi_.Checked = ((TsCDaSubscription)clickedNode.Tag).Enabled; return; } if (IsItemNode(clickedNode)) { subscriptionTv_.ContextMenuStrip = itemPopupMenu_; TsCDaItem item = (TsCDaItem)clickedNode.Tag; itemEditMi_.Enabled = true; itemRemoveMi_.Enabled = true; itemActiveMi_.Checked = item.Active; return; } }
/////////////////////////////////////////////////////////////////////// #region OPC Sample Functionality void DoOPCCalls() { try { const string serverUrl = "opcda://localhost/Technosoftware.DaSample"; Console.WriteLine(); Console.WriteLine("Simple OPC DA Client based on the OPC DA/AE/HDA Client SDK .NET"); Console.WriteLine("--------------------------------------------------------------"); Console.Write(" Press <Enter> to connect to "); Console.WriteLine(serverUrl); Console.ReadLine(); Console.WriteLine(" Please wait..."); //OpcBase.ValidateLicense("License Key"); TsCDaServer myDaServer = new TsCDaServer(); // Connect to the server myDaServer.Connect(serverUrl); OpcServerStatus status = myDaServer.GetServerStatus(); Console.WriteLine(" Connected, press <Enter> to create an active group object and add several items."); Console.ReadLine(); // Add a group with default values Active = true and UpdateRate = 500ms TsCDaSubscription group; TsCDaSubscriptionState groupState = new TsCDaSubscriptionState { Name = "MyGroup" /* Group Name*/ }; group = (TsCDaSubscription)myDaServer.CreateSubscription(groupState); // Add Items TsCDaItem[] items = new TsCDaItem[2]; TsCDaItemResult[] itemResults; items[0] = new TsCDaItem(); items[0].ItemName = "SimpleTypes.InOut.Integer"; // Item Name items[0].ClientHandle = 100; // Client Handle items[0].Active = true; items[0].ActiveSpecified = true; items[1] = new TsCDaItem(); items[1].ItemName = "SimpleTypes.InOut.Short"; // Item Name items[1].ClientHandle = 200; // Client Handle items[1].Active = false; items[1].ActiveSpecified = true; TsCDaItem[] arAddedItems; itemResults = group.AddItems(items); for (int i = 0; i < itemResults.GetLength(0); i++) { if (itemResults[i].Result.IsError()) { Console.WriteLine(String.Format(" Item {0} could not be added to the group", itemResults[i].ItemName)); } } arAddedItems = itemResults; OpcItemResult[] res; IOpcRequest m_ITRequest; TsCDaItemValue[] arItemValues = new TsCDaItemValue[1]; arItemValues[0] = new TsCDaItemValue(); arItemValues[0].ClientHandle = 100; arItemValues[0].ItemName = "SimpleTypes.InOut.Short"; int val = 0; do { arItemValues[0].Value = val; res = group.Write(arItemValues, 321, new TsCDaWriteCompleteEventHandler(OnWriteCompleteEvent), out m_ITRequest); val++; } while (val < 1000); Console.ReadLine(); group.Dispose(); // optionally, it's not required myDaServer.Disconnect(); // optionally, it's not required Console.ReadLine(); Console.WriteLine(" Disconnected from the server."); Console.WriteLine(); } catch (OpcResultException e) { Console.WriteLine(" " + e.Message); Console.ReadLine(); return; } catch (Exception e) { Console.WriteLine(" " + e.Message); Console.ReadLine(); return; } }
public void Run() { try { const string serverUrl = "opcda://localhost/Technosoftware.DaSample"; Console.WriteLine(); Console.WriteLine("Simple OPC DA Client based on the OPC DA/AE/HDA Client SDK .NET Standard"); Console.WriteLine("------------------------------------------------------------------------"); Console.Write(" Press <Enter> to connect to "); Console.WriteLine(serverUrl); Console.ReadLine(); Console.WriteLine(" Please wait..."); TsCDaServer myDaServer = new TsCDaServer(); // Connect to the server myDaServer.Connect(serverUrl); // Get the status from the server OpcServerStatus status = myDaServer.GetServerStatus(); Console.WriteLine($" Status of Server is {status.ServerState}"); Console.WriteLine(" Connected, press <Enter> to create an active group object and add several items."); Console.ReadLine(); // Add a group with default values Active = true and UpdateRate = 500ms TsCDaSubscriptionState groupState = new TsCDaSubscriptionState { Name = "MyGroup" /* Group Name*/ }; var group = (TsCDaSubscription)myDaServer.CreateSubscription(groupState); // Add Items TsCDaItem[] items = new TsCDaItem[4]; items[0] = new TsCDaItem { ItemName = "SimulatedData.Ramp", ClientHandle = 100, MaxAgeSpecified = true, MaxAge = 0, Active = true, ActiveSpecified = true }; // Item Name // Client Handle // Read from Cache items[1] = new TsCDaItem { ItemName = "CTT.SimpleTypes.InOut.Integer", ClientHandle = 150, Active = true, ActiveSpecified = true }; // Item Name // Client Handle items[2] = new TsCDaItem { ItemName = "CTT.SimpleTypes.InOut.Short", ClientHandle = 200, Active = false, ActiveSpecified = true }; // Item Name // Client Handle items[3] = new TsCDaItem { ItemName = "CTT.Arrays.InOut.Word[]", ClientHandle = 250, Active = false, ActiveSpecified = true }; // Item Name // Client Handle // Synchronous Read with server read function (DA 3.0) without a group TsCDaItemValueResult[] itemValues = myDaServer.Read(items); for (int i = 0; i < itemValues.GetLength(0); i++) { if (itemValues[i].Result.IsError()) { Console.WriteLine($" Item {itemValues[i].ItemName} could not be read"); } } var 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"); } } Console.WriteLine(""); Console.WriteLine(" Group and items added, press <Enter> to create a data change subscription"); Console.WriteLine(" and press <Enter> again to deactivate the data change subscription."); Console.WriteLine(" This stops the reception of data change notifications."); Console.ReadLine(); group.DataChangedEvent += OnDataChangeEvent; Console.ReadLine(); // Set group inactive groupState.Active = false; group.ModifyState((int)TsCDaStateMask.Active, groupState); Console.WriteLine(" Data change subscription deactivated, press <Enter> to remove all"); Console.WriteLine(" and disconnect from the server."); group.Dispose(); myDaServer.Disconnect(); myDaServer.Dispose(); Console.ReadLine(); Console.WriteLine(" Disconnected from the server."); Console.WriteLine(); } catch (OpcResultException e) { Console.WriteLine(" " + e.Message); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(" " + e.Message); Console.ReadLine(); } }
/// <summary> /// Returns the value of the specified field. /// </summary> private object GetFieldValue(TsCDaItem item, int fieldId) { object fieldValue = null; switch (fieldId) { // Item Path case ItemPath: { fieldValue = item.ItemPath; break; } // Req Type case RequestedType: { fieldValue = item.ReqType; if (fieldValue == null) { fieldValue = mTemplate_.ReqType; } break; } // Max Age case MaximumAge: { fieldValue = (item.MaxAgeSpecified)?item.MaxAge:fieldValue; if (fieldValue == null) { fieldValue = (mTemplate_.MaxAgeSpecified)?mTemplate_.MaxAge:fieldValue; } break; } // Active case Active: { fieldValue = (item.ActiveSpecified)?item.Active:fieldValue; if (fieldValue == null) { fieldValue = (mTemplate_.ActiveSpecified)?mTemplate_.Active:fieldValue; } break; } // Deadband case Deadband: { fieldValue = (item.DeadbandSpecified)?item.Deadband:fieldValue; if (fieldValue == null) { fieldValue = (mTemplate_.DeadbandSpecified)?mTemplate_.Deadband:fieldValue; } break; } // Sampling Rate case SamplingRate: { fieldValue = (item.SamplingRateSpecified)?item.SamplingRate:fieldValue; if (fieldValue == null) { fieldValue = (mTemplate_.SamplingRateSpecified)?mTemplate_.SamplingRate:fieldValue; } break; } // Enable Buffering case EnableBuffering: { fieldValue = (item.EnableBufferingSpecified)?item.EnableBuffering:fieldValue; if (fieldValue == null) { fieldValue = (mTemplate_.EnableBufferingSpecified)?mTemplate_.EnableBuffering:fieldValue; } break; } } return(fieldValue); }