и импортировать из нее типы данных COM, которые преобразуются в данные
.NET.
Для этого необходимо в командной строке набрать команду
tlbImp.exe с:\\Windows\system32\opcproxy.dll /out:c:\opcproxy.dll
Команду необходимо выполнять из директории, в которой располагается
утилита tlbImp или же прописать путь к утилите в переменной окружения
PATH, тогда эту команду можно будет вызывать с любого места.
По указанному адресу (в нашем случае это «c:\») появится dll библиотека с
импортированными типами данных в нашем случае «opcenum.dll», которые
необходимо включить в проект.
Теперь можно добавлять вновь сгенерированную библиотеку в проект в
качестве ссылки Object->Add Reference->Browse-> c:\opcproxy.dll.
Станет доступным адресное пространство opcproxy, которое нужно также
включить в проект.
using opcproxy;
Спецификация ОРС DA 2.0 и выше регламентирует необязательный
интерфейс IOPCBrowseServerAddressSpace.
Не смотря на то, что спецификация не требует его обязательной
реализации, у большинства серверов он реализован, что дает возможность
клиенту просмотреть его внутреннее строение. Именно этот интерфейс мы и
будем использовать.
Далее будем предполагать, что сервер имеет иерархическое адресное
пространство (в большей части серверов так и есть).
В сервере с иерархическим адресным пространством существует два типа
узлов:
Ветви (OPC_BRANCH) – элементы, у которых есть дочерние элементы
Листья (OPC_LEAF) - элементы у которых нет дочерних элементов
Так ветвями является элемент самого сервера (Server) и элементы групп
(Group) в сервере, а листьями являются теги (Item).
Таким образом, необходимо разработать алгоритм, который бы
рекурсивно проходил по элементам сервера и разворачивал их в дерево. Такой
алгоритм у нас будет реализовывать функция DisplayChildren.
Функция в качестве аргументов принимает ссылку на родительский
элемент в дереве и интерфейс IOPCBrowseServerAddressSpace
спозиционированный на родительский элемент в сервере.
Тело DisplayChildren приведено ниже
private void DisplayChildren(TreeNode ParentNode,
IOPCBrowseServerAddressSpace pParent)