Шаг 2. Просмотр содержимого OPC сервера
Реализуем теперь обработчик, который при выделении соответствующего
элемента списка будет показывать адресное пространство соответствующего
сервера. Важно помнить, что мы имеем дело с обменом данными между
приложениями реального времени, поэтому сервер, к которому происходит
подключение, должен быть запущен.
Вначале нам необходимо подключить «обертку» функций для работы с
OPC, для этого необходимо в файл stdafx.h вставить следующую директиву
импорта
#import "с:\\Windows\system32\opcproxy.dll"\
rename_namespace("OPCDA")
using namespace OPCDA;
Спецификация ОРС DA 2.0 и выше регламентирует необязательный
интерфейс IOPCBrowseServerAddressSpace.
Не смотря на то, что спецификация не требует его обязательной
реализации, у большинства серверов он реализован, что дает возможность
клиенту просмотреть его внутреннее строение. Именно этот интерфейс мы и
будем использовать2.
Далее будем предполагать, что сервер имеет иерархическое адресное
пространство (в большей части серверов так и есть).
В сервере с иерархическим адресным пространством существует два типа
узлов:
Ветви (OPC_BRANCH) – элементы у которых есть дочерние элементы
Листья (OPC_LEAF) – элементы у которых нет дочерних элементов
Так ветвями является элемент самого сервера (Server) и элементы групп
(Group) в сервере, а листьями являются теги (Item).
Таким образом, необходимо разработать алгоритм, который бы
рекурсивно проходил по элементам сервера и разворачивал их в дерево. Такой
алгоритм у нас будет реализовывать функция
private:
void DisplayChildren(HTREEITEM hParent,
IOPCBrowseServerAddressSpace* pParent);
Функция в качестве аргументов принимает ссылку на родительский
элемент в дереве и интерфейс IOPCBrowseServerAddressSpace
спозиционированный на родительский элемент в сервере. Тело DisplayChildren
приведено ниже
2
В разделе замечания по поводу OPC DA 3.0 реализован просмотр адресного пространства с помощью
IOPCBrowse