2016-06-09 6 views
1

У меня проблема в моем клиентском приложении OPC с использованием OPC NET API 2.00, поэтому, когда я хочу подключиться к серверу ABB Freelance OPC Server , он выдает исключение при вызове метода Opc.Server.Connect(Opc.ConnectData).Не удается подключиться к серверу ABB Freelance OPC [Нет такого интерфейса (исключение из HRESULT: 0x80004002 (E_NOINTERFACE))]

Исключение:

Unable to cast COM object of type 'System.__ComObject' to interface type 'OpcRcw.Comn.IOPCServerList2'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{9DD0B56C-AD9E-43EE-8305-487F3188BF7A}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

Может быть проблема относится к IOPCServerList2 интерфейса:

#region Assembly OpcRcw.Comn.dll, v1.10.2.0 
// C:\Windows\assembly\GAC_MSIL\OpcRcw.Comn\1.10.2.0__9a40e993cbface53\OpcRcw.Comn.dll 
#endregion 

using System; 
using System.Runtime.InteropServices; 

namespace OpcRcw.Comn 
{ 
    [Guid("9DD0B56C-AD9E-43EE-8305-487F3188BF7A")] 
    [InterfaceType(1)] 
    public interface IOPCServerList2 
    { 
     void CLSIDFromProgID(string szProgId, out Guid clsid); 
     void EnumClassesOfCategories(int cImplemented, Guid[] rgcatidImpl, int cRequired, Guid[] rgcatidReq, out IOPCEnumGUID ppenumClsid); 
     void GetClassDetails(ref Guid clsid, out string ppszProgID, out string ppszUserType, out string ppszVerIndProgID); 
    } 
} 

ответ

0

E_NOINTERFACE здесь является родовым COM ошибка (не очень полезно указать реальную проблему).

Проверил:

  • На клиенте: "OPC Основные компоненты Вторично распространяемого" и RCWS mergemodule установлен?

  • На заказ: настройки брандмауэра?

  • На сервере: Параметры dcom для сервера abc opc верны?

Просто глядя в исходном коде IOPCCServerList2, мой IOPCServerList2 имеет другую версию, чем ваши. Мое предположение, что вы пытаетесь использовать старые модули слияния/api, предназначенные для OPC DA 1.0 (которые имеют очень старые и общеизвестные стандарты opc), большинство OPC-серверов ожидают подключения OPC DA 2.0.

Вот мое:

#region Assembly OpcComRcw, Version=2.0.105.1, Culture=neutral, PublicKeyToken=9a40e993cbface53 
// C:\WINDOWS\assembly\GAC_MSIL\OpcComRcw\2.0.105.1__9a40e993cbface53\OpcComRcw.dll 
#endregion 

using System; 
using System.Runtime.InteropServices; 

namespace OpcRcw.Comn 
{ 
    [Guid("9DD0B56C-AD9E-43ee-8305-487F3188BF7A")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IOPCServerList2 
    { 
     void CLSIDFromProgID(string szProgId, out Guid clsid); 
     void EnumClassesOfCategories(int cImplemented, Guid[ ] rgcatidImpl, int cRequired, Guid[ ] rgcatidReq, out IOPCEnumGUID ppenumClsid); 
     void GetClassDetails(ref Guid clsid, out string ppszProgID, out string ppszUserType, out string ppszVerIndProgID); 
    } 
} 
+0

Да, все они работают, как ожидается, при подключении к другим маркам OPC-сервера, таким как Yokogawa или Matrikon, но не работающие на сервере ABB OPC. –

+0

У вас есть какой-то клиентский тест opc, чтобы попробовать подключиться? – apr

+0

Да, Matrikon и некоторые другие коммерческие клиенты opc могут подключаться и читать данные, но API .Net не удалось подключиться. –

1

IOPCCServerList2 является частью службы OpcEnum, не является частью самого сервера.

Если вы подключаетесь с удаленного устройства, ваше приложение обращается к службе OPCEnum, работающей на том же компьютере, что и сервер.

IOPCCServerList2 - это новая версия IOPCCServerList, и наиболее вероятно, что версия службы OPCEnum, установленная с ABB Freelance, слишком стар.

Вы можете обновить сервис OPCEnum, установив последние компоненты OPC Core, доступные из OPC Foundation website.

+0

Да, в этом мой вопрос, но для вашего ответа мы не можем установить или обновить какое-либо программное обеспечение на серверной станции OPC, у нас есть ограничения на установку для этого. –

+0

Тогда вам нужно будет избежать использования OPCEnum или изменить .NET API, чтобы он использовал IOPCServerList вместо IOPCServerList2. Вы можете избежать этого, используя CLSID сервера вместо ProgID. Но я не на 100% уверен в .NET API. –

+0

Благодаря Jouni Aro, в порядке игнорирования побочных эффектов, «IOPCServerList2» - это внутренний интерфейс, который я не могу изменить для использования «IOPCServerList», мы решили проблему смены API OPC от .NET API на другой API на основе Python , –