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


    来源: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:WindowsassemblyGAC_MSILOpcRcw.Comn1.10.2.0__9a40e993cbface53OpcRcw.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:WINDOWSassemblyGAC_MSILOpcComRcw2.0.105.1__9a40e993cbface53OpcComRcw.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

  • 相关阅读:
    spring boot cli 知识点
    OSX Homebrew 安装 Spring Boot CLI
    前端重定向,index.html文件被浏览器缓存,导致整个应用都是旧的
    单页面应用,接入cdn
    Spring Cloud 之 Hystrix 知识点:隔离、熔断、降级
    Spring Cloud 之 Ribbon 知识点:服务器负载均衡
    Spring Cloud 之 Feign 知识点:封装了 REST 调用
    spring cloud 学习资料
    Gradle 知识点
    Gradle 学习资料
  • 原文地址:https://www.cnblogs.com/zouhao/p/9979403.html
Copyright © 2020-2023  润新知