zoukankan      html  css  js  c++  java
  • 关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题

    为了能够在工作中方便的应用OPC和充分的理解OPC的开发流程、内部机制,这两天正在研究开发OPC客户端程序,一般我们开发OPC客户端程序有以下几种方式:

    (1)       使用OPCNetAPI,需要用到OPCNetAPI.dll,OPCNetAPI.Com.dll

    (2)       使用自动化接口,需要用到OPCDAAuto.dll

    (3)       使用自定义接口,需要用到多个Wrapper:OpcRcw.Ae.dll,OpcRcw.Batch.dll,OpcRcw.Comn.dll,OpcRcw.Da.dll,OpcRcw.Dx.dll,OpcRcw.Hda.dll,OpcRcw.Sec.dll

    相关资料可以到http://www.opcfoundation.org/去找,注册成为会员,可以下载一些东西,但是有些是收费的。

    我用的是OPCDAAuto.dll,版本是:2.2.5.30。大家可以到网上去下载,网上版本有可能是2.0.0.0的。网上也有相关的

    DEMO例子也,但是大家都是用的VB.NET和VB开发的比较多,用C#的比较少,即使有,代码写的也比较混乱,并且没有使

    用的一些注意事项。我是用C#开发的,但是,也只是在试验阶段,下一步准备做一个公司内部通用的DLL.

    经过试验,注意事项如下:

    (1)用SyncRead(组的同步读)和AsyncRead(组的异步读)读取服务数据

     c#代码原形:

    SyncRead (short source,int NumItems,ref Arrray ServerHandles,out Values,out Errors,out Qualities,out

    TimeStamps);

    AsyncRead(int NumItems,ref Arrray ServerHandles,out Errors,int TransactionID,out int CancelID);

    大家可以看出这两个函数里边都有一个ref Arrray ServerHandles,

    如果我们在向函数传递参数的时候,

    写成:

    int[] handle=new int []{item.ServerHandle};

    System.Array ServerHandles=(System.Array)handle;

    这时候会出现“参数不正确”的错误异常。

    应该改成:


    int[] handle=new int []{/*函数内部数据下标是从1开始的,所以要把第0位空出来*/0,item.ServerHandle};

    System.Array ServerHandles=(System.Array)handle;


    OPCDAAuto.dll内部源码:

    for (LONG ii = 1; ii <= NumItems; ii++)

    {
      LONG hHandle = NULL;
      SafeArrayGetElement(*ppServerHandles, &ii, &hHandle);

      phHandles[ii-1] = hInvalidHandle;
      ppItems[ii-1]   = NULL;

      COPCItem* pItem = LookupItem(hHandle);
      
      if (pItem != NULL)
      {
       phHandles[ii-1] = pItem->GetServerHandle();
       ppItems[ii-1]   = pItem;
      }

    }

    (2)AsyncRead(组的异步读)读取服务数据

    当用异步读取数据的时候,必须把相应的组的IsSubscribed参数设置为true,以订阅状态方式读取数据;当我们用异步方式

    读取数据就会有一个异步读取完成的事件:

    声明:

    group.AsyncReadComplete +=new

    OPCAutomation .DIOPCGroupEvent_AsyncReadCompleteEventHandler (AsyncReadComplete);

    实现:

    private void AsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref
    
    System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array
    
    Errors)
    
    {}
  • 相关阅读:
    剑指OFFER----面试题37. 序列化二叉树
    剑指OFFER----面试题36. 二叉搜索树与双向链表
    剑指OFFER----面试题35. 复杂链表的复制
    6.深拷贝与浅拷贝
    DevExpress ASP.NET v19.1版本亮点:发布全新的Gantt控件
    MFC界面库BCGControlBar v30.1新功能详解:Dialogs和Forms
    Kendo UI for jQuery使用教程:支持Web浏览器
    DevExpress Windows 10 v19.1新版亮点:UWP控件新功能全面解析
    Java 11必掌握的8大特性,完美代码信手拈来
    Kendo UI for jQuery使用教程:入门指南
  • 原文地址:https://www.cnblogs.com/qq458978/p/9789562.html
Copyright © 2011-2022 走看看