一.背景
使用.NET3.5+OPCAutomation开发一OPC客户端,软件流程非常简单就是OPC环境配置没有做过,网上找了一个OPC一键DCOM配置工具,第一次安装很方便,运行工具后安装软件一切正常。一星期后联系我说客户电脑抱走干别的了,又找了台新电脑。再次配置安装后报错“对COM 组件的调用返回了错误HRESULT E_FAIL”。问题最后也没明白,处理过程也挺挠头,记下来省的下次再乱翻。
错误环境
客户端:Win7 64位 专业版 .NET3.5,双网卡,一个网卡连接公网,一个网卡连接内网OPC服务器。
二.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配置工具内该命令,手动检查设置了一下。