为了能够在工作中方便的应用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. PC软件开发技术之二:用C#开发基于自动化接口的OPC客户端

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

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

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

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

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

  4. 使用OPC DA接口将robotdtudio与西门子sim进行仿真连接

    使用OPC DA接口将robotdtudio与西门子sim进行仿真连接 简介 使用软件 博途TIA V16 RobotStudio 6.01 ABB IRC5 OPC Configuration Ne ...

  5. 面向接口编程,你考虑过性能吗?

    大家在平时开发中大多都会遵循接口编程,这样就可以方便实现依赖注入也方便实现多态等各种小技巧,但这种是以牺牲性能为代价换取代码的灵活性,万物皆有阴阳,看你的应用场景进行取舍. 一:背景 1. 缘由 在项 ...

  6. 手动标记用例状态_【自动化接口用例】从 1 到 1000 过程中的实践和思考

    谢谢打开这篇文章的每个你 关注我们 点击右上角 ··· 设为星标 当一个新人刚加入公司的时候,我们通常告诉新人怎么去写一个自动化用例:从工程配置到如何添加接口.如何使用断言,最后到如何将一个用例运行起 ...

  7. 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程...

    那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些"高深术语"感到过困扰--依赖倒置•控制反转•依赖注入•面向接口编程.也 ...

  8. 【转】那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

    作者:在好 链接:https://www.zhihu.com/question/31021366/answer/102239756 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  9. 浅谈“面向接口编程” :依赖反转 IOC 与 DI (容器控制反转与依赖注入)

    IOC:Inversion of Control Containers and the Dependency Injection "Water" by Andy Huan, Mal ...

最新文章

  1. Android 人民币符号在布局中实现的效果不一样的处理方法
  2. .17-浅析webpack源码之compile流程-入口函数run
  3. mysql用dos窗口即cmd命令登陆mysql
  4. mysql 多项式_多项式拟合和最小二乘问题
  5. linux查看数据积压,查看kafka消息队列的积压情况
  6. 第一百一十九期:支付宝历年双十一背后的技术揭秘
  7. 分布式系统的工程化开发方法
  8. 屏蔽wget下载网站内容
  9. linux进程退出所有tcp数据才发送,深入理解Node.js 进程与线程(8000长文彻底搞懂)...
  10. loj 6085.「美团 CodeM 资格赛」优惠券
  11. python的range和linspace
  12. python无法启动此程序因为_(python shell怎么用)为啥我按照python安装教程,总说无法启动此程序,因为计算机中丢失?...
  13. 李庄 220kV变电站电气部分初步设计
  14. 618当天,90%的程序员在干什么?
  15. Centos7下安装Relion
  16. 北京h5游戏制作平台有哪些,h5游戏公司实例评测
  17. SQL语句预处理防注入——完整版
  18. arm指令bne.w改成b,即无条件跳转
  19. 报错SyntaxError: Unexpected token T in JSON at position 0 at JSON.parse (<anonymous>)的解决方法
  20. 计算机ip地址和用户名和密码是什么,登陆无线路由器的IP地址是多少?怎么查看登录地址...

热门文章

  1. LNMP架构环境搭建之mysql源码编译安装
  2. SpringBoot使用CommandLineRunner和ApplicationRunner项目初始化事件
  3. mysql的hash分区_MySQL中的分区(五)HASH分区
  4. jquery设置表单元素只读_jquery设置元素readonly与disabled属性
  5. 武汉轻工大学计算机学院操作系统复试题目,2016年武汉轻工大学数学与计算机学院计算机组成原理复试考研复试题库...
  6. web图片铺满网页_web单页面实现多个echarts图表铺满整个div(柱状图,折线图,饼形图……)...
  7. 天堂2启动mysql就没了_启用二进制日志文件进行mysql数据恢复
  8. python电影名称词云_python-词云
  9. doc转docx文件会乱吗_Word文档doc与docx的区别
  10. 智能卡门禁管理系统_综合门禁管理信息系统相关技术及未来准备