OPC客户端编程汇编

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

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.dll,OpcRcw.Sec.dll以上开发方式所需的动态链接库可以从OPC基金会()的网站上下载,一些下载项目可能需要注册,或成为基金会的成员。不同的方式有各自的有缺点,请参见…本文使用自动化接口,VB.Net语言进行开发,开发项目是无线射频(RFID)卡方面的应用,典型的如公交车,或公司考勤使用的刷卡机。需要注意的是自动化接口存在一个“不是问题”的问题,数组下标是以1开始的,而不是传统计算机开发上的以0开始。不知道设计者头脑是怎么想(有人知道吗?);这可能会给一些语言的开发造成问题(有人碰到吗,没有你就是幸运的)需求:OPCDAAuto.dll或该Dll的Interop(一):客户端开发流程OPC客户端的开发主要遵循下图所示的开发流程,下面就从以下几个开发步骤进行说明(二):枚举OPC服务器列表枚举服务器主要是通过OPCServer接口的GetOPCServers方法来实现的,该方法会返回OPC服务器数组(以1为下界,上面已有说明),以下是代码段'枚举OPC服务器列表PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadTryGlobalOPCServer=NewOPCAutomation.OPCServerClass()DimServerListAsObject=GlobalOPCServer.GetOPCServersForindexAsShort=LBound(ServerList)ToUBound(ServerList)'加入控件列表中,注意这里使用LBound和UBoundcbbServerList.Items.Add(ServerList(index))NextIfcbbServerList.Items.Count0ThencbbServerList.SelectedIndex=0EndIfResetControlStatus()'设置控件状态GlobalOPCServer=NothingCatchExAsExceptionMessageBox.Show(ListOPCserversfailed:+Ex.Message,OPCSample,MessageBoxButtons.OK)EndTryEndSub(三):连接OPC服务器自动化接口中连接到服务器是使用connect方法PublicOverridableSubConnect(ByValProgIDAsString,OptionalByValNodeAsObject=Nothing)ProgID指服务器的ProgID,Node代表网络节点,如果是本机则放空即可。连接到服务器后,以下属性需要特别注意:OPCServer.StartTime:服务器的启动时间OPCServer.CurrentTime:服务器的当前时间,各个客户端可以通过这个属性值完成一些同步的操作OPCGroups.DefaultGroupIsActive:以后添加的Group是否默认激活OPCGroups.DefaultGroupDeadBand:Group的默认死区,变化量超过死区后将会触发DataChange事件,合理的设置该值可以提高程序性能OPCGroups.Count:下属组(Group)的数量OPCGroups.DefaultGroupLocalID:组(Group)的默认通信区域编号,如1024OPCGroups.DefaultGroupUpdateRate:组(Group)的默认刷新率,该属性也比较重要OPCGroups.DefaultGroupTimeBias:组(Group)的默认时间偏差(四):添加组(Group)和项(Item)添加组和项需要用到Groups.Add和Items.AddItem方法,以下是原型:FunctionAdd(OptionalByValNameAsObject=Nothing)AsOPCAutomation.OPCGroupFunctionAddItem(ByValItemIDAsString,ByValClientHandleAsInteger)AsOPCAutomation.OPCItem组也有两个重要的属性Group.UpdateRate:刷新率,该属性通Groups的UpdateRate意义一样,如果这个值有设置,则以这个值为准Group.IsSubscribed:是否使用订阅功能以下是代码段'连接到指定的OPC服务器PrivateSubbtnConnectServer_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnConnectServer.ClickIfcbbServerList.TextThenConnectedOPCServer=NewOPCAutomation.OPCServerClass()TryConnectedOPCServer.Connect(cbbServerList.Text)'设置组集合的默认属性ConnectedOPCServer.OPCGroups.DefaultGroupIsActive=TrueConnectedOPCServer.OPCGroups.DefaultGroupDeadband=0'添加组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)GlobalOPCItems(2)=ConnectedGroup.OPCItems.AddItem(Reader_Device.CardNO,2)RefreshServerStatus()'刷新服务器状态CatchexAsExceptionConnectedOPCServer=NothingMessageBox.Show(OPCserverconnectfailed:+ex.Message,OPCSample,MessageBoxButtons.OK)EndTryResetControlStatus()EndIfEndSub(五):读写操作与事件控制读写操作包括同步和异步两种操作方式,以下是这几个方法的原型:Group的同步读事件SubSyncRead(ByValSourceAsShort,ByValNumItemsAsInteger,ByRefServerHandlesAsSystem.Array,ByRefValuesAsSystem.Array,ByRefErrorsAsSystem.Array,OptionalByRefQualitiesAsObject=Nothing,OptionalByRefTimeStampsAsObject=Nothing)Group的同步写事件SubSyncWrite(ByValNumItemsAsInteger,ByRefServerHandlesAsSystem.Array,ByRefValuesAsSystem.Array,ByRefErrorsAsSystem.Array)Group的异步读事件SubAsyncRead(ByValNumItemsAsInteger,ByRefServerHandlesAsSystem.Array,ByRefErrorsAsSystem.Array,ByValTransactionIDAsInteger,ByRefCancelIDAsInteger)Group的异步写事件SubAsyncWrite(ByValNumItemsAsInteger,ByRefServerHandlesAsSystem.Array,ByRefValuesAsSystem.Array,ByRefErrorsAsSystem.Array,ByValTransactionIDAsInteger,ByRefCancelIDAsInteger)如果使用异步的读写操作,那么还需要实现Group中的ReadComplete和WriteComplete两个事件PublicEventAsyncReadComplete(ByValTransactionIDAsInteger,ByValNumItemsAsInteger,ByRefClientHandlesAsSystem.Array,ByRefItemValuesAsSystem.Array,ByRefQualitiesAsSystem.Array,ByRefTimeStampsAsSystem.Array,ByRefErrorsAsSystem.Array)PublicEventAsyncWriteComplete(ByValTransactionIDAsInteger,ByValNumItemsAsInteger,ByRefClientHandlesAsSystem.Array,ByRefErrorsAsSystem.Array)其他相关的重要事件包括:Group数据变化时的通知事件PublicEventDataChange(ByValTransactionIDAsInteger,ByValNumItemsAsInteger,ByRefClientHandlesAsSystem.Array,ByRefItemValuesAsSystem.Array,ByRefQualitiesAsSystem.Array,ByRefTimeStampsAsSystem.Array)Group的异步取消事件PublicEventAsyncCancelComplete(ByValCancelIDAsInteger)Server(服务器)关闭通知事件PublicEventServerShutDown(ByValReasonAsString)以下是这些实现的代码段'读取卡片指定的块号的值PrivateSubbtnReadCard_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)IfNot(ConnectedGroupIsNothing)ThenTry'获取块号DimBlockNoAsShort=CByte(ReadBlockNo.Text)'如果要获取数据的块所对应的项还没有创建,就创建它IfGlobalOPCBlockItems(BlockNo)IsNothingThenGlobalOPCBlockItems(BlockNo)=ConnectedGroup.OPCItems.AddItem(Reader_Device.Block&CStr(BlockNo),200+BlockNo

1 / 45
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功