如何在C#中实现OPC数据访问_第1页
如何在C#中实现OPC数据访问_第2页
如何在C#中实现OPC数据访问_第3页
如何在C#中实现OPC数据访问_第4页
如何在C#中实现OPC数据访问_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、42 火柴如果如何在C#中实现OPC数据访问.txt41滴水能穿石,只因为它永远打击同一点。躲避燃烧的痛苦,它的一生都将黯淡无光。本文由 zxx1987187 贡献如何在How to 年 03 月 ) 摘要pdf 文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。C#中实现OPC数据访问提供的 OPC 时的数据访 WinCC本文主要讲述了在 C# 语言环境下,编程实现通过SimaticNetaccomplish data accessing through OPCby C# Getting-startedEdition (2009Server , 访问 PLC 中数

2、据的步骤。 此方法同样适用于 WinCC 作为 OPCServer 问。 关键词 SimaticNet 、C#、OPC、WinCC Key Words SimaticNet 、C#、OPC、IA&DT Service & SupportPage 2-474 1.2 OPC7如何在C#中实现OPC数据访问”1 1、概述”4 1.1 OPC介绍”的读写方式”5 1.3 OPC访问接口方式”6 2、测试环境”7 2.1硬件要求”19 6 、 OPCItem ,23 8.2 自2.2 软件要求,7 3、 OPCServer 端组态配置,7 4、采用自定义接口过程 ,9 4.1同步读写,9 4.2 异步

3、读写,12 5 、采用自动化接口实现过程 ,的数据类型 ,23 7 、小结 ,23 8 、代码 ,23 8.1 自动化接口定义接口同步读写 ,28 8.3 自定义接口异步读写 ,34IA&DT Service & SupportPage 3-47Process Control1 、概述 1.1 OPC 介绍 OPC 是 Object Linking and Embeddin(g OLE)for的缩写,它是微软 公司的对象链接和嵌入技术在过程控制方面的应用。OPC以OLE/COM/DCOM技术为基 础,采用客户 /服务器模式, 为工业自动化软件面向对象的开发提供了统一的标准, 这个标 准定义了应

4、用 Microsoft 操作系统在基于 PC 的客户机之间交换自动化实时数据的 方法,采 用这项标准后, 硬件开发商将取代软件开发商为自己的硬件产品开发统一的OPC 接口程 序,而软件开发者可免除开发驱动程序的工作, 充分发挥自己的特长, 把更多的精力投 入 到其核心产品的开发上。 SimaticNet 是西门子全集成自动化系统中的一个重要组成部 分,它为完善的工业自动化 控制系统的通讯提供部件和网络, 同时提供多个 OPCServer ,为 数据的外部访问提供接 口,本文主要以 OPC.SimaticNET 为例说明。图 1 :SimatcicNet 提供的 OPCServer 采用不同的通

5、信方式,通过 OPC.SimaticNET , 现场数据可以方便地提供给用户:OPC Client , OPC ClientOPC.SimaticNETDP SNMP PNIO ,图 2 :多种数据提供方式IA&DT Service & SupportPage 4-471.2 OPC 的读写方式 在实际使用中,主要包括对现场数据的读写操作。OPC 读数有三OPC 客户程序一 进行读操作,那么必须等待 OPC 服务器响应后才返回。因此在同步通 据进行操作或者有很多 OPC 客户程序对 OPC 服务器进行读操作, 必然 的阻塞现象。 因此同步通讯适用于 OPC 客户程序较少, 数据量较小时的种方式

6、: 同步、 异步、 订阅。 同步通讯时, OPC 客户程序向 OPC 服务器进行请求时, OPC 客 户程序必须等到 OPC 服务器对应的响应全部完成以后才能返回,在此期间 直处于等待状态,若 讯时,如果有大量数 造成 OPC 客户程序 场合。client myGroup.SynchRead() CallserverReply图3 OPC同步读写服务器-客户端数据流图异步通讯时,OPC客户程序对服务器进行请 求时, OPC 客户程序请求后立刻返回,不 用等待 OPC 服务器的响应,可以进行其它操作。 OPC 服务器完成响应后再通知 OPC 客户 程序,如进行读操作, OPC 客户程序通知 OP

7、C 服务 器后离开返回, 不等待 OPC 服务器的 读完成, 而 OPC 服务器完成读后, 会自动的通知 OPC 客户程序,把读结果传送给 OPC 客 户程序。因此相对于同步通讯,异步通讯的效率更高。clien myGroup.AsyncRead( CalserveRepl myGroup_AsyncReadComplete(图 4 OPC 异步读服务器 - 客户端数据流图IA&DT Service & Support Page 5-47订阅方式时,OPC客户程序对服务器进行请求时,OPC客户程序操作后立刻返回,不服务发送等待 OPC 服务器的操作,可以进行其它操作, OPC 服务器的 Gro

8、up 组在组内有数据发 改变时,自动根据更新周期刷新相应的客户端数据,如下图,客户端只向OPC次请求,之后不再对服务器请求。client myGroup.IsSubscribedserver区别与上 1.3 OPC 自定义接口 自定义接口是一组 COM 接口, 主要用于Subscribe Notify myGroup_DataChange() Notify myGroup_DataChange()自动化接口是一组 OLE 接口,主要用于采用 VB, DELPHI,图5 OPC同步读服务器-客户端数据流图 OPC写数有两种方式:同步、异步。 面讲的机制一样,在生产应用中,如果写 数据参与控制,一

9、般采用同步方式。 问接口方式 OPC主要包含两种接口: CUSTOM标准接口和 OLE自动化标准接口, 是 服务商必须提供的, 而自动化接口则是可选的。 采用 C+ 语言的应用程序开发;Excel 等基于脚本编程语 言的应用程序开发。图 6 自定义接口和自动化接口IA&DT Service & Support Page 6-47许多 OPC 服务器,包括 OPC.SimaticNet ,是在 COM 平台开发的, 从而对于基 于 .NET 框 架下的C#语言,作为客户端程序语言访问OPCServer,需要解决两个平台间无缝迁移的问题。OPC基金会对会员提供了 OpcRcw动态链接库,OPC N

10、ET COM包装器和 OPC NET API, 将OPC复杂的规范封状成简单易用的 C#类,可以比较容易地实现数据访问。本文中通过特性,建议采用自定 口的,西门子的 2.1 硬件要求 采用实验,逐步讲解了通过 C#编写客户端程序,访问OPC.SimaticNet ,对PLC数据进行读写的 实现过程。自定义接口及自动化接口都进行了测试,但基于C#的语言义接口访问,同时有很多 OPCServer 服务商,对外是不提供自动化接 SimaticNet 及 WinCC 的 OPCServer 都提供自动化接口。 2 、测试环境 400系列PLC,通过以太网连接到安装有simaticNet 的计算机上。c

11、omputer : windows 2003server02 CPU : CPU414-3PN416-3FR05-0AB0 2.2 软件要求 computer : S 2007 Visual studio 2005 Step7 V5.4 SP4 3、 OPC Server 端组态配置IA&DT Service & SupportPage 7-47在 CPU 中定义 DB 块: DB10配置 PC Station ,参考 其它文档。如上图建立连接 S7_connection_1 ,然后在 OPC Scout 测试连接的正确性。 IA&DT Servic

12、e & Support Page 8-47从上面可以看到数据访问都是正常的。 步读写项目: Sync_RW4 、采用自定义接口过程 4.1 同步读写 建立同测试中,对 db10.dbw0 及 db10.dbw2 读写操作,在 Form 窗口做如下设计: Control Button: Button: Button: Button: name Btn_Conn Btn_Read Btn_Write Btn_DisConn Text Conn Read Write disConnIA&DT Service & SupportPage 9-47TextBox: TextBox: TextBox: T

13、extBox: TextBox: TextBox: TextBox: TextBox: TextBox: Txt_R1_Value Txt_R1_Quality Txt_R1_TimeStamp Txt_R2_Value Txt_R2_Quality Txt_R2_TimeStamp Txt_W1 Txt_W2 Txt_WriteStatus第一步,添加下面命名空间: (首先需要在项目中添加相应的引用)using OpcRcw.Comn; using OpcRcw.Da; 第二步,定义 OPC 相关变量,OpcRcw.Da.IOPCServer SrverObj;/ 定 义 OPCServer

14、 对 象 OpcRcw.Da.IOPCSyncIO IOPCSyncIO2Obj = null;/ 同 步 读 对 象 OpcRcw.Da.IOPCGroupStateMgt lOPCGroupStateMgtObj = null;/ 管理 OPCGroup组对象 internal const int LOCALE_ID = 0x407;/OPCServer 语言码 - 英语 Object MyobjGroup1 = null;/OPCGroup ItemServerHandle;/Item 句柄数组 int pSvrGroupHandle = 0;/OPCGroup第三步,连接 OPCSer

15、ver ,建立相应 OPCGroup 组,并添加需要读写的private void Btn_Conn_Click(object sender, System.EventArgs e) 变量IA&DT Service & Support Page 10-47svrComponenttyp = Type.GetTypeFromProgID(OPC.SimaticNet, 02); ServerObj = (OpcRcw.Da.IOPCServer)Activator.CreateInstance(svrComponenttyp); /OPC.SimaticNet, 192.1

16、68.0.102 是 OPCServer 名 称及 所 在 computer 地 址 / CreateInstance 创建一个 OPCSerer 的实例 ServerObj.AddGroup( ,)/ 增加相应的组,定义组的特性,并输出组的句柄 IOPCSyncIO2Obj = (IOPCSyncIO)MyobjGroup1; / 为组同步 读写定义句柄 IOPCGroupStateMgtObj = (IOPCGroupStateMgt)MyobjGroup1; / 组管理对象 ItemArray0.szAccessPath=; ItemArray0.szItemIDconnection_1

17、DB10,INT0; / 地址,不同数据类型表示方法不同对象 int句柄Item, / 定义1;/ 是 否 激 活 ItemArray0.hClient = 1;/ 标 示 ID , 不 ItemArray0.dwBlobSize=0; ItemArray0.pBlobItemArray0.vtRequestedDataType=(OpcRcw.Da.IOPCItemMgt)MyobjGroup1).AddItems(2, pErrors); /S7:S7 ItemArray0.bActive = 同 的 Item 不 一 样 = IntPtr.Zero;将定义的 OPCTtem 加入组内,注

18、意数量 对于 hClient 每个 Item 的值,具体区分在后面 Btn_Read_Click(object这里需要注意两个地方,需更改 vtRequestedDataTypeprivatevoid2;ItemArray, , 是不一样的。 说明。out pResults, out根据读写的数据类型,第四步,同步读数据sender, EventArgs IOPCSyncIO2Obj.Read(OPCDATASOURCE.OPC_DS_DEVICE2, ItemServerHandle, pItemValues, out pErrors);/ 读数据 , Txt_R1_Value.Text =

19、 String.Format(0,e)out值 Txt_R1_Quality.Text 质 量 码 DateTime dt Txt_R1_TimeStamp.Text = dt.ToString();/pItemState0.vDataValue);/GetQuality(pItemState0.wQuality);/ ToDateTime(pItemState0.ftTimeStamp); 读取时间 在这里要 注意 pItemValues 返回指向值信息 的指针,要通 过 OPCITEMSTATE pItemState 获得信息,其中 OP CITEMSTATE是一个结构体,包含值,质量码,

20、时间 等。public struct OPCITEMSTATE public FILETIME ftTimeStamp; public int hClient;IA&DT Service & SupportPage 11-47public object vDataValue; public short wQuality; public short wReserved; 第五步,同步写数据e) privatevoid Btn_Write_Click(objectsender, EventArgsIOPCSyncIO2Obj.Write(2, ItemServerHandle, values, o

21、ut pErrors);第六步,注销相应实例, 这里注意,如果数据类型不正确,数据是不能正确写入的。private void Btn_Disconn_Click(object sender, EventArgs e) 参考第 8 节代码。 4.2 异步读写 注意,订阅也是 异步方式。 建立异步读写项目 测试中,对 db10.dbw0 及 db10.dbw2 读写操作,在 Form 窗口做如下设计: ControlIA&DT Service & SupportnameTextPage 12-47Button: Button: Button: Button: TextBox: TextBox: T

22、extBox: TextBox: TextBox:TextBox: TextBox: TextBox: TextBox: TextBox: TextBox: TextBox: TextBox: TextBox:TextBox:Btn_Conn Btn_Read Btn_Write Btn_DisConn Txt_R1_Value Txt_R1_QualityConn Read Write disConnTxt_R2_TimeStamp Txt_R3_ValueTxt_R4_Quality Txt_R4_TimeStampTxt_R2_QualityTxt_R4_ValueTxt_R1_Time

23、Stamp Txt_R2_Value Txt_R3_Quality Txt_R3_TimeStamp Txt_W1 Txt_W2 Txt_WriteStatusCheckBox: CHK_BtnIA&DT Service & SupportPage 13-47 第一步,添加下面命名空间: (首先需要在项目中添加相应的引用)using OpcRcw.Comn; using OpcRcw.Da; 第二步,定义 OPC 相关变量- 英语 Object 句柄数组 intOpcRcw.Da.IOPCServer SrverObj;/ 定义 OPCServer 对象 OpcRcw.Da.IOPCAsync

24、IO2 IOPCAsyncIO2Obj = null;/ 异 步 读 对 象 OpcRcw.Da.IOPCGroupStateMgt IOPCGroupStateMgtObj = null;/ 管 理 OPCGroup 组 对 象 IConnectionPointContainer pIConnectionPointContainer = null;/ 异步事件点 IConnectionPoint pIConnectionPoint = null;/ internal const int LOCALE_ID = 0x407;/OPCServer语言码ItemMyobjGroup1 = null

25、;/OPCGroup 对象 int ItemServerHandle;/Item pSvrGroupHandle = 0;/OPCGroup 句柄 Int32 dwCookie = 0; /this clients sink 第三步,连接 OPCServer ,建立相应 OPCGroup 组,并添加需要读写的private void Btn_Conn_Click(object sender, System.EventArgs e) , / 定义变量 svrComponenttyp = Type.GetTypeFromProgID(OPC.SimaticNet, 02);

26、ServerObj = (OpcRcw.Da.IOPCServer)Activator.CreateInstance(svrComponenttyp); /OPC.SimaticNet, 02 是 OPCServer 名 称 及 所 在 computer 地 址 / CreateInstance 创建一个 OPCSerer 的实例 ServerObj.AddGroup( , )/ 增加相应的组, 定义组的特性,并输出组的句柄IOPCAsyncIO2Obj = (IOPCAsyncIO2)MyobjGroup1; /为组异步读写定义句柄 IOPCGroupStateMgtO

27、bj = (IOPCGroupStateMgt)MyobjGroup1; /组管理对 象 与 同 步 不 同 , 考 虑 增 加 如 下 语 句 :pIConnectionPointContainerGuid iid = 为所有的异步调用创建回 iid, out pIConnectionPoint);接收点之间建立连ItemArray0.szAccessPath =调/ 接HH.与客户端 out dwCookie); connection_1DB10,INT0; / 地址,不同数据类型表示 是否激活 ItemArray0.hClient = 1;/标示 ID ,不同的 Item 不一样 Ite

28、mArray0.dwBlobSize = 0; ItemArray0.pBlob = IntPtr.Zero;IA&DT Service & SupportPage 14-47 ItemArray0.vtRequestedDataType = (OpcRcw.Da.IOPCItemMgt)MyobjGroup1).AddItems(4, pErrors); / 将定义的 OPCTtem 加入组内,注意数量 这里同样需要注意两个地方,对于 hClient 每个Item2; , , ItemArray, out pResults, out 是不一样的。 根据读写的数据另外,要注意理解异步调用时的类

29、型,需更改 vtRequestedDataType 的值,定义如上文。 服务器与客户端反馈关系。 第四步,异步读数据方式private void btn_Read_A_Click(object sender, IOPCAsyncIO2Obj.Read(4,ItemServerHandle,2,out nCancelid,out pErrors); /System.EventArgse) , , 异步读,(IConnectionPointContainer)MyobjGroup1; / 定义特定组的异步调用连接 typeof(IOPCDataCallback).GUID; / pIConnect

30、ionPointContainer.FindConnectionPoint(ref 为 OPC Server 的 连 接 点 pIConnectionPoint.Advise(this, ItemArray0.szItemID = S7:S7 方法不同 ItemArray0.bActive = 1;/nCancelid 、 dwTransactionID 都是为了客户端服务器的对应 , 调用异步读回调函数System.Int32public virtual void OnReadComplete( System.Int32 dwTransidhGroup , System.Int32 hrMa

31、sterquality , System.Int32 hrMastererror , System.Int32dwCount , int phClientItems , /读数据句柄 object pvValues , /返回值 shortpwQualities , / 返回质量码 OpcRcw.Da.FILETIME pftTimeStamps , / 返回时间戳 int pErrors ) / 错误码 , Txt_R1_Value.Text = String.Format(0, pvValues0); Txt_R1_Quality.Text = GetQuality(pwQualities

32、0); DateTime dt = ToDateTime(pftTimeStamps0); Txt_R1_TimeStamp.Text = dt.ToString();, 编译执行, 程序会几方面的报错。 第五步, 订阅方式读回调函数及实现 COM 映射 上面 程序会有以下几种情况的报错:IA&DT Service & Support Page 15-47 问题 1 :程序执行后,弹出如下错误, Add group 报错 主要原因是 Form 要使用 IOPCDataCallback ,目的是将 OPC 的接口与实现类结合在一 起,实现 COM 的映射。 需要做的处理是:public part

33、ial class Form1 : Form, IOPCDataCallback 问题 2 :添加 IOPCDataCallback 接口后 主要原因是, IOPCDataCallback 有 4 个纯虚函数,必须实现public virtual void OnReadComplete(System.Int32 dwTransid, / 异步读完成触发 System.Int32 hGroup, System.Int32 hrMasterquality, System.Int32 hrMastererror, System.Int32 dwCount, int phClientItems, ob

34、ject pvValues, short pwQualities, OpcRcw.Da.FILETIME pftTimeStamps, int pErrors) public virtual void OnWriteComplete ( System.Int32 dwTransid , /异步写完成触发 System.Int32 hGroup ,System.Int32 hrMastererr , System.Int32 dwCount , int pClienthandles , int pErrors )public hGroup) / hGroup, /virtual void 取消特

35、定操作触发 订阅方式下读触发OnCancelComplete(System.Int32 dwTransid, System.Int32 public virtual void OnDataChange(Int32 dwTransid, Int32IA&DT Service & SupportPage 16-47Int32 hrMasterquality,lnt32 hrMastererror, lnt32 dwCount, int phClientltems, object pvValues, short pwQualities, OpcRcw.Da.FlLETlME pftTimeStamp

36、s, int pErrors)问题 3 :运行时,有时会弹出 Cross-thread operation 控件继承性的一种严格要求,在调试时会出现,可以做如下处理。 lnitealizeComponent语句做如下处理 :publicForm1()Control.CheckForlllegalCrossThreadCalls = false; 第六步,异步写数据private void Btn_Write_Click(object sender, EventArgs e) , object values = new object4; values0 = Txt_W1.Text; values

37、1 = Txt_W2.Text; values2 =test;/ 采 用 常 数 values3 = 1; / 采 用 常 数 lOPCAsynclO2Obj.Write(4, ltemServerHandle, values, 3, out nCancelid, out pErrors); /异步写数据 , 写完成处理(执行结果监视)public virtual void OnWriteComplete ( System.lnt32 dwTransid , System.lnt32 hGroup , System.lnt32 hrMastererr , System.lnt32 dwCoun

38、t , int pClienthandles , int pErrors ) , , ServerObj.GetErrorString( pErrors0, LOCALE_lD, out strResult); Txt_WriteStatus1.Text = strResult;,第七步,订阅方式读数据lA&DT Service & Support Page 17-47OPC 服务器的 Group 组在组内有数据发生改变时,自动根据更新周期刷新相应的客户 端数据。 工程应用中, 大量数据的操作使用订阅方式更有优势。 新速度,及是否采用订阅方式读写。private void CHK_Btn_Ch

39、eckedChanged(object sender, hActive = GCHandle.Alloc(nActive, GCHandleType.Pinned); hActive.Target=0; else hActive.TargetlOPCGroupStateMgtObj.SetState(pRequestedUpdateRate,not valid 错误,这是 C# 中 对 在 Form 的 .ctor 中,InitializeComponent();订阅方式下, 要考虑数据更EventArgs e) , GCHandle if (CHK_Btn.Checked != true)

40、1; , , nRevUpdateRate, 为组outhActive.AddrOfPinnedObject(), pTimeBias, pDeadband, pLClD, hClientGroup); / 设定特定信息 , void OnDataChange(lnt32 dwTransid, lnt32 hGroup, lnt32 hrMastererror, lnt32 dwCount, int phClientltems, object pwQualities, / 质量码 OpcRcw.Da.FlLETlME pftTimeStamps,通过 lOPCDataCallback 的虚函数

41、 OnDataChange实现 public virtual hrMasterquality, pvValues, / 值 short / 时间戳 int pErrors)Int32 , , if (phClientItemsnCount = 1) / 根 据 Item 在 客 户 端 注 册 句柄 查 询 Txt_R1_Value.Text = Convert.ToString(pvValuesnCount); Txt_R1_Quality.Text = GetQuality(pwQualitiesnCount); DateTime dt = ToDateTime(pftTimeStamps

42、nCount); Txt_R1_TimeStamp.Text = dt.ToString(); , 第八步,注销相应实例private void Btn_Disconn_Click(object sender, EventArgs e) ,IA&DT Service & SupportPage 18-47 实例参考ControlButton: Button: Button: name Btn_Conn Btn_Read_S Btn_Read_A Btn_DisConn Text Conn Read_S Read_A Write_S Write_A disConn参考第 8 节代码。 5 、采用

43、自动化接口实现过程 对于自动化接口, 程序相应简单些。 建 立项目: Automation_RW测试中,对 db10.dbw0 及 db10.dbw2 读写操作,在 Form 窗口做如下设计:Button: Button: Button:Btn_Write_S Btn_Write_AIA&DT Service & SupportPage 19-47TextBox: TextBox: TextBox: TextBox: TextBox: TextBox: TextBox: TextBox: TextBox:Txt_R1_Value Txt_R1_Quality Txt_R1_TimeStamp

44、Txt_R2_Value Txt_R2_Quality Txt_R2_TimeStamp Txt_W1 Txt_W2 Txt_ Txt_WriteStatus2CheckBox: CHK_Btn 第一步,添加下列命名空间(首先在 COM 组件中添加相应组件)using OPCSiemensDAAutomation; 第二步,定义 OPC 相关变量OPCServer MyOpcServer; / 定义 OPCServer OPCGroup MyOpcGroup; / 定义组 OPCItem MyOpcItem1; /Item OPCItem MyOpcItem2; /值 long ServerH

45、andle = new long2;/Item 的句柄MyOpcServer.Connect(OPC.SimaticNet,MyOpcGroup= MyOpcServer.OPCGroups.Add(MyGroup1); MyOpcItem1 = MyOpcItem2 = ServerHandle0 =第三步,建立连接及对象MyOpcServer = new OPCServer(); 02);MyOpcGroup.OPCItems.AddItem(S7:S7 connection_1DB10,INT0,1); MyOpcGroup.OPCItems.AddItem(S7:

46、S7 connection_1DB10,INT2, 2); MyOpcItem1.ServerHandle; ServerHandle1 = MyOpcItem2.ServerHandle;IA&DT Service & SupportPage 20-47 第四步,同步读数据,同步读数据 ,private void Btn_Read_S_Click(object sender, EventArgs e)/MyOpcItem1.Read(1,out ItemValues, out Qualities, out TimeStamps); /ItemValues,Qualities , TimeSt

47、amps 分别是值,质量码及时间 / 也可以通过调用 SyncRead 函数,参数 可参考异步读函数 , 第四步,同步写数据private void Btn_Write_S_Click(object sender, EventArgs e) , , MyOpcItem1.Write(Txt_W1.Text); / 也可以通过调用 SyncWrite 函数, 参数可参考异步写函 数 , 第五步,异步事件定义, 在异步操作情况下,需要定义相应的异步事件MyOpcGroup.DataChange DIOPCGroupEvent_DataChangeEventHandler(MyOpcGroup_Da

48、taChange); / / 据改变iteCompleteDIOPCGroupEvent_AsyncWriteCompleteEventHandler(MyOpcGroup_WriteComplete); / 成事件MyOpcGroup.AsyncReadComplete+=DIOPCGroupEvent_AsyncReadCompleteEventHandler(MyOpcGroup_ReadComplete); / 事件MyOpcGroup.AsyncCancelComplete+=DIOPCGroupEvent_AsyncCancelCompleteEventHandler(MyOpcG

49、roup_CancelComplete); / 消操作事件在使用中注意,其事件函数要按照特定接口:void MyOpcGroup_DataChange(int TransactionID, int NumItems, ref+=+=new订阅方式下数new写完new读完成new取ArrayClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) void MyOpcGroup_WriteComplete(int TransactionID, int NumItems, ref Array Cl

50、ientHandles, ref Array Errors) void MyOpcGroup_ReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors) void MyOpcGroup_CancelComplete(int CancelID)第六步订阅方式读void MyOpcGr

51、oup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) ,/ 注意数据改变时, Item 数量要通过 NumItems 得到,也就是说只有数据改变时,才对一 遍,所以降低了服务器负担。要注意读语句写法。IA&DT Service & Support异步读事件 int 注 意 方 式 Array cancelID; , ,READASYNC ID, outPage 21-47 ,

52、 第七步异步读 void MyOpcGroup_ReadComplete(int TransactionID, int NumItems, ref ref System.Array ItemValues, ref System.Array Qualities,/ 注意 TransactionIDprivate void Btn_Read_A_Click(object sender, EventArgs e)/ handle = new int3 ServerHandle0, ServerHandle1,0;/ MyServerHandles = (Array)handle; Array err

53、ors; int MyOpcGroup.AsyncRead(2, ref MyServerHandles, out errors, cancelID);System.Array ClientHandles, ref System.Array TimeStamps, ref System.Array Errors) 的对应 , 注意 array 在函数内部做参数时, 数据下标是从 1 开始的, 所以要考虑将第 0 位空出 来,n个Item,就要定义n+1列数组,添加一个 0 ,但在函数使用时,又是从左开始读的。 否则会报错。 第八步异步写private void Btn_Write_A_Clic

54、k(object sender, EventArgs e) ,MyOpcGroup.AsyncWrite(2, ref MyServerHandles, ref Myvalues, out errors, WRITEASYNC_ID, out cancelID); , void MyOpcGroup_WriteComplete(intTransactionID, int NumItems, ref Array ClientHandles, ref Array Errors) ,同样要注意 Array 在函数内部做参数的传递。 第九步释放对象private void Btn_Disconn_Cl

55、ick(object sender, EventArgs e) 参考第 8 节代码。IA&DT Service & SupportPage 22-476 、OPCItem 的数据类型 在通过自定义接口访问时,ItemArray1.szAccessPath=; ItemArray1.szItemIDconnection_1DB10,Real4;/ 地址,不同数据类型表示 ItemArray1.bActive 激 活 ItemArray1.hClient=ItemArray1.pBlob= IntPtr.Zero;ItemArray2.szAccessPath=connection_1DB10,STRING26.10;/ 地 址 , 不 同 数 据 类 型 表 示 方 ItemArray2.bActive = 1;/ 是 否 激 活 It

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论