博客
关于我
创建组出现错误:对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/

    你可能感兴趣的文章
    windows环境下安装zookeeper(仅本地使用)
    查看>>
    缓冲区溢出实例(一)--Windows
    查看>>
    Hadoop学习笔记—Yarn
    查看>>
    JSONPath小试牛刀之Snack3
    查看>>
    Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
    查看>>
    wxWidgets源码分析(3) - 消息映射表
    查看>>
    wxWidgets源码分析(5) - 窗口管理
    查看>>
    wxWidgets源码分析(8) - MVC架构
    查看>>
    wxWidgets源码分析(9) - wxString
    查看>>
    [梁山好汉说IT] 梁山好汉和抢劫银行
    查看>>
    [源码解析] 消息队列 Kombu 之 基本架构
    查看>>
    [源码分析] 消息队列 Kombu 之 启动过程
    查看>>
    wx.NET CLI wrapper for wxWidgets
    查看>>
    Silverlight for linux 和 DLR(Dynamic Language Runtime)
    查看>>
    ASP.NET MVC Action Filters
    查看>>
    Powershell中禁止执行脚本解决办法
    查看>>
    OO_Unit2 多线程电梯总结
    查看>>
    git clone 出现fatal: unable to access ‘https://github 错误解决方法
    查看>>
    04_Mysql配置文件(重要参数)
    查看>>
    python 加密算法及其相关模块的学习(hashlib,RSA,random,string,math)
    查看>>