2016-06-09 117 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核心組件可再發行組件」 和的RCW mergemodule安裝?

  • 在客戶端上:防火牆設置?

  • 在服務器上:abc opc服務器的dcom設置是否正確?

只是看看在IOPCCServerList2的源代碼,我IOPCServerList2有不同的版本比你的。 我想你嘗試使用爲OPC DA 1.0設計的舊合併模塊/ api(這是一個非常古老而又不嚴格的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服務器品牌(如橫河電機或Matrikon)時,所有這些都可以正常工作,但不適用於ABB OPC服務器。 –

+0

你有一些opc測試客戶端嘗試連接嗎? – apr

+0

是的,Matrikon和一些其他商用opc客戶端可以連接和讀取數據,但.Net API無法連接。 –

1

IOPCCServerList2是OPCENUM服務,而不是服務器本身的一部分的一部分。

如果從遠程進行連接,則應用程序正在訪問與服務器在同一臺計算機上運行的OPCEnum服務。

IOPCCServerList2是IOPCCServerList的新版本,最可能的是隨ABB Freelance安裝的OPCEnum服務版本太舊。

您可以通過安裝OPC Foundation website中提供的最新OPC核心組件來更新OPCEnum服務。

+0

是的,這是我的問題,但對於您的答案,我們無法在OPC服務器站上安裝或更新任何軟件,我們有工廠限制。 –

+0

然後,您將需要避免使用OPCEnum或修改.NET API,以便它將使用IOPCServerList而不是IOPCServerList2。您可以通過使用服務器的CLSID而不是ProgID來避免它。但我不是100%確定的.NET API。 –

+0

感謝Jouni Aro,爲了忽略副作用,'IOPCServerList2'是一個內部接口,我無法改變它使用'IOPCServerList',我們已經解決了將OPC API從.NET API轉換爲另一種基於Python的API的問題。 –