博客
关于我
创建组出现错误:对COM组件的调用返回了错误 HRESULT E_FAIL。小敏
阅读量:625 次
发布时间:2019-03-14

本文共 2059 字,大约阅读时间需要 6 分钟。

C# OPC客户端访问PLC服务器配置与问题解决

环境配置

本次项目使用以下环境进行开发和测试:

  • 开发环境:Windows 7 64位系统
  • PLC类型:S7-200系列
  • 通信协议:OPC DA 1.02
  • 数据接口:PC Access SMART通信接口
  • 开发语言:C#
  • 相关组件:OPC DAAuto.dll文件已注册并成功引用

系统错误分析

在实际操作过程中,我们遇到了以下主要错误:

错误现象

  • 组件组建失败:在尝试创建 OPC组件时,系统返回错误 HRESULT E_FAIL,提示组件化失败。

错误背景

  • OPC服务器连接:经初步排查,OPC服务器已成功连接,但错误仍然频繁出现。
  • 错误发生时间:发生错误的大多数时刻在向PLC添加Items时被发现。

错误原因排查

经过仔细检查代码和排查相关日志,我们发现以下关键问题所在:

1. doubled OP hostname: doubled OPC Server initialization

在完成对OPC服务器的初始化过程中,我们发现代码中被注释掉的部分中存在双重初始化 `\ následively creating the OPC Server instance twice. 请注意这一点:

错误代码片段(需修正):

// 在配置文件中添加以下项
// ...try{ // 初始化 OPC 服务器 opcServer = new OPCServer(OPCHostName, OPCDeviceName, OPCPort);}catch (Exception ex){ // 处理异常}// 注意:在这里可能存在双重初始化的情况

在有限的调试过程中发现,在App.config文件中部分设置有误,导致了对 OPCHostName 的设置被多次调用,并最终导致过多的 OPC 组件被创建,导致资源耗尽。

2. 未处理的异常:不正确的异常处理机制

在已修正信息后,问题依然存在,这提示我们可能需要重新审视整个错误处理机制。特别是,对于HRESULT 错误的处理部分存在不足,这种情况下,正确的做法是通过调用Marshal.GetLastWin32Error()来获取具体错误信息,而不是仅仅依赖于异常对象 (Exception)。

参考修正代码:

try{  opcServer = new OPCServer(OPCHostName, OPCDeviceName, OPCPort);}catch (Exception ex){  int errorcode = Marshal.GetLastWin32Error();  string errorDesc = $"初始化OPC服务器失败, 错误代码: {errorcode}, 错误描述: {ex.Message}";  throw new Exception(errorDesc);}

这种修改可以帮助我们获得更简单和详细的错误信息,简化案件调试过程。

3. DLL 注册问题: 反射性质的问题

另一个值得关注的问题是,OPCDAAuto.dll 的注册和加载机制是否完美适配当前环境。根据我的经验,有时候即使将所需的 DLL 文件放在正确的路径,也可能因为反射加载的上下文问题导致失败。为确保 OPCDAAuto.dll 能够被正确加载,可以尝试在程序启动前使用 Assembly.Load 来预加载相关库文件,以减少反射过程中的潜在问题。

简要解决方案

在实施上述分析的同时,为解决影响配置过程中的问题,我总结出以下关键步骤:

  • 检查OPC 服务器的初始化配置

    确保 OPCHostName 的配置是正确且唯一的,避免在同一应用程序中多次初始化 SCC/OPC 服务器。

  • 完善错误日志记录机制

    采用更细致的日志记录方式,即时获取错误代码和详细描述,以便快速定位错误源头。

  • 反射加载相关组件 DLL

    在程序启动时,尝试使用 Assembly.Load 预加载 OPCDAAuto.dll 和其他相关组件,以减少运行时的反射开销。

  • 测试环境优化

    确保环境配置符合 OPC/Switch的需求,不仅有足够的权限,还要关注用户和组别的设置是否正确。

  • 验证 OPC 数据的读取和写入

    应对重建对PLC进行读写进行测试,确保特别是在组件新建成功后,能够顺利进行数据交互操作

  • 参考相关开发文档

    有时候,问题出在对 OPC API 的不完全理解。审阅官方文档或网络资源是否有类似的错误案例,但切记不要盲目照搬,而是要结合实际情况进行调整和优化。

  • 通过以上多重维度的故障排查和系统优化,我们成功地解决了最初的 HRESULT E_FAIL 错误,并且现在的系统运行状况更加稳定。这个过程的经验教训也提醒我们,在面对非英国错误时,优先要关注环境配置和异常处理机制的完整性。

    最终目标是让代码变得更易维护,更可靠,同时打造一个稳定且灵活的 OPC客户端解决方案。

    转载地址:http://gshoz.baihongyu.com/

    你可能感兴趣的文章
    {spring.cloud.client.ipAddress}
    查看>>
    栈上内存溢出漏洞利用之Return Address
    查看>>
    Redhat6中获取LANG值为空
    查看>>
    C/C++的宏
    查看>>
    Bugku CTF web4(Web)
    查看>>
    练习2-17 生成3的乘方表 (15 分)
    查看>>
    Bugku CTF web29(Web)
    查看>>
    习题4-2 求幂级数展开的部分和 (20 分)
    查看>>
    链表的实现
    查看>>
    剑指offer之和为S的连续正数序列
    查看>>
    设计模式概览——结构型模式
    查看>>
    程序运行时出现“error while loading shared libraries”
    查看>>
    OpenCV中的基本数据结构
    查看>>
    网络+图片加载框架(英文版)
    查看>>
    扣非净利润连续三年亏损,四维图新如何熬过“转型阵痛期”?
    查看>>
    C++/C (&~)运算和(&)运算
    查看>>
    前台报Invalid Host/Origin Header错误
    查看>>
    IE浏览器中input的placeholder不显示
    查看>>
    【JavaScript高级篇】ES6
    查看>>
    IDEA配置@Autowired不提示错误
    查看>>