OPC客户端编程汇编.pdf
《OPC客户端编程汇编.pdf》由会员分享,可在线阅读,更多相关《OPC客户端编程汇编.pdf(52页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、OPCOPC 编程汇编编程汇编 OPC OPC 客户端的自动化实现客户端的自动化实现OPC 是建立在 COM,DCOM 的基础商的,因此绝大多数语言都可以很好的进行开发。在 Net 中开发客户端有以下几种方式:(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.dl
2、l,OpcRcw.Sec.dll以上开发方式所需的动态链接库可以从 OPC 基金会的网站上下载,一些下载项目可能需要注册,或成为基金会的成员。不同的方式有各自的有缺点,请参见本文使用自动化接口,VB.Net 语言进行开发,开发项目是无线射频(RFID)卡方面的应用,典型的如公交车,或公司考勤使用的刷卡机。需要注意的是自动化接口存在一个“不是问题”的问题,数组下标是以 1 开始的,而不是传统计算机开发上的以 0 开始。不知道设计者头脑是怎么想();这可能会给一些语言的开发造成问题(,没有你就是幸运的)需求:OPCDAAuto.dll 或该 Dll 的 Interop(一):客户端开发流程OPC
3、客户端的开发主要遵循下图所示的开发流程,下面就从以下几个开发步骤进行说明(二):枚举 OPC 服务器列表枚举服务器主要是通过 OPCServer 接口的 GetOPCServers 方法来实现的,该方法会返回 OPC 服务器数组(以 1 为下界,上面已有说明),以下是代码段枚举 OPC 服务器列表PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadTryGlobalOPCServer=NewOPCAutomation.OPCServerClass()DimServe
4、rListAsObject=GlobalOPCServer.GetOPCServersForindexAsShort=LBound(ServerList)ToUBound(ServerList)加入控件列表中,注意这里使用 LBound 和 UBoundcbbServerList.Items.Add(ServerList(index)NextIfcbbServerList.Items.Count 0ThencbbServerList.SelectedIndex=0EndIfResetControlStatus()设置控件状态GlobalOPCServer=NothingCatchExAsExc
5、eptionMessageBox.Show(List OPC servers failed:+Ex.Message,OPCSample,MessageBoxButtons.OK)EndTryEndSub(三):连接 OPC 服务器自动化接口中连接到服务器是使用 connect 方法Public Overridable Sub ConnectConnect(ByValProgID As StringString,Optional ByValNode As ObjectObject=Nothing)ProgID 指服务器的 ProgID,Node 代表网络节点,如果是本机则放空即可。连接到服务器后
6、,以下属性需要特别注意:OPCServer.StartTime:服务器的启动时间OPCServer.CurrentTime:服务器的当前时间,各个客户端可以通过这个属性值完成一些同步的操作OPCGroups.DefaultGroupIsActive:以后添加的 Group 是否默认激活OPCGroups.DefaultGroupDeadBand:Group 的默认死区,变化量超过死区后将会触发 DataChange 事件,合理的设置该值可以提高程序性能OPCGroups.Count:下属组(Group)的数量OPCGroups.DefaultGroupLocalID:组(Group)的默认通信
7、区域编号,如 1024OPCGroups.DefaultGroupUpdateRate:组(Group)的默认刷新率,该属性也比较重要OPCGroups.DefaultGroupTimeBias:组(Group)的默认时间偏差(四):添加组(Group)和项(Item)添加组和项需要用到 Groups.Add 和 Items.AddItem 方法,以下是原型:Function AddAdd(Optional ByValName As ObjectObject=Nothing)As OPCAutomationOPCAutomation.OPCGroupOPCGroupFunction AddIt
8、emAddItem(ByValItemID As StringString,ByValClientHandle As IntegerInteger)As OPCAutomationOPCAutomation.OPCItemOPCItem组也有两个重要的属性 Group.UpdateRate:刷新率,该属性通 Groups 的 UpdateRate 意义一样,如果这个值有设置,则以这个值为准 Group.IsSubscribed:是否使用订阅功能以下是代码段连接到指定的 OPC 服务器PrivateSubbtnConnectServer_Click(ByValsenderAsSystem.Obj
9、ect,ByValeAsSystem.EventArgs)HandlesbtnConnectServer.ClickIfcbbServerList.Text ThenConnectedOPCServer=NewOPCAutomation.OPCServerClass()TryConnectedOPCServer.Connect(cbbServerList.Text)设置组集合的默认属性ConnectedOPCServer.OPCGroups.DefaultGroupIsActive=TrueConnectedOPCServer.OPCGroups.DefaultGroupDeadband=0添
10、加组ConnectedGroup=ConnectedOPCServer.OPCGroups.Add()ConnectedGroup.UpdateRate=3*1000刷新虑,用于下面的 DataChange 事件ConnectedGroup.IsSubscribed=True使用订阅功能添加项GlobalOPCItems(0)=ConnectedGroup.OPCItems.AddItem(Reader_Device.OpenCard,0)GlobalOPCItems(1)=ConnectedGroup.OPCItems.AddItem(Reader_Device.CloseCard,1)Gl
11、obalOPCItems(2)=ConnectedGroup.OPCItems.AddItem(Reader_Device.CardNO,2)RefreshServerStatus()刷新服务器状态CatchexAsExceptionConnectedOPCServer=NothingMessageBox.Show(OPC server connect failed:+ex.Message,OPCSample,MessageBoxButtons.OK)EndTryResetControlStatus()EndIfEndSub(五):读写操作与事件控制读写操作包括同步和异步两种操作方式,以下是这
12、几个方法的原型:Group 的同步读事件Sub SyncReadSyncRead(ByValSource As ShortShort,ByValNumItems As IntegerInteger,ByRefServerHandles As SystemSystem.ArrayArray,ByRefValues AsSystemSystem.ArrayArray,ByRefErrors AsSystemSystem.ArrayArray,Optional ByRefQualities As ObjectObject=Nothing,OptionalByRefTimeStamps As Obje
13、ctObject=Nothing)Group 的同步写事件Sub SyncWriteSyncWrite(ByValNumItems As IntegerInteger,ByRefServerHandles As SystemSystem.ArrayArray,ByRefValues As SystemSystem.ArrayArray,ByRefErrors As SystemSystem.ArrayArray)Group 的异步读事件Sub AsyncReadAsyncRead(ByValNumItems As IntegerInteger,ByRefServerHandles As Sys
14、temSystem.ArrayArray,ByRefErrors As SystemSystem.ArrayArray,ByValTransactionID As IntegerInteger,ByRefCancelID AsIntegerInteger)Group 的异步写事件Sub AsyncWriteAsyncWrite(ByValNumItems As IntegerInteger,ByRefServerHandles As SystemSystem.ArrayArray,ByRefValues As SystemSystem.ArrayArray,ByRefErrors As Sys
15、temSystem.ArrayArray,ByValTransactionIDAs IntegerInteger,ByRefCancelID As IntegerInteger)如果使用异步的读写操作,那么还需要实现 Group 中的 ReadComplete 和 WriteComplete 两个事件PublicEvent AsyncReadCompleteAsyncReadComplete(ByValTransactionID As IntegerInteger,ByValNumItems As IntegerInteger,ByRefClientHandles As SystemSyste
16、m.ArArrayray,ByRefItemValues AsSystemSystem.ArrayArray,ByRefQualities As SystemSystem.ArrayArray,ByRefTimeStamps As SystemSystem.ArrayArray,ByRefErrorsAs SystemSystem.ArrayArray)PublicEvent AsyncWriteCompleteAsyncWriteComplete(ByValTransactionID As IntegerInteger,ByValNumItems As IntegerInteger,ByRe
17、fClientHandles As SystemSystem.A Arrayrray,ByRefErrors As SystemSystem.ArrayArray)其他相关的重要事件包括:Group 数据变化时的通知事件PublicEvent DataChangeDataChange(ByValTransactionID As IntegerInteger,ByValNumItems As IntegerInteger,ByRefClientHandles As SystemSystem.ArrayArray,ByRefItemValues As SystemSystem.ArrayArray
18、,ByRefQualities As SystemSystem.ArrayArray,ByRefTimeStamps As SystemSystem.ArrayArray)Group 的异步取消事件Public Event AsyncCancelCompleteAsyncCancelComplete(ByValCancelID As IntegerInteger)Server(服务器)关闭通知事件Public Event ServerShutDownServerShutDown(ByValReason As StringString)以下是这些实现的代码段读取卡片指定的块号的值PrivateS
19、ubbtnReadCard_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)IfNot(ConnectedGroupIsNothing)ThenTry获取块号DimBlockNoAsShort=CByte(ReadBlockNo.Text)如果要获取数据的块所对应的项还没有创建,就创建它IfGlobalOPCBlockItems(BlockNo)IsNothingThenGlobalOPCBlockItems(BlockNo)=ConnectedGroup.OPCItems.AddItem(Reader_Device.Bloc
20、k&CStr(BlockNo),200+BlockNo)EndIf准备参数数组DimServerResultsAsSystem.ArrayDimServerErrorsAsSystem.ArrayDimServerHandles(1)AsIntegerServerHandles(1)=GlobalOPCBlockItems(BlockNo).ServerHandle读取值ConnectedGroup.SyncRead(OPCAutomation.OPCDataSource.OPCDevice,1,ServerHandles,ServerResults,ServerErrors)IfServer
21、Errors(1)0ThenMsgBox(Read Card Failed:&ServerErrors(1)ElsetxtReadBlockNo.Text=ServerResults(1)EndIfCatchexAsExceptionMessageBox.Show(OPC server Read Card failed:+ex.Message,OPCSample,MessageBoxButtons.OK)EndTryEndIfEndSub写卡片指定块的值PrivateSubbtnWriteCard_Click(ByValsenderAsSystem.Object,ByValeAsSystem.
22、EventArgs)IfNot(ConnectedGroupIsNothing)ThenTry获取块号DimBlockNoAsShort=CByte(WriteBlockNo.Text)如果要写入数据的块所对应的项还没有创建,就创建它IfGlobalOPCBlockItems(BlockNo)IsNothingThenGlobalOPCBlockItems(BlockNo)=ConnectedGroup.OPCItems.AddItem(Reader_Device.Block&CStr(BlockNo),200+BlockNo)EndIf准备参数数组DimServerValues(1)AsOb
23、jectDimServerErrorsAsArrayDimServerHandles(1)AsIntegerServerHandles(1)=GlobalOPCBlockItems(BlockNo).ServerHandleServerValues(1)=txtWriteBlockNo.Text写入值ConnectedGroup.SyncWrite(1,ServerHandles,ServerValues,ServerErrors)IfServerErrors(1)0ThenMsgBox(Write Card Failed:&ServerErrors(1)ElseMsgBox(Write Ca
24、rd Succeed)EndIfCatchexAsExceptionMessageBox.Show(OPC server Write Card failed:+ex.Message,OPCSample,MessageBoxButtons.OK)EndTryEndIfEndSub(六):断开服务器断开服务器只要使用 OPCServer 的 Disconnect 方法几个,以下是代码段:断开到指定 OPC 服务器的连接PrivateSubbtnDisconnectServer_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)les
25、btnDisconnectServer.ClickIfNot(ConnectedOPCServerIsNothing)ThenTryConnectedOPCServer.Disconnect()CatchexAsExceptionMessageBox.Show(OPC server disconnect failed:+ex.Message,OPCSample,MessageBoxButtons.OK)FinallyConnectedOPCServer=NothingResetControlStatus()EndTryEndIfEndSub(七):相关链接非常好的一个 OPC 技术网站OPC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OPC 客户端 编程 汇编
限制150内