Пример #1
0
		public OpcDaTag(string tagId, string tagName, OpcDaDirectory directory)
		{
			if (tagId == null)
			{
				throw new ArgumentNullException("tagId");
			}
			if (directory == null)
			{
				throw new ArgumentNullException("directory");
			}
			TagId = tagId;
			Name = tagName == null ? String.Empty : tagName;
			_directory = directory;
		}
Пример #2
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="directoryName">null - корневая директория</param>
		/// <param name="parent">директория, в которую будет вложена данная директория.
		/// Для корневой директории всегда равна null</param>
		public OpcDaDirectory(string directoryName = null, OpcDaDirectory parent = null)
		{
			_directory = parent;
			
			if ((parent != null) && (String.IsNullOrEmpty(directoryName)))
			{
				throw new ArgumentException(
					"Попытка присвоить не корневой директории пустое имя",
					"directoryName");
			}
			else if ((parent == null) && (directoryName != null)) 
			{
				throw new ArgumentException(
					"Попытка присвоить корневой директории значение не равное null",
					"directoryName");				
			}
			else
			{
				_directoryName = String.IsNullOrEmpty(directoryName) ? RootDirectory : directoryName;
			}
		}
Пример #3
0
		OpcDaTag Find(OpcDaDirectory directory, string tagId)
		{
			OpcDaTag result = null;

			var tag = directory.Items
				.Where(x => !x.IsDirectory)
				.Select(x => (OpcDaTag)x)
				.FirstOrDefault(t => t.TagId == tagId);

			if (tag != null)
			{
				return tag;
			}

			// Обходим вложенные директории
			var directories = directory.Items
				.Where(x => x.IsDirectory)
				.Select(x => (OpcDaDirectory)x);


			foreach (var dir in directories)
			{
				result = Find(dir, tagId);
				if (result != null)
				{
					return result;
				}
			}

			return result;
		}
Пример #4
0
		/// <summary>
		/// Получает дерево тегов OPC DA сервера
		/// </summary>
		/// <param name="parentDirectory">При первом вызове передать null - 
		/// будеть создана корневая директория</param>
		/// <param name="server"></param>
		void BuildTreeTags(ref OpcDaDirectory parentDirectory, IOPCBrowseServerAddressSpace server)
		{
			opcproxy.IEnumString ptrEnum;
			uint cnt;
			string strName;
			string szItemID;

			if (parentDirectory == null)
			{
				parentDirectory = new OpcDaDirectory(); // Создаём корневую директорию
			}


			// Получаем все теги
			server.BrowseOPCItemIDs(tagOPCBROWSETYPE.OPC_LEAF, "", (ushort)VarEnum.VT_EMPTY, 0, out ptrEnum);
			ptrEnum.RemoteNext(1, out strName, out cnt);
			while (cnt != 0)
			{
			
				// получаем полный идентификатор тега
				server.GetItemID(strName, out szItemID);
				parentDirectory.Items.Add(new OpcDaTag(szItemID, strName, parentDirectory));
				ptrEnum.RemoteNext(1, out strName, out cnt);
			}

			// Получем директории 
			server.BrowseOPCItemIDs(tagOPCBROWSETYPE.OPC_BRANCH, "", 1, 0, out ptrEnum);
			ptrEnum.RemoteNext(1, out strName, out cnt);
			while (cnt != 0)
			{
				server.ChangeBrowsePosition(tagOPCBROWSEDIRECTION.OPC_BROWSE_DOWN, strName);
				var childDirectory = new OpcDaDirectory(strName, parentDirectory);
				parentDirectory.Items.Add(childDirectory);
				BuildTreeTags(ref childDirectory, server);
				server.ChangeBrowsePosition(tagOPCBROWSEDIRECTION.OPC_BROWSE_UP, strName);
				ptrEnum.RemoteNext(1, out strName, out cnt);
			}
		}