Шпаргалка По Opc Da 2 В .Net

На днях мне пришлось немало повозиться с настройкой звонка на удаленный сервер по протоколу OPC DA 2.05a, и эта информация была бы очень полезна, если бы я знал ее заранее.



1. Что такое OPC DA и в частности OPC DA 2.05a

В целом OPC — это набор открытых протоколов, которые регулируют взаимодействие между различными объектами автоматизации, такими как, например, системы SCADA. OPC DA (доступ к данным) — один из таких протоколов, он позволяет обмениваться данными с устройствами или программными компонентами.

В моем случае при использовании этого протокола необходимо было периодически собирать данные из SCADA-системы.

И самое главное, что OPC DA работает на основе технологии COM, поэтому взаимодействие с OPC-сервером по сути сводится к взаимодействию с COM-сервером.



2. Какие библиотеки есть?



Бинарные файлы из Фонд Опк
Называются Распространяемый OPC .

NET API 2.00 — их нельзя скачать просто так, нужно быть «участником» (= зарегистрироваться и внести деньги).

Существуют также основные компоненты OPC, от которых зависит эта библиотека.

Вы можете найти оба на корневом трекере.

В общем, не совсем понятно, зачем нужно что-то платить, чтобы получить библиотеку от Opc Foundation — компании, продвигающей «открытый стандарт».

Что я могу сказать об этой библиотеке? Документации к нему нигде нет, а API построено не лучшим образом (например, есть несколько интерфейсов и классов с одним и тем же именем, но в разных пространствах имен, это ужасно неудобно, постоянно нужно заходить в Object Browser и посмотреть, какой класс нужен), однако функционала предостаточно — можно делать всё, что можно сделать с OPC-серверами.

Кстати, для удобства я прогонял сборки рефлектором и работал с исходниками — все проблемы декомпиляции по счастливой случайности возникали в других протоколах (OPC AE, OPC HDA) и я их просто выбрасывал за ненадобностью.

Могу выслать решение, если кому интересно, пишите.



Компоненты от Адвасол
Платные компоненты (и очень дорогие).

Скачал Evaluation версию - установщик, который требовал пароль(!), но пароль пришел на почту.

Наиболее полезными компонентами в этом наборе являются тестовые клиенты для OPC-приложений winforms, которые позволяют попробовать подключиться и посмотреть, что находится внутри OPC-сервера.

Сами библиотеки не смотрел, они запутаны и имеют ограничение по времени - полчаса, потом программу надо перезапустить.

А вот с тестовым клиентом я возился долго, так как система у меня была 64-битная, а сборка тестового клиента, как оказалось, была собрана для Target Platform=AnyCPU, и в 32-битной винде она запускалась как в 32-битном приложении (и всё работало как надо), так и в 64-битном - как 64битное.

Это привело к ошибке в коде взаимодействия COM типа «CLSID не зарегистрирован».

А я подумал, что у меня что-то неправильно настроено и потратил 2 дня на копание в secpol.msc, dcomcnfg и compmgmt.msc. К счастью я разобрался как запустить клиент с другой машины и все стало понятно.

С помощью ILDASM и Hex-редактора я определил смещение флага TargetPlatform (от начала заголовка CLR), добавил туда второй бит 32BITREQUIRED и все заработало.

Вывод — если COM Interop у вас не работает, сначала проверьте соответствие платформы.

Кстати, клиент тоже был обфусцирован (с помощью SmartAssembly), а его CLR Header располагался в конце.



Библиотека ОПЦДОТНЕТ
Библиотека от энтузиаста на codeproject.com. Ничего не могу сказать, но именно ее код использовал мой предшественник, реализовавший локальное взаимодействие с OPC-сервером.

Судя по тому, что написано в статье, он предназначен именно для локального взаимодействия.

Плюсы: доступные исходники, наличие тестового клиента, отсутствие зависимостей.



3. Можно ли писать код без использования библиотек?

В принципе, ничего сложного в этом нет, если у вас есть опыт взаимодействия с COM/DCOM-приложениями.

А тем, кто, как и я, не особо разбирается в этих технологиях, могу порекомендовать писать код, посмотрев исходники декомпилированной библиотеки от OPC Foundation. По сути, для взаимодействия с OPC-сервером вам просто нужно сделать интеропсы на нужных интерфейсах, получить их и дергать методы.



4. Проблемы

- Тестовый клиент не подключается с ошибкой RPC-сервер недоступен - проверьте доступность портов, номер порта минимум 135 (основной порт DCOM).

— Доступ запрещен — придется повозиться с настройкой и сервера, и клиента.

См.

ссылки ниже — CLSID не зарегистрирован — проверьте, установлены ли у вас Core Components, они могут отсутствовать.

Или проверьте сборку целевой платформы, которая выполняет взаимодействие.

Возможно, это AnyCPU и он должен быть x86. — CoCreateInstanceEx возвращает допустимый COM-объект, но при приведении его к COM-интерфейсам выпадает Access Denied (0x80070001).

Полдня возился с этой проблемой.

Такое случается, когда вам нужно указать пользователя и пароль для доступа к серверу.

Вы вызываете CoCreateInstanceEx, сначала заполняя SERVER_INFO, и получаете ссылку на объект. Однако следующие вызовы QueryInterface не сохраняют параметры доступа, указанные вами при получении объекта, и это приводит к отказу в доступе.

Решение — вызвать волшебную функцию CoInitializeSecurity, которая установит параметры безопасности по умолчанию для вызовов COM. Код:

   

[DllImport("ole32.dll")] private static extern int CoInitializeSecurity(IntPtr pSecDesc, int cAuthSvc, SOLE_AUTHENTICATION_SERVICE[] asAuthSvc, IntPtr pReserved1, uint dwAuthnLevel, uint dwImpLevel, IntPtr pAuthList, uint dwCapabilities, IntPtr pReserved3); public static void InitializeSecurity() { int errorCode = CoInitializeSecurity(IntPtr.Zero, -1, null, IntPtr.Zero, 1, 2, IntPtr.Zero, 0, IntPtr.Zero); if (errorCode != 0) { throw new ExternalException("CoInitializeSecurity: " + GetSystemMessage(errorCode), errorCode); } }

При вызове этой функции может возникнуть ошибка RPC_E_TOO_LATE. Эта ошибка обычно возникает из-за того, что хост-процесс Visual Studio неявно вызывает CoInitializeSecurity при запуске.

Чтобы решить проблему, достаточно отключить использование хост-процесса в настройках проекта.

Есть несколько ссылок с полезной информацией по этому вопросу: Как кто-то из stackoverflow помог себе во всем разобраться Готовые функции взаимодействия с замечаниями Предложения в Microsoft от разработчиков по этому вопросу

5. Ссылки по теме

Учебный институт OPC - сайт с множеством хорошо оформленных статей, которые помогут в случае возникновения проблем.

Например, как настроить DCOM, каковы возможные причины ошибки RPC-сервер недоступен и т.д. Требуется регистрация, регистрация бесплатна.

Учебники по настройке DCOM — Еще 1 хорошо продуманный туториал по настройке.

Теги: #.

NET #dcom #opc da #TargetPlatform #interop #.

NET

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.