Exemplo n.º 1
0
		public override void Add(string itemName)
		{
			lock(_thisLock)
			{
				try
				{
					OpcAddress addr = Find(itemName);
					
					if (addr == null)
					{
						string[] itemIdSplited = itemName.Split(']');
						string[] addressSplited;
						string topic = "";
						
						//Encontra o nome do topico
						if (itemName.Contains(']')) {
							topic = itemName.Split(']')[0].Substring(1);
						}
						
						if (itemIdSplited.Length > 1)
						{
							addressSplited = itemIdSplited[1].Split(':');
						}
						else
						{
							itemIdSplited = itemName.Split('.');
							addressSplited = itemIdSplited[2].Split(':');
						}
						
						Opc.Da.Subscription opcDaGroup = null;
						foreach (Opc.Da.Subscription opcDaGrp in _opcDaServer.Subscriptions)
						{
							if (opcDaGrp.Name == topic + addressSplited[0])
							{
								opcDaGroup = opcDaGrp;
							}
						}

						if (opcDaGroup == null)
						{
							Opc.Da.SubscriptionState groupState = new Opc.Da.SubscriptionState();
							groupState.ClientHandle = Guid.NewGuid().ToString();
							groupState.Name = topic + addressSplited[0];
//							groupState.UpdateRate = 250;
							
							opcDaGroup = (Opc.Da.Subscription)_opcDaServer.CreateSubscription(groupState);
							//opcDaGroup.DataChanged += new Opc.Da.DataChangedEventHandler(OpcDataChanged);
							opcDaGroup.DataChanged += delegate(object subscriptionHandle, object requestHandle, ItemValueResult[] values)
							{
//								BackgroundWorker back = new BackgroundWorker();
//								back.DoWork += delegate(object sender, DoWorkEventArgs e)
//								{
//									foreach (Opc.Da.ItemValueResult ivr in values)
//									{
//										OpcAddress adr = Find(ivr.ItemName);
//										adr.SetValue(ivr.Value.ToString());
//										OnDataChanged(new DataChangedEventArgs(ivr.ItemName, ivr.Value));
//									}
//								};
//								back.RunWorkerAsync();
								foreach (Opc.Da.ItemValueResult ivr in values)
								{
									OpcAddress adr = Find(ivr.ItemName);
									adr.SetValue(ivr.Value.ToString());
									OnDataChanged(new DataChangedEventArgs(ivr.ItemName, ivr.Value));
								}
							};
						}

						Opc.Da.Item opcDaItem = new Opc.Da.Item();
						opcDaItem.ClientHandle = Guid.NewGuid().ToString();
						opcDaItem.ItemName = itemName;
						opcDaItem.MaxAgeSpecified = true;
						opcDaItem.MaxAge = 100;
						opcDaItem.SamplingRateSpecified = true;
						opcDaItem.SamplingRate = 10;
						
						opcDaGroup.AddItems(new Opc.Da.Item[] { opcDaItem });

						addr = new OpcAddress(opcDaItem, opcDaGroup);
						_addrList.Add(addr);
					}

					return;
				}
				catch (Exception ex)
				{
					MessageBox.Show(ex.Message);
					return;
				}
			}
		}