Главная страница
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
qrcode

Федоренко Д.Ю. Программирование OPC клиентов на C++ и C#. Часть 1. OPC DA. Программирование opc клиентов на C и C Часть opc da


НазваниеПрограммирование opc клиентов на C и C Часть opc da
АнкорФедоренко Д.Ю. Программирование OPC клиентов на C++ и C#. Часть 1. OPC DA.pdf
Дата13.03.2018
Размер2.35 Mb.
Формат файлаpdf
Имя файлаFedorenko_D_Yu_Programmirovanie_OPC_klientov_na_C__i_C__Chast_1_
оригинальный pdf просмотр
ТипДокументы
#37260
страница1 из 6
КаталогОбразовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
  1   2   3   4   5   6

Программирование OPC
клиентов на C++ и C#
Часть 1. OPC DA
Изд. 1
Федоренко Денис
Fedorenko.Dennis@gmail.com www.opcfoundation.com
ОГЛАВЛЕНИЕ
ОСНОВЫ OPC ...................................................................................................................2
РАБОТА СО СПЕЦИФИКАЦИЕЙ OPC DA ......................................................................5
Объектная модель OPC DA и краткое описание интерфейсов .......................................................................... 5
Адресное пространство OPC DA сервера ............................................................................................................. 7
Способы чтения данных из OPC DA сервер......................................................................................................... 8
Синхронное чтение............................................................................................................................................. 9
Асинхронное чтение ..........................................................................................................................................10
Точки подключения......................................................................................................................................10
OPC и точки подключения ..........................................................................................................................12
Асинхронное чтение данных с помощью функции IOPCAsyncRead ......................................................12
Чтение данных по их изменению....................................................................................................................14
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ OPC КЛИЕНТА ..........................................................................................16
Вариант C++/ MFC ............................................................................................................................................16
Шаг 0. Подготовка диалога............................................................................................................................16
Шаг 1. Просмотр установленных на локальной машине OPC-серверов.......................................................16
Шаг 2. Просмотр содержимого OPC сервера...............................................................................................21
Шаг 3.1. Синхронное чтение данных из OPC сервера ...................................................................................25
Шаг 3.2.Асинхронное чтение данных из OPC сервера...................................................................................32
Последние штрихи ..........................................................................................................................................38
Замечания по поводу версии OPC DA 3.0...................................................................................................40
Вариант C#/.NET................................................................................................................................................43
Предисловие. Взаимодействие COM и .NET..............................................................................................43
Шаг 0. Подготовка диалога............................................................................................................................45
Шаг 1. Просмотр установленных на локальной машине OPC-серверов.......................................................45
Шаг 2. Просмотр содержимого OPC сервера...............................................................................................49
Шаг 3.1. Синхронное чтение данных из OPC сервера...................................................................................53
Рисунок24. - Результат синхронного чтения данных с сервера .....................................................................62
Шаг 3.2. Асинхронное чтение данных из сервера...........................................................................................62
Последние штрихи ..........................................................................................................................................68
Замечания по поводу версии OPC DA 3.0...................................................................................................69

ОСНОВЫ OPC
В этом разделе рассматривается технология OPC и самые общие принципы ее функционирования. Для людей, которые уже сталкивались в своей практической деятельности с OPC, здесь не откроется ничего нового и они могут приступать к рассмотрению материала по разработке OPС клиентов.
А для тех, кто только начинает свое знакомство с обменом данными между приложениями автоматизации знание этого крайне важно для дальнейшей разработки клиентов и серверов ОРС.
OPC (OLE for Process Management) - промышленный стандарт, созданный консорциумом всемирно известных производителей оборудования и программного обеспечения, такими как Fischer Rosemount, Rockwell Software,
Intellution и пр., при участии Microsoft, который описывает интерфейс обмена данными между различными источниками данных и программным обеспечением.
OPC основывается на технологии OLE/COM/DCOM компании Microsoft,
Inc. (не считая OPC UA, в основу которой положена сервис ориентированная архитектура SOA).
Главной целью было предоставить разработчикам систем диспетчеризации некоторую независимость от конкретного типа источника данных. В настоящее время, OPC используется повсеместно: не только для обмена данными с аппаратным обеспечением, но и для связи одного приложения с другим, для связи с СУБД и пр.
Для того, чтобы описать что такое OPC, воспользуемся любимым примером OPC Foundation, а именно – использование принтеров.
Предположим, что Вы использует какой-либо высокоуровневый текстовый редактор для создания документов. После того, как документ создан, его необходимо распечатать посредством принтера, условно производства фирмы «А». Для того, чтобы это сделать, Ваш текстовый редактор должен уметь работать с принтером «А», более того, если производители текстового редактора хотят, чтобы он пользовался популярностью, то он должен иметь поддержку и принтеров «Б», «В» и так почти до бесконечности.
Реализовать возможность работы с каждым принтером в самом текстовом редакторе - подход совершенно непрактичный: во-первых, растет сложность редактора; во-вторых, с каждым новым принтером необходимо дополнять список поддерживаемых команд; в-третьих, сколько еще на одной рабочей станции будет стоять программ, которые будут нуждаться в услугах принтеров и нести в себе эти же наборы команд.
Вместо такого подхода, как известно, все специфические команды принтера возлагаются на драйвер, в то время как конкретные приложения
«общаются» уже с драйвером принтера, а не обращаются к нему напрямую.

Таким образом, текстовый редактор ничего не «знает» о тонкостях реализации принтера, а видит его лишь через призму драйвера, интерфейс которого стандартизирован. Теперь, если мы хотим добавить поддержку принтера в наше приложение необходимо лишь реализовать возможность работы с драйвером печатающих устройств.
По такому же принципу работает и OPC (см. рисунок). Основная идея заключается в том, что у нас есть некое программное приложение, которое здесь представлено компьютером Client, которому необходимо получать данные из определенного количества разнородных источников, например, ПЛК, интеллектуального полевого оборудования, другого программного обеспечения, СУБД и т.п.
Для этого приложению необходимо иметь большое количество встроенных драйверов и быть «жестко» привязанным к конкретному источнику данных. С ростом функциональности приложения будет расти и количество драйверов.
В случае же использования OPC, к источнику прилагается OPC сервер, который общается с источником на "понятном ему языке" (native API), а полученные от источника данные передает клиентам уже посредством интерфейсов OPC.
Рисунок 1. – Использование OPC
Таким образом, клиент находится в полном неведении о тонкостях реализации источника данных, зная лишь то, что он поддерживает спецификацию OPC для обмена данными.

OPC формирует лишь форму обмена данными, содержание регламентируется различными спецификациями, самые распространенные из которых:
OPC DA (Data Access). Самая распространенная спецификация, которая реализована в 99% OPC приложений. Интерфейсы OPC DA предназначены для чтения, записи и мониторинга переменных, представляющих собой текущее значение контролируемых параметров.
OPC A&E (Alarms and Events). Интерфейс обеспечивает получение событий и тревог из источника. Событие в рамках этой спецификации – это оповещение о возникновении какого-либо производственного события. Тревога ж – это оповещение, которое информирует клиента об изменениях в условиях протекания процесса. Некоторые тревоги и события требует подтверждения
(квитирования), статус которого тоже можно передавать посредством OPC
A&E.
OPC HDA (Historical Data Access). Интерфейс предназначен для доступа к историческим (архивным) данными. Различные источники исторических данных, такие как СУБД, архивы SCADA/DCS и могут быть опрошены единым образом
OPC UA (Unified Architecture). Платформо-независимая спецификация, основанная на SOA, которая обеспечивает унифицированный обмен любым типом данных: реального времени, историческими и тревогами между различными платформами
Существуют также спецификации XML-DA, Batch и пр., но они не так распространены.

РАБОТА СО СПЕЦИФИКАЦИЕЙ OPC DA
Как уже упоминалось, спецификация OPC DA предназначена для обмена данными в реальном времени и является самой распространенной. На сегодняшний день практически каждая
SCADA предоставляет функциональность как OPC DA сервера, так и клиента.
Объектная модель OPC DA и краткое описание интерфейсов
В основу OPC DA положена объектная модель COM, поэтому, на самом деле, спецификация есть ни что иное как описание необходимых компонентов
(объектов) и поддерживаемых ими интерфейсов.
Чтобы иметь возможность работы с приложениями, написанными посредством любого языка программирования OPC DA предоставляет два набора интерфейсов - Custom и Automation.
Первый используется для взаимодействия с компилируемыми языками программирования (например, C++), второй с интерпретируемыми (например,
VBA). Custom-клиенты взаимодействуют с OPC напрямую, а OPC Automation через «обертку» OLE Automation.
На самом деле, такое разделение свойственно всем COM компонентам, которые "хотят" работать с обоими видами языков программирования. Причина в том, что COM основан на использовании таблицы виртуальных функций, которая поддерживается только компилируемыми языками.
Т.к. все примеры реализованы на компилируемых языках, то далее рассматривается взаимодействие с OPC через Custom интерфейс.
Рисунок 2. - Структура работы c OPC посредством различных языков программирования
Технология OPC непрерывно развивается сообществом и как результат, на сегодняшний день существует три основных версии спецификации OPC DA:
DA 1.0, DA 2.0, DA 3.0.

От версии к версии происходит аннулирование и добавление интерфейсов, что естественно должно находит свое отражение и на реализации клиентов. Ситуацию спасает тот факт, что большая часть производителей OPC серверов обеспечивают поддержку всех доступных версий, что обеспечивает поддержку всего спектра клиентов.
Ниже приведено описание работы со спецификацией 2.0 (точнее 2.05), а также указаны замечания относительно спецификации 3.0. Спецификации 1.0 не рассматривается в силу своей давности
OPC предоставляет два вида объектов:
Объект OPC сервера
Объект OPC группы
Рисунок 3.1. - Компоненты OPC сервера и OPC группы и их интерфейсы согласно спецификации OPC DA 2.0

Рисунок 3.2. - Компоненты OPC сервера и OPC группы и их интерфейсы согласно спецификации OPC DA 3.0
При организации обмена с сервером используются оба объекта. Каждый объект предоставляет набор интерфейсов, которые можно разбить на две группы:
Обязательные интерфейсы - интерфейсы, которые сервер должен поддерживать каждый сервер, чтобы соответствовать спецификации и иметь право называться OPC-сервером.
Необязательные интерфейсы - набор интерфейсов, поддержка которых жестко не требуется спецификацией и предназначенные для предоставления клиентам дополнительных возможностей и функциональности.
На рисунках приведены указанные объекты и предоставляемые ими интерфейсы соответственно спецификации OPC DA 2.0 и OPC DA 3.0s.
Необязательные интерфейсы приведены курсивом и взяты в квадратные скобки
В приведенных примерах будут использоваться не все интерфейсы, которыми обладает тот или иной объект, но большую часть из них, все же придется задействовать.
Каждый интерфейс предоставляет набор функций, с помощью которых осуществляется манипуляция и доступ к данным сервера. Полное описание интерфейсов и содержащихся в них функций можно найти в спецификации
OPC, где перечислены параметры и возвращаемые значения каждой функции.
Адресное пространство OPC DA сервера
Адресное пространство OPC DA определяет каким образом хранятся данные, полученные от источника. Оно может быть
Плоским. Сервер состоит из набора элементов данных следующих друг за другом (организация в виде списка). Такая структура свойственна очень простым серверам и встречается крайне редко.

Иерархическим. Эта архитектура свойственна большинству OPC DA серверов. Обычно структура имеет вид приведенный на рисунке 4
OPC Server
OPC Group
OPC Group
OPC Item
OPC Item
OPC Item
OPC Item
Рисунок 4. - Базовая структура иерархического адресного пространства.
Рисунок 5. – Пример OPC сервера с иерархическим адресным пространством
Во главе адресации стоит сервер, в котором имеется некоторое количество групп, в каждой группе имеется несколько элементов данных.
Такая структуризация не является жестким стандартом и достаточно часто можно видеть вложенность групп или наличие элементов данных в узле сервера без использования групп.
Пример сервера с иерархическим адресным пространством приведен на рисунке 5 (источник https://www.codeproject.com/KB/COM/opctechnology.aspx
)
Способы чтения данных из OPC DA сервер
Чтение данных из OPC DA сервера возможно тремя способами
1. Синхронный обмен через интерфейс IOPCSyncIO
2. Асинхронный обмен через интерфейс IOPCAsyncIO2 3. Асинхронный обмен через подписку на изменения активных элементов активных группы через обратные вызовы интерфейса IOPCDataCallback.

Синхронное чтение
Этот способ является наиболее простым с точки зрения программной реализации. В этом случае клиент запрашивает у сервера данные через интерфейс IOPCSyncIO и приостанавливает свое выполнение до окончания запроса, т.е. чтение происходит в основном потоке, там где и был послан запрос.
Рисунок 6.1 – Синхронное чтение данных из OPC сервера
Синхронное чтение состоит из шагов приведенных на рисунке
Вначале происходит добавление группы в сервер и установка ее настроек, с помощью вызова метода IOPCServer::AddGroup(). В результате возвращается интерфейс IOPCItemMgt.
Следующим шагом в группу добавляются необходимые элементы данных и устанавливаются их настройки, с помощью вызова метода
IOPCItemMgt::AddItems().

После того, как группа добавлена и заполнена элементами данными клиент запрашивает интерфейс
IOPCSyncIO и выполняет функцию
IOPCSyncIO, получая в ответ информацию о запрашиваемых элементов данных в массиве структур OPCITEMSTATE. Как уже упоминалось поток, вызывающий функцию Read блокируется в ожидании ответа от сервера.
Асинхронное чтение
Асинхронное чтение отличается тем, что основной поток, в котором происходит вызов запросов на чтение, не блокируется на ожидание ответа, а продолжает свое выполнение: ответы сервера выполняются в отдельном рабочем потоке.
Т.е. имеет место двунаправленное взаимодействие между COM клиентом и сервером, для организации которого используется технология точек подключения, которая коротко описана ниже.
Точки подключения
В однонаправленном COM взаимодействии клиент является инициатором всех транзакций, а сервер лишь отвечая на запросы QueryInterface клиента, возвращает требуемые интерфейсы и реализует их функциональность.
Однако существуют случаи, и асинхронное взаимодействие с OPC сервером яркий пример, когда инициатором обмена должен стать сервер, а клиент должен среагировать на его запрос.
Такое взаимодействие называется двунаправленным, суть которого заключается в следующем. Пусть имеется COM сервер, который поддерживает некий интерфейс ISomeSink, реализующий методы, которые можно поставить в соответствие каким-либо событиям на сервере. Т.е. по возникновению события происходит вызов соответствующего метода. И имеется клиент, который хочет получать оповещения об этих событиях на своей стороне.
Решение этой задачи заключалось бы в том, что клиент на своей стороне реализовал бы интерфейс ISomeSink и заставил сервер запросить его у себя. А сервер, имея у себя клиентский интерфейс, вызывал бы соответствующие методы и тем самым информировал клиента о событиях. Осталось только заставить сервер выполнять функции запроса интерфейса.
Для этих целей существует технология точек подключения (соединения)
– connection point (см. рисунок).
Она заключается в том, что клиент получает (каким образом будет рассмотрено ниже) у сервера интерфейс IConnectionPoint, который представлен как interface IConnectionPoint : IUnknown {
HRESULT GetConnectionInterface ([out] IID* pIID);
HRESULT GetConnectionPointContainer (

[out] IConnectionPointContainer** ppCPC);
HRESULT Advise ([in] IUnknown* pUnkSink,
[out] DWORD* pdwCookie);
HRESULT Unadvise ([in] DWORD dwCookie);
HRESULT EnumConnections ([out] IEnumConnections** ppEnum);}
Этот интерфейс содержит метод Advise (подписка), который занимается тем, что говорит серверу запросить переданный в него в качестве параметра интерфейс у клиента и активировать его методы, когда необходимо.
На рисунке вызов Advise представлен виде замыкания ключа, который направляет вызовы клиенту через интерфейс ISomeSink.
Рисунок 6.2. – Технология точек соединения COM сервера
Каждой точке подключения соответствует один интерфейс, т.е. сервер с одной точкой подключения поддерживает отправку лишь по одному интерфейсу. Такой факт, естественно является неудовлетворительным, т.к. в один интерфейс уложить все возможные методы противоречило бы самой концепции COM, которая создавалась для максимальной гибкости и возможности масштабирования программного обеспечения
Чтоб иметь возможность взаимодействовать по нескольким интерфейсам сервер должен обладать несколькими точками подключения.
Все точки подключения сгруппированы в контейнер, который представляется интерфейсом IConnectionpointContainer. interface IConnectionPointContainer : IUnknown {
HRESULT EnumConnectionPoints (
[out] IEnumConnectionPoints ** ppEnum);
HRESULT FindConnectionPoint ([in] REFIID riid,
[out] IConnectionPoint** ppCP);
}

Вследствие такой группировки IConnectionPoint не является частью идентификации объекта-сервера, т.е. не может быть запрошен вызовом
QueryInterface.
Запрос точек подключения происходит через
IConnectionPointContainer.
Т.е., чтобы получить IConnectionPoint, необходимо запросить у сервера
IConnectionpointContainer, затем у него вызовом метода FindConnectionPoint запросить точку подключения.
В качестве первого параметра передается идентификатор интерфейса, через который поддерживается взаимодействие данной точкой подключения.
Если сервер поддерживает связь по данному интерфейсу, то он вернет соответствующую точку подключения.
Рисунок 6.3 – Запрос точки подключения через IConnectionPointContainer
  1   2   3   4   5   6

перейти в каталог файлов

Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей

Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей