如何在C中实现OPC数据访问.docx

上传人:b****7 文档编号:16402682 上传时间:2023-07-13 格式:DOCX 页数:33 大小:32.94KB
下载 相关 举报
如何在C中实现OPC数据访问.docx_第1页
第1页 / 共33页
如何在C中实现OPC数据访问.docx_第2页
第2页 / 共33页
如何在C中实现OPC数据访问.docx_第3页
第3页 / 共33页
如何在C中实现OPC数据访问.docx_第4页
第4页 / 共33页
如何在C中实现OPC数据访问.docx_第5页
第5页 / 共33页
如何在C中实现OPC数据访问.docx_第6页
第6页 / 共33页
如何在C中实现OPC数据访问.docx_第7页
第7页 / 共33页
如何在C中实现OPC数据访问.docx_第8页
第8页 / 共33页
如何在C中实现OPC数据访问.docx_第9页
第9页 / 共33页
如何在C中实现OPC数据访问.docx_第10页
第10页 / 共33页
如何在C中实现OPC数据访问.docx_第11页
第11页 / 共33页
如何在C中实现OPC数据访问.docx_第12页
第12页 / 共33页
如何在C中实现OPC数据访问.docx_第13页
第13页 / 共33页
如何在C中实现OPC数据访问.docx_第14页
第14页 / 共33页
如何在C中实现OPC数据访问.docx_第15页
第15页 / 共33页
如何在C中实现OPC数据访问.docx_第16页
第16页 / 共33页
如何在C中实现OPC数据访问.docx_第17页
第17页 / 共33页
如何在C中实现OPC数据访问.docx_第18页
第18页 / 共33页
如何在C中实现OPC数据访问.docx_第19页
第19页 / 共33页
如何在C中实现OPC数据访问.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

如何在C中实现OPC数据访问.docx

《如何在C中实现OPC数据访问.docx》由会员分享,可在线阅读,更多相关《如何在C中实现OPC数据访问.docx(33页珍藏版)》请在冰点文库上搜索。

如何在C中实现OPC数据访问.docx

如何在C中实现OPC数据访问

如何在C#中实现OPC数据访问.txt41滴水能穿石,只因为它永远打击同一点。

42火柴如果躲避燃烧的痛苦,它的一生都将黯淡无光。

本文由zxx1987187贡献

pdf文档可能在WAP端浏览体验不佳。

建议您优先选择TXT,或下载源文件到本机查看。

如何在C#中实现OPC数据访问

HowtoaccomplishdataaccessingthroughOPCbyC#Getting-startedEdition(2009年03月>

摘要本文主要讲述了在C#语言环境下,编程实现通过SimaticNet提供的OPCServer,访问PLC中数据的步骤。

此方法同样适用于WinCC作为OPCServer时的数据访问。

关键词SimaticNet、C#、OPC、WinCCKeyWordsSimaticNet、C#、OPC、WinCC

IA&DTService&Support

Page2-47

如何在C#中实现OPC数据访问……11、概述……41.1OPC介绍……41.2OPC的读写方式……51.3OPC访问接口方式……62、测试环境……72.1硬件要求……72.2软件要求……73、OPCServer端组态配置……74、采用自定义接口过程……94.1同步读写……94.2异步读写……125、采用自动化接口实现过程……196、OPCItem的数据类型……237、小结……238、代码……238.1自动化接口……238.2自定义接口同步读写……288.3自定义接口异步读写……34

IA&DTService&Support

Page3-47

1、概述1.1OPC介绍OPC是ObjectLinkingandEmbedding

OPC以OLE/COM/DCOM技术为基础,采用客户/服务器模式,为工业自动化软件面向对象的开发提供了统一的标准,这个标准定义了应用Microsoft操作系统在基于PC的客户机之间交换自动化实时数据的方法,采用这项标准后,硬件开发商将取代软件开发商为自己的硬件产品开发统一的OPC接口程序,而软件开发者可免除开发驱动程序的工作,充分发挥自己的特长,把更多的精力投入到其核心产品的开发上。

SimaticNet是西门子全集成自动化系统中的一个重要组成部分,它为完善的工业自动化控制系统的通讯提供部件和网络,同时提供多个OPCServer,为数据的外部访问提供接口,本文主要以OPC.SimaticNET为例说明。

图1:

SimatcicNet提供的OPCServer采用不同的通信方式,通过OPC.SimaticNET,现场数据可以方便地提供给用户:

OPCClient……OPCClient

OPC.SimaticNET

DPSNMPPNIO……

图2:

多种数据提供方式

IA&DTService&Support

Page4-47

1.2OPC的读写方式在实际使用中,主要包括对现场数据的读写操作。

OPC读数有三种方式:

同步、异步、订阅。

同步通讯时,OPC客户程序向OPC服务器进行请求时,OPC客户程序必须等到OPC服务器对应的响应全部完成以后才能返回,在此期间OPC客户程序一直处于等待状态,若进行读操作,那么必须等待OPC服务器响应后才返回。

因此在同步通讯时,如果有大量数据进行操作或者有很多OPC客户程序对OPC服务器进行读操作,必然造成OPC客户程序的阻塞现象。

因此同步通讯适用于OPC客户程序较少,数据量较小时的场合。

clientmyGroup.SynchRead(>Call

server

Reply

图3OPC同步读写服务器-客户端数据流图异步通讯时,OPC客户程序对服务器进行请求时,OPC客户程序请求后立刻返回,不用等待OPC服务器的响应,可以进行其它操作。

OPC服务器完成响应后再通知OPC客户程序,如进行读操作,OPC客户程序通知OPC服务器后离开返回,不等待OPC服务器的读完成,而OPC服务器完成读后,会自动的通知OPC客户程序,把读结果传送给OPC客户程序。

因此相对于同步通讯,异步通讯的效率更高。

clienmyGroup.AsyncRead(Cal

serve

ReplmyGroup_AsyncReadComplete(

图4OPC异步读服务器-客户端数据流图

IA&DTService&SupportPage5-47

订阅方式时,OPC客户程序对服务器进行请求时,OPC客户程序操作后立刻返回,不用等待OPC服务器的操作,可以进行其它操作,OPC服务器的Group组在组内有数据发生改变时,自动根据更新周期刷新相应的客户端数据,如下图,客户端只向OPC服务发送一次请求,之后不再对服务器请求。

clientmyGroup.IsSubscribed

server

SubscribeNotify

myGroup_DataChange(>NotifymyGroup_DataChange(>

图5OPC同步读服务器-客户端数据流图OPC写数有两种方式:

同步、异步。

区别与上面讲的机制一样,在生产应用中,如果写数据参与控制,一般采用同步方式。

1.3OPC访问接口方式OPC主要包含两种接口:

CUSTOM标准接口和OLE自动化标准接口,自定义接口是服务商必须提供的,而自动化接口则是可选的。

自定义接口是一组COM接口,主要用于采用C++语言的应用程序开发;自动化接口是一组OLE接口,主要用于采用VB,DELPHI,Excel等基于脚本编程语言的应用程序开发。

图6自定义接口和自动化接口

IA&DTService&SupportPage6-47

许多OPC服务器,包括OPC.SimaticNet,是在COM平台开发的,从而对于基于.NET框架下的C#语言,作为客户端程序语言访问OPCServer,需要解决两个平台间无缝迁移的问题。

OPC基金会对会员提供了OpcRcw动态链接库,OPCNETCOM包装器和OPCNETAPI,将OPC复杂的规范封状成简单易用的C#类,可以比较容易地实现数据访问。

本文中通过实验,逐步讲解了通过C#编写客户端程序,访问OPC.SimaticNet,对PLC数据进行读写的实现过程。

自定义接口及自动化接口都进行了测试,但基于C#的语言特性,建议采用自定义接口访问,同时有很多OPCServer服务商,对外是不提供自动化接口的,西门子的SimaticNet及WinCC的OPCServer都提供自动化接口。

2、测试环境2.1硬件要求采用400系列PLC,通过以太网连接到安装有simaticNet的计算机上。

computer:

windows2003server192.168.0.102CPU:

CPU414-3PN416-3FR05-0AB0192.168.0.12.2软件要求computer:

S2007Visualstudio2005Step7V5.4SP43、OPCServer端组态配置

IA&DTService&Support

Page7-47

在CPU中定义DB块:

DB10

配置PCStation,参考其它文档。

如上图建立连接S7_connection_1,然后在OPCScout测试连接的正确性。

IA&DTService&Support

Page8-47

从上面可以看到数据访问都是正常的。

4、采用自定义接口过程4.1同步读写建立同步读写工程:

Sync_RW

测试中,对db10.dbw0及db10.dbw2读写操作,在Form窗口做如下设计:

ControlButton:

Button:

Button:

Button:

nameBtn_ConnBtn_ReadBtn_WriteBtn_DisConnTextConnReadWritedisConn

IA&DTService&Support

Page9-47

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

Txt_R1_ValueTxt_R1_QualityTxt_R1_TimeStampTxt_R2_ValueTxt_R2_QualityTxt_R2_TimeStampTxt_W1Txt_W2Txt_WriteStatus

第一步,添加下面命名空间:

<首先需要在工程中添加相应的引用)

usingOpcRcw.Comn。

usingOpcRcw.Da。

第二步,定义OPC相关变量,

OpcRcw.Da.IOPCServerSrverObj。

//定义OPCServer对象OpcRcw.Da.IOPCSyncIOIOPCSyncIO2Obj=null。

//同步读对象OpcRcw.Da.IOPCGroupStateMgtIOPCGroupStateMgtObj=null。

//管理OPCGroup组对象internalconstintLOCALE_ID=0x407。

//OPCServer语言码-英语ObjectMyobjGroup1=null。

//OPCGroup对象int[]ItemServerHandle。

//Item句柄数组intpSvrGroupHandle=0。

//OPCGroup句柄

第三步,连接OPCServer,建立相应OPCGroup组,并添加需要读写的Item

privatevoidBtn_Conn_Click(objectsender,System.EventArgse>{……//定义变量

IA&DTService&Support

Page10-47

svrComponenttyp=Type.GetTypeFromProgID("OPC.SimaticNet","192.168.0.102">。

ServerObj=(OpcRcw.Da.IOPCServer>Activator.CreateInstance(svrComponenttyp>。

//"OPC.SimaticNet","192.168.0.102"是OPCServer名称及所在computer地址//CreateInstance创建一个OPCSerer的实例ServerObj.AddGroup(……>//增加相应的组,定义组的特性,并输出组的句柄IOPCSyncIO2Obj=(IOPCSyncIO>MyobjGroup1。

//为组同步读写定义句柄IOPCGroupStateMgtObj=(IOPCGroupStateMgt>MyobjGroup1。

//组管理对象ItemArray[0].szAccessPath=""。

ItemArray[0].szItemID="S7:

[S7connection_1]DB10,INT0"。

//地址,不同数据类型表示方法不同ItemArray[0].bActive=1。

//是否激活ItemArray[0].hClient=1。

//标示ID,不同的Item不一样ItemArray[0].dwBlobSize=0。

ItemArray[0].pBlob=IntPtr.Zero。

ItemArray[0].vtRequestedDataType=2。

……((OpcRcw.Da.IOPCItemMgt>MyobjGroup1>.AddItems(2,ItemArray,outpResults,outpErrors>。

//将定义的OPCTtem加入组内,注意数量……}

这里需要注意两个地方,对于hClient每个Item是不一样的。

根据读写的数据类型,需更改vtRequestedDataType的值,具体区分在后面说明。

第四步,同步读数据

privatevoidBtn_Read_Click(objectsender,EventArgse>{IOPCSyncIO2Obj.Read(OPCDATASOURCE.OPC_DS_DEVICE,2,ItemServerHandle,outpItemValues,outpErrors>。

//读数据……Txt_R1_Value.Text=String.Format("{0}",pItemState[0].vDataValue>。

//读值Txt_R1_Quality.Text=GetQuality(pItemState[0].wQuality>。

//质量码DateTimedt=ToDateTime(pItemState[0].ftTimeStamp>。

Txt_R1_TimeStamp.Text=dt.ToString(>。

//读取时间}

在这里要注意pItemValues返回指向值信息的指针,要通过OPCITEMSTATE[]pItemState获得信息,其中OPCITEMSTATE是一个结构体,包含值,质量码,时间等。

publicstructOPCITEMSTATE{publicFILETIMEftTimeStamp。

publicinthClient。

IA&DTService&Support

Page11-47

publicobjectvDataValue。

publicshortwQuality。

publicshortwReserved。

}

第五步,同步写数据

privatevoidBtn_Write_Click(objectsender,EventArgse>{……IOPCSyncIO2Obj.Write(2,ItemServerHandle,values,outpErrors>。

……

}

这里注意,如果数据类型不正确,数据是不能正确写入的。

第六步,注销相应实例

privatevoidBtn_Disconn_Click(objectsender,EventArgse>{……}

参考第8节代码。

4.2异步读写注意,订阅也是异步方式。

建立异步读写工程

测试中,对db10.dbw0及db10.dbw2读写操作,在Form窗口做如下设计:

Control

IA&DTService&Support

name

Text

Page12-47

Button:

Button:

Button:

Button:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

TextBox:

Btn_ConnBtn_ReadBtn_WriteBtn_DisConnTxt_R1_ValueTxt_R1_Quality

ConnReadWritedisConn

Txt_R1_TimeStampTxt_R2_ValueTxt_R2_QualityTxt_R2_TimeStampTxt_R3_ValueTxt_R3_QualityTxt_R3_TimeStampTxt_R4_ValueTxt_R4_QualityTxt_R4_TimeStampTxt_W1Txt_W2Txt_WriteStatus

CheckBox:

CHK_Btn

IA&DTService&Support

Page13-47

第一步,添加下面命名空间:

<首先需要在工程中添加相应的引用)

usingOpcRcw.Comn。

usingOpcRcw.Da。

第二步,定义OPC相关变量

OpcRcw.Da.IOPCServerSrverObj。

//定义OPCServer对象OpcRcw.Da.IOPCAsyncIO2IOPCAsyncIO2Obj=null。

//异步读对象OpcRcw.Da.IOPCGroupStateMgtIOPCGroupStateMgtObj=null。

//管理OPCGroup组对象IConnectionPointContainerpIConnectionPointContainer=null。

//异步事件点IConnectionPointpIConnectionPoint=null。

//internalconstintLOCALE_ID=0x407。

//OPCServer语言码-英语ObjectMyobjGroup1=null。

//OPCGroup对象int[]ItemServerHandle。

//Item句柄数组intpSvrGroupHandle=0。

//OPCGroup句柄Int32dwCookie=0。

//thisclient'ssink

第三步,连接OPCServer,建立相应OPCGroup组,并添加需要读写的Item

privatevoidBtn_Conn_Click(objectsender,System.EventArgse>{……//定义变量svrComponenttyp=Type.GetTypeFromProgID("OPC.SimaticNet","192.168.0.102">。

ServerObj=(OpcRcw.Da.IOPCServer>Activator.CreateInstance(svrComponenttyp>。

//"OPC.SimaticNet","192.168.0.102"是OPCServer名称及所在computer地址//CreateInstance创建一个OPCSerer的实例ServerObj.AddGroup(……>//增加相应的组,定义组的特性,并输出组的句柄IOPCAsyncIO2Obj=(IOPCAsyncIO2>MyobjGroup1。

//为组异步读写定义句柄IOPCGroupStateMgtObj=(IOPCGroupStateMgt>MyobjGroup1。

//组管理对象与同步不同,考虑增加如下语句:

pIConnectionPointContainer=(IConnectionPointContainer>MyobjGroup1。

//定义特定组的异步调用连接Guidiid=typeof(IOPCDataCallback>.GUID。

//为所有的异步调用创建回调pIConnectionPointContainer.FindConnectionPoint(refiid,outpIConnectionPoint>。

//为OPCServer的连接点与客户端接收点之间建立连接pIConnectionPoint.Advise(this,outdwCookie>。

ItemArray[0].szAccessPath=""。

ItemArray[0].szItemID="S7:

[S7connection_1]DB10,INT0"。

//地址,不同数据类型表示方法不同ItemArray[0].bActive=1。

//是否激活ItemArray[0].hClient=1。

//标示ID,不同的Item不一样ItemArray[0].dwBlobSize=0。

ItemArray[0].pBlob=IntPtr.Zero。

IA&DTService&Support

Page14-47

ItemArray[0].vtRequestedDataType=2。

……((OpcRcw.Da.IOPCItemMgt>MyobjGroup1>.AddItems(4,ItemArray,outpResults,outpErrors>。

//将定义的OPCTtem加入组内,注意数量……}

这里同样需要注意两个地方,对于hClient每个Item是不一样的。

根据读写的数据类型,需更改vtRequestedDataType的值,定义如上文。

另外,要注意理解异步调用时的服务器与客户端反馈关系。

第四步,异步读数据方式

privatevoidbtn_Read_A_Click(objectsender,System.EventArgse>{……IOPCAsyncIO2Obj.Read(4,ItemServerHandle,2,outnCancelid,outpErrors>。

//异步读,nCancelid、dwTransactionID都是为了客户端服务器的对应……}

调用异步读回调函数

publicvirtualvoidOnReadComplete(System.Int32dwTransid,System.Int32hGroup,System.Int32hrMasterquality,System.Int32hrMastererror,System.Int32dwCount,int[]phClientItems,//读数据句柄object[]pvValues,//返回值short[]pwQualities,//返回质量码OpcRcw.Da.FILETIME[]pftTimeStamps,//返回时间戳int[]pErrors>//错误码{……Txt_R1_Value.Text=String.Format("{0}",pvValues[0]>。

Txt_R1_Quality.Text=GetQuality(pwQualities[0]>。

DateTimedt=ToDateTime(pftTimeStamps[0]>。

Txt_R1_TimeStamp.Text=dt.ToString(>。

……}

编译执行,程序会几方面的报错。

第五步,订阅方式读回调函数及实现COM映射上面程序会有以下几种情况的报错:

IA&DTService&SupportPage15-47

问题1:

程序执行后,弹出如下错误,Addgroup报错

主要原

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2