На днях мне пришлось немало повозиться с настройкой звонка на удаленный сервер по протоколу 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. Код:
При вызове этой функции может возникнуть ошибка RPC_E_TOO_LATE. Эта ошибка обычно возникает из-за того, что хост-процесс Visual Studio неявно вызывает CoInitializeSecurity при запуске.[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); } }
Чтобы решить проблему, достаточно отключить использование хост-процесса в настройках проекта.
Есть несколько ссылок с полезной информацией по этому вопросу: Как кто-то из stackoverflow помог себе во всем разобраться Готовые функции взаимодействия с замечаниями Предложения в Microsoft от разработчиков по этому вопросу
5. Ссылки по теме
Учебный институт OPC - сайт с множеством хорошо оформленных статей, которые помогут в случае возникновения проблем.Например, как настроить DCOM, каковы возможные причины ошибки RPC-сервер недоступен и т.д. Требуется регистрация, регистрация бесплатна.
Учебники по настройке DCOM — Еще 1 хорошо продуманный туториал по настройке.
Теги: #.
NET #dcom #opc da #TargetPlatform #interop #.
NET
-
Как Снизить Стоимость Веб-Хостинга Mac
19 Oct, 24 -
Осторожно: Злоумышленники
19 Oct, 24 -
Смерть Рок-Звездам Javascript!
19 Oct, 24 -
Как Вы?
19 Oct, 24 -
Интервью С Создателем Asp.net
19 Oct, 24