为了能够在工作中方便的应用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)

{}

关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题的更多相关文章

  1. 使用OPCDAAuto.dll编写C# OPC采集程序

    在一台新机器上运行使用OPC自动化接口编写的C#程序报错如下: 索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败,原因是出 ...

  2. 用C#开发基于自动化接口的OPC客户端

    OPC全称是Object Linking and Embedding(OLE) for Process Control,它的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁.OPC作为一 ...

  3. OPCDAAuto.dll的C#使用方法浅析

    上次研究了.Net版本的OPC API dll,这次我采用OPCDAAuto.dll来介绍使用方法.以下为我的源代码,有详细的注释无需我多言.编译平台:VS2008SP1.WINXP.KEPServe ...

  4. OPCDAAuto.dll的C#使用方法浅析(转载)

    上次研究了.Net版本的OPC API dll,这次我采用OPCDAAuto.dll来介绍使用方法.以下为我的源代码,有详细的注释无需我多言.编译平台:VS2008SP1.WINXP.KEPServe ...

  5. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  6. 【干货】如何通过OPC自定义接口来实现客户端数据的读取?

    上篇博文分享了我的知识库,被好多人关注,受宠若惊.今天我把我在项目中封装的OPC自定义接口的程序分享一下.下面将会简单简单介绍下OPC DA客户端数据访问,以及搭配整个系统的运行环境. OPC(OLE ...

  7. SAP接口编程 之 JCo3.0系列(01):JCoDestination

    SAP接口编程 之 JCo3.0系列(01):JCoDestination 字数2101 阅读103 评论0 喜欢0 JCo3.0是Java语言与ABAP语言双向通讯的中间件.与之前1.0/2.0相比 ...

  8. C语言与MATLAB接口 编程与实例 李传军编着

    罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...

  9. OPCDAAuto.dll 的一个坑

    最近项目需要对SCADA系统的下位机采集实时数据,常见做法是两种,一种采用ModBus RTU/TCP协议直接通过支持ModBus的下位机通信,一种是通过OPC规范,使用厂商提供的OPC Server ...

随机推荐

  1. springMVC @ModelAttribute学习

    springMVC @ModelAttribute学习 博客分类: Spring   @ModelAttribute 绑定请求参数到命令对象 @ModelAttribute一个具有如下三个作用: ①绑 ...

  2. GridView右键菜单

    一.添加右键菜单 1.在VS工具箱中的“菜单和工具栏”找到ContextMenuStrip控件,双击添加. 2.点击ContextMenuStrip右上方的小三角形,打开编辑项,可以添加菜单项.至于菜 ...

  3. 《Computational Statistics with Matlab》硬译

    第1章 从随机变量采样 研究者提出的概率模型对于分析方法来说通常比较复杂,研究者处理复杂概率模型时越来越依赖计算.数值方法,通过使用计算方法,研究者就不用对一些分析技术做一些不现实的假设(如正态性和独 ...

  4. MSSQL2005数据库显示单一用户模式,无法进行任何操作

    MSSQL2005数据库显示单一用户模式,无法进行任何操作 经查询,使用exec sp_who进行查看链接线程,发现仍然有链接不断进行请求,将链接踢出,然后通过命令修复即可恢复 处理步骤: exec ...

  5. JavaScript 兼容各大浏览器阻止冒泡事件

    JavaScript 兼容各大浏览器阻止冒泡事件 function stopEvent(event) { //阻止冒泡事件 //取消事件冒泡 var e = arguments.callee.call ...

  6. ssh整合学习(1)

    Hibernate框架 1 hibernate核心配置文件 (0)orm思想 -对象关系映射 (1)数据库信息 (2)hibernate信息 (3)映射配置 (4)hibernate核心配置文件 -如 ...

  7. JVM安全退出(如何优雅的关闭java服务)

    https://tech.imdada.cn/2017/06/18/jvm-safe-exit/?utm_source=tuicool&utm_medium=referral 背景 用户:货都 ...

  8. 【C#基本功】1》panel的C#用法 panel

    上面截图是panel在labview中的用法,在labview中panel加动态调用技术可以解决很多难题. 对于刚刚接触C#的我来说,如何实现pannel动态加载界面,也是一个必须首要克服的难点. 经 ...

  9. git一个系列教程

    https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%BA%8E%E7%89%88%E6%9C%AC%E6%8E%A7%E5%8 ...

  10. 记录个人数组、字符串自己常忘记的方法,以及ES常用处理方式

    记录自己在工作中,时不时使用,每次都要去查一下的基础方法.以及ES6经常使用的方法 一.Array 1.concat 合并数组 2.shift 获取数组第一个元素 unshift 向数组首位添加一个元 ...