关于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)
{}
关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题的更多相关文章
- 使用OPCDAAuto.dll编写C# OPC采集程序
在一台新机器上运行使用OPC自动化接口编写的C#程序报错如下: 索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败,原因是出 ...
- 用C#开发基于自动化接口的OPC客户端
OPC全称是Object Linking and Embedding(OLE) for Process Control,它的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁.OPC作为一 ...
- OPCDAAuto.dll的C#使用方法浅析
上次研究了.Net版本的OPC API dll,这次我采用OPCDAAuto.dll来介绍使用方法.以下为我的源代码,有详细的注释无需我多言.编译平台:VS2008SP1.WINXP.KEPServe ...
- OPCDAAuto.dll的C#使用方法浅析(转载)
上次研究了.Net版本的OPC API dll,这次我采用OPCDAAuto.dll来介绍使用方法.以下为我的源代码,有详细的注释无需我多言.编译平台:VS2008SP1.WINXP.KEPServe ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- 【干货】如何通过OPC自定义接口来实现客户端数据的读取?
上篇博文分享了我的知识库,被好多人关注,受宠若惊.今天我把我在项目中封装的OPC自定义接口的程序分享一下.下面将会简单简单介绍下OPC DA客户端数据访问,以及搭配整个系统的运行环境. OPC(OLE ...
- SAP接口编程 之 JCo3.0系列(01):JCoDestination
SAP接口编程 之 JCo3.0系列(01):JCoDestination 字数2101 阅读103 评论0 喜欢0 JCo3.0是Java语言与ABAP语言双向通讯的中间件.与之前1.0/2.0相比 ...
- C语言与MATLAB接口 编程与实例 李传军编着
罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...
- OPCDAAuto.dll 的一个坑
最近项目需要对SCADA系统的下位机采集实时数据,常见做法是两种,一种采用ModBus RTU/TCP协议直接通过支持ModBus的下位机通信,一种是通过OPC规范,使用厂商提供的OPC Server ...
随机推荐
- Effective C++ 条款01:视C++为一个语言联邦
四个次语言 C Object-Oriented C++ Template C++ STL
- HBase 协处理器编程详解,第二部分:客户端代码编写
实现 Client 端代码 HBase 提供了客户端 Java 包 org.apache.hadoop.hbase.client.coprocessor.它提供以下三种方法来调用协处理器提供的服务: ...
- 将 sql 数据库 编码 改成 Chinese_PRC_CS_AS
use master go ) drop procedure [dbo].[p_killspid] GO create proc p_killspid ) --要关闭进程的数据库名 as ) ) de ...
- html checkbox多选框语法与结构
<input name="Fruit" type="checkbox" value="" /> 用法用例 <foreach ...
- php源码之appveyor
打开appveyor目录 是4个bat文件 1. .bat是什么? bat文件是dos下的批处理文件.批处理文件是无格式的文本文件,它包含一条或多条命令. 它的文件扩展名为.bat或.cmd 在命令提 ...
- server_2003_r2_standard_sp2_vl_X13-46532
1. 安装的是 cn_win_srv_2003_r2_standard_with_sp2_vl_cd1_X13-46532.iso CD2 它没有要求装 也就没装,貌似 网上搜到 安装CD2需要另外的 ...
- php中POST与GET区别
如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题.我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用. 这个答案好像并不是他想要的.于是他继 ...
- php将科学计算法得出的结果转换成原始数据
由于php最大只支持显示 15位因的数据运算,大于15位的2数加减乘除的数据的结果,会直接用科学计数法显示, 但在现实生活中,科学计数法不利于普通人识别,所以,本函数将:科学计数法的出的结果转换成原始 ...
- golang采坑记 一(http与json)
http服务端在把json串写入http.ResponseWriter对象的时候我们常用的方式如下: //方法一: func ...(w http.ResponseWriter, r *http.Re ...
- 005——VUE中的v-text与v-html的使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...