关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题
2009-02-12 13:19
791 查看
http://download.csdn.net/user/lsjwq
前些天,自己用C#做了一个OPC开发服务端的组件(http://blog.csdn.net/lsjwq/archive/2009/02/08/3868536.aspx).
为了能够在工作中方便的应用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,outErrors,out Qualities,out
TimeStamps);
AsyncRead(int NumItems,ref Arrray ServerHandles,outErrors,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)
{}
刚刚学习客户端开发,把遇到的问题整理一下,做一下笔记,同时也供大家一起学习。革命尚未成功,同志仍需努力!
网名:唯笑志在
QQ:504547114
DotNet 改善程序代码 群:54256083
前些天,自己用C#做了一个OPC开发服务端的组件(http://blog.csdn.net/lsjwq/archive/2009/02/08/3868536.aspx).
为了能够在工作中方便的应用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,outErrors,out Qualities,out
TimeStamps);
AsyncRead(int NumItems,ref Arrray ServerHandles,outErrors,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)
{}
刚刚学习客户端开发,把遇到的问题整理一下,做一下笔记,同时也供大家一起学习。革命尚未成功,同志仍需努力!
网名:唯笑志在
QQ:504547114
DotNet 改善程序代码 群:54256083
相关文章推荐
- 关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题
- 关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题
- 关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题
- 关于接口的定义和使用,几点需要注意的问题
- 关于jdbc编程的几点需要注意的地方
- 关于android的JNI几点注意问题。
- 关于接口的几点问题
- 关于多普达手机上WIFI和GPRS的设置问题注意几点
- 关于项目研发重要接口需要注意的问题
- 关于SSM框架整合Spring与Mybaitis面向接口编程时,多个不同包别名设置,多个dao层包通配符表达处理问题
- 关于 进程共享dll全局数据应注意的问题
- 关于写接口返回值应该注意的问题。
- 关于C#与Delphi DLL调用及回调问题注意事项
- 关于Session接口的update方法主要有如下几点要注意
- 关于CI框架加入sphinx官方API接口文件的时候,需要注意的问题
- 关于闭包要注意的几点问题
- 关于DLL接口处传入string类型在其析构时报堆损坏的问题
- 关于vs2010下编译dll动态库,JNA接口在java中调用的问题
- niagara编程中需要注意的几点问题
- 使用std::string 通过dll接口传递时,应该注意的问题