来源:https://stackoverrun.com/cn/q/10400663
无法连接到ABB Freelance OPC服务器[无此类接口支持(异常来自HRESULT:0x80004002(E_NOINTERFACE))]
我的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); } }
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); } }
IOPCCServerList2是OPCENUM服务,而不是服务器本身的一部分的一部分。
如果从远程进行连接,则应用程序正在访问与服务器在同一台计算机上运行的OPCEnum服务。
IOPCCServerList2是IOPCCServerList的新版本,最可能的是随ABB Freelance安装的OPCEnum服务版本太旧。
您可以通过安装中提供的最新OPC核心组件来更新OPCEnum服务。
是的,这是我的问题,但对于您的答案,我们无法在OPC服务器站上安装或更新任何软件,我们有工厂限制。 – 14 6月. 16
然后,您将需要避免使用OPCEnum或修改.NET API,以便它将使用IOPCServerList而不是IOPCServerList2。您可以通过使用服务器的CLSID而不是ProgID来避免它。但我不是100%确定的.NET API。 – 14 6月. 16
感谢Jouni Aro,为了忽略副作用,'IOPCServerList2'是一个内部接口,我无法改变它使用'IOPCServerList',我们已经解决了将OPC API从.NET API转换为另一种基于Python的API的问题。 – 15 6月. 16
需要安装:
OPC Core Components 2.00 Redistributable 2.20.msi
是的,当连接到其他OPC服务器品牌(如横河电机或Matrikon)时,所有这些都可以正常工作,但不适用于ABB OPC服务器。 – 13 6月. 16
你有一些opc测试客户端尝试连接吗? – 13 6月. 16
是的,Matrikon和一些其他商用opc客户端可以连接和读取数据,但.Net API无法连接。 – 13 6月. 16