关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题

摘要:
我使用OPCDAAuto。dll,版本2.2.5.30。Internet上也有相关的DEMO示例,但我们都使用VBNET,VB比C#开发得更频繁。即使有,代码也写得很混乱,而且没有使用注意事项。我用C#开发了它,但它还处于实验阶段。接下来,我计划构建一个公司内部通用的DLL。测试完成后,注意事项如下:使用SyncRead和AsyncRead读取服务数据的原始c#代码:SyncRead;异步读取;您可以看到,这两个函数中都有一个refArrayServerHandles。如果我们将参数传递给函数,我们将其写为:int[]handle=newint[]{item.ServerHandle};系统ArrayServerHandles=句柄;此时,将出现“参数不正确”的错误异常。

为了能够在工作中方便的应用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)几点注意问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇爬虫之Selenium模块Linux下游戏大作赏析(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c# 图片保存为流Stream,再次加载时提示System.ArgumentOutOfRangeException: 要求非负数的解决办法

c# 图片保存为流Stream,再次加载时提示System.ArgumentOutOfRangeException: 要求非负数的解决办法 保存为流的时候,用下面的代码 imgstream.Seek(0, System.IO.SeekOrigin.Begin); MemoryStream imgstream = new MemoryStream(); im...

IntelliJ IDEA修改系统缓存目录

IntelliJ IDEA修改系统缓存目录 博客分类:intellij IDEA使用 IntelliJ IDEAIDEA缓存  阅读更多 intellij IDEA在第一次启动时,会在${user.home}目录下建立以.IntelliJIdea开头的文件夹,用来存放IDEA的配置信息、插件和缓存信息。随着工具使用时间越多,这个文件夹会越来越大...

cors 处理OPTIONS verb

配置需要加上 runAllManagedModulesForAllRequests = true   <system.webServer>     <modules  runAllManagedModulesForAllRequests="true">    </modules>  </system.webServ...

oracle expdp/impdp 用法详解

http://hi.baidu.com/hzfsai/item/4a4b3fc4b1cf7e51ad00efbd oracle expdp/impdp 用法详解 Data Pump 反映了整个导出/导入过程的完全革新。不使用常见的 SQL 命令,而是应用专用 API(direct path api etc) 来以更快得多的速度加载和卸载数据。1.Data...

systemctl java jar 添加jar文件开机启动项

转载自:https://blog.csdn.net/slqgenius/article/details/85778578 一,原由 因为使用 nohup 和 & 这种方式启动jar包的话,只会放在后台里面执行,如果某天,人为或机器故障等原因,触发重启了。那样程序就会关闭,不清楚系统的人,可能都不知道这个需要启动。 所以,这里使用Centos7系统...

系统禁用执行FIPS政策导致程序发生“调用的目标发生了异常”

工具是使用AES-256-CBC加密算法  问题 最近有客户反映, 在使用我们工具时候,会出现“调用的目标发生了异常”错误, 接到反馈之后, 我们进行了很多测试,甚至得到客户系统信息和framework版本, 但是都没有得到复现。测试,debug,log打印各种尝试,无果。 **报错信息显示:**  导致错误信息 : 调用的目标发生了异常。 导致错误的方法...