OPCAutomation客户端调用服务器返回HRESULT E_FAIL错误处理


一.背景

  使用.NET3.5+OPCAutomation开发一OPC客户端,软件流程非常简单就是OPC环境配置没有做过,网上找了一个OPC一键DCOM配置工具,第一次安装很方便,运行工具后安装软件一切正常。一星期后联系我说客户电脑抱走干别的了,又找了台新电脑。再次配置安装后报错“对COM 组件的调用返回了错误HRESULT E_FAIL”。问题最后也没明白,处理过程也挺挠头,记下来省的下次再乱翻。

       错误环境

       客户端:Win7 64位 专业版 .NET3.5,双网卡,一个网卡连接公网,一个网卡连接内网OPC服务器。

       服务器:Win10  KEPServer

二.E_FAIL是个什么错误

  我想知道E_FAIL是个什么,看起来应该是COM+编程的,之前没有做个这个,也不晓得去哪找,百度“COM+ E_FAIL”出来的都是那几个,试过都不行。去OPC Automation 2.0手册看了下,包含E_FAIL的就这么一句:

      A vendor specific fatal error has occurred within the server. The server is no longer functioning. The recovery procedure from this situation is vendor specific. An error code of E_FAIL should generally be returned from any other server method.

       去国内编程论坛找的就是百度出来那几个,国外的也没找到,吐槽下工控论坛,别说问了没人回,资料都捂的死死的。到现在解决了也不知道它是什么。发出来祈求那天那个大侠看到给我发个链接看看。

三.解决过程

  先试了百度出来的结果:

  1.OPC Server客户端连接太多了

                重启了OPC Server。

                尝试结果:没有解决。

       2.客户端开启Distributed Transaction Coordinator服务

               命令行:dcomcnfg打开“组件服务”。选择“组件服务”-“计算机”-“我的电脑”-“Distributed Transaction Coordinator”。

               

 

               这里只有一个“本地 DTC”,右键选择“属性”-“安全”,选中“网络DTC访问”,事务管理器通信选则“允许入栈”、“允许出栈”、“不要求进行验证”。

              

 

               尝试结果:没有解决。

               3.检查环境配置。具体检查什么没有详细。。。

四.检查OPC环境

              1.网络环境

               a.确保OPC客户端与服务器在同一个网段。

                   检查结果:正常。

               b.客户端程序内OPC连接服务器使用了服务器hostName (手册内表示也可使用ip:Node is optional. The use of a node name makes use of DCOM to access another computer. Acceptable node names are UNC names (“Server”), or DNS names (“server.com”, “www.vendor.com”, or “180.151.19.75”)),检查发下客户端“网络”-"计算机"列表没有服务器。将服务器、客户端配置在同一工作组。

                  处理结果:未解决。

               c.OPC使用135端口,在防火墙--高级设置--出入栈规则内配置开启135端口。

                 处理结果:未解决。

               d.关闭防火墙。

                 处理结果:未解决。

               e.客户抱走的电脑软件没有卸载,打开软件也是报“对COM 组件的调用返回了错误HRESULT E_FAIL”,而抱走的电脑和Opc服务器没有网络连接。

                 反馈结果:网络连接不通也报这个错误。但现在网络连接正常。

               2.测试OPC客户端COM环境

               a.客户端安装注册OPC调试服务器,右键OpcEnum--属性,配置OPCEnum.exe为交互用户。

                

              配置过程发现交互用户不可选,命令行下卸载、重新注册OpcEnum后可选:

              OpcEnum /unregserver

              OpcEnum /regserver

             当提示OpcEnum不存在时检查OpcEnum安装,保证OpcEnum.exe已安装在“%WinDir%\system32”,64位“%WinDir%\SySWow64”。

               测试结果:可以正常获取本地Opc测试服务器。但是连接获取采集项时发生错误。

             3.检查OPC客户端COM环境

             a.检查已安装的opc组件,64位系统确保“%WinDir%\SySWow64”下opc组件已安装、注册(32位系统为“%WinDir%\system32”)。

               自己修改下脚本,把所有opc组件重新安装注册了一下。

             b.检查COM配置

              "组件服务”-“计算机”-"我的电脑",右键选则“属性”:

              配置“默认属性”如下:确保箭头所指选项配置如同。

             

 

             配置"COM安全",确保箭头所指默认值内如下用户:everyone,SYSTEM,NETWORK,INTERACTIVE,ANONYMOUS LOGON,具有所有权限。

               

 

             配置完成后重启OPC客户端电脑。此时发现安装了360管家等,告知客户暂时关闭下,客户直接全部卸载相关软件。

            处理结果:重启后打开软件,故障解决。可以正常获取远程Opc服务列表。可以正常获取数据。

五.后续

            客户卸载了所有第三方安全软件,防火墙再关掉太危险了,于是重新打开防火墙,然后数据无法获取了...

            检查防火墙允许程序,将Opc客户端应用程序添加到防火墙白名单。处理结果:仍然无法正常获取数据。

            打开防火墙--高级设置--入栈规则,发现Opc客户端应用程序入栈规则只是作用在专用网络,于是配置为所有网络:

            

 

           处理结果:可以正常获取数据。原因:Opc客户端为双网卡,与Opc服务器连接的网卡网络类型为公用网络。

六.处理过程遇到的其他问题

           脚本工具 OPC一键DCOM配置 使用  “netsh interface ip set address” 命令配置的Opc客户端网络环境,双网卡下,脚本执行时第一台电脑设置的内网网卡,第二台电脑工具设置的外网网卡,由于是远程配置的,所以远程直接断在了这里...后来直接注释掉 OPC一键DCOM配置工具内该命令,手动检查设置了一下。

 

             

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM