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; }
/// <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; } }
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; }
/// <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); } }