*(00)*

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

来源:https://stackoverrun.com/cn/q/10400663

无法连接到ABB Freelance OPC服务器[无此类接口支持(异常来自HRESULT:0x80004002(E_NOINTERFACE))]


1

我的OPC客户端应用程序使用OPC NET API 2.00时出现问题,所以当我想连接到ABB Freelance OPC Server它在调用Opc.Server.Connect(Opc.ConnectData)方法时会引发异常。

例外:

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服务器。 – Reza Ebrahimi 13 6月. 16

  0 

你有一些opc测试客户端尝试连接吗? – apr 13 6月. 16

  0 

是的,Matrikon和一些其他商用opc客户端可以连接和读取数据,但.Net API无法连接。 – Reza Ebrahimi 13 6月. 16


1

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

如果从远程进行连接,则应用程序正在访问与服务器在同一台计算机上运行的OPCEnum服务。

IOPCCServerList2是IOPCCServerList的新版本,最可能的是随ABB Freelance安装的OPCEnum服务版本太旧。

您可以通过安装OPC Foundation website中提供的最新OPC核心组件来更新OPCEnum服务。

  0 

是的,这是我的问题,但对于您的答案,我们无法在OPC服务器站上安装或更新任何软件,我们有工厂限制。 – Reza Ebrahimi 14 6月. 16

  0 

然后,您将需要避免使用OPCEnum或修改.NET API,以便它将使用IOPCServerList而不是IOPCServerList2。您可以通过使用服务器的CLSID而不是ProgID来避免它。但我不是100%确定的.NET API。 – Jouni Aro 14 6月. 16

  0 

感谢Jouni Aro,为了忽略副作用,'IOPCServerList2'是一个内部接口,我无法改变它使用'IOPCServerList',我们已经解决了将OPC API从.NET API转换为另一种基于Python的API的问题。 – Reza Ebrahimi 15 6月. 16

 

需要安装:

OPC Core Components 2.00 Redistributable 2.20.msi

 

posted on 2018-11-18 20:58  *(00)*  阅读(7434)  评论(0编辑  收藏  举报