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)
    
    {}
  • 相关阅读:
    wex5 实战 框架拓展之2 事件派发与data刷新
    wex5 实战 框架拓展之1 公共data组件(Data)
    wex5 实战 HeidiSQL 导入Excel数据
    wex5 实战 手指触屏插件 hammer的集成与优劣
    wex5 实战 登陆帐号更换与用户id一致性
    wex5 实战 用户点评与提交设计技巧
    wex5 实战 省市县三级联动与地址薄同步
    wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)
    wex5 实战 单页模式下的多页面数据同步
    [BZOJ]4237: 稻草人
  • 原文地址:https://www.cnblogs.com/qq458978/p/9789562.html
Copyright © 2011-2022 走看看