lTransID_Rd=lTransID_Rd+1objTestGrp.AsyncRead17,lServerHandles,lErrors,lTransID_Rd,lCancelID_RdEndIfEndSubPrivateSubobjTestGrp_AsyncReadComplete(_ByValTransactionIDAsLong,ByValNumItemsAsLong,_ClientHandles()AsLong,ItemValues()AsVariant,_Qualities()AsLong,TimeStamps()AsDate,Errors()AsLong)……Sub(8)在按钮中执行AsyncWrite子程序,完成异步写的操作。
SubAsyncWrite(nIndexAsInteger,ByRefvtItemValues()AsVariant,_ByReflErrors()AsLong)DimlHandle(1)AsLongIfobjTestGrpIsNothingThenExitSubEndIfIfobjTestGrp.OPCItems.Count>0ThenlHandle(1)=lServerHandles(nIndex)'异步写入
lTransID_Wt=lTransID_Wt+1objTestGrp.AsyncWrite1,lHandle(),vtItemValues,_lErrors,lTransID_Wt,lCancelID_WtEndIfEndSub(9)断开OPC服务器连接着OPC服务器的OPC客户应用程序,在退出前必须断开和OPC服务器的连接。因为OPC服务器并不知道OPC客户应用程序的退出。如果不先断开连接,那么OPC服务器使用的计算机资源就不会被释放。如果这样的问题反复发生,久而久之,连续运转的自动控制系统可能会计算机资源渐渐枯竭从而发生严重问题,可以显式地把它设置为“Nothing”。SubDisconnect()DimlErrors()AsLongIfNotobjItemsIsNothingThenIfobjItems.Count>0ThenobjItems.Remove17,lServerHandles,lErrors'清除OPC项
EndIfSetobjItems=NothingEndIfIfNotobjTestGrpIsNothingThenobjGroups.Remove\oup\清除OPC组
SetobjTestGrp=NothingEndIfIfNotobjGroupsIsNothingThenSetobjGroups=NothingEndIfIfNotobjServerIsNothingThenIfobjServer.ServerState<>OPCDisconnectedThenobjServer.Disconnect'断开OPC服务器.EndIfSetobjServer=NothingEndIfEndSub WTOPCSvr.DLL作为一个快速开发OPC服务器的工具包,它封装了所有关于COM和OPC的技术细节,将Microsoft公司的OLE、COM、DCOM技术和OPC的技术细节隐藏起来,使开发OPC服务器的工作集中在特定的数据采集任务上来。利用DLL开发OPC服务器的开发者无需考虑许多涉及到底层接口实现方面的工作,开发者无须掌握ATL、COM/DCOM,也无须了解OPC技术的细节,只需具有基本的编程基础即可快速上手。开发者的应用程序完全可以在一个较高层次上去描述OPC数据。利用这个DLL也可以很容易的实现对现有系统的改造,因为它可以很容易地集成到现有的应用系统中,而无需太多的工作。该工具包支持多个客户端并发访问服务器,并为每个客户端创建一个独立线程。WTOPCSvr.DLL工具包其实就是一个动态链接库(DLL)。支持OPCl.0和
OPC2.0数据存取规范定义的所有接口,包括实现了浏览器功能的接口。服务器应用程序通过传递一个名字和值给动态链接库去创建过程标签,动态链接库记录这个数据点,同时传送给所有使用这个数据点的客户。任何时候这个服务器应用程序都可以改变这个数据点的值,而所有使用这个数据点的客户都会得到数据值改变的通报。一个连接到服务器的客户改变任何过程标签都会得到调用返回通报消息。动态链接库还支持动态创建OPC标签,如果一个客户请求一个还没有创建的标签,则产生一个调用返回,应用程序就根据这个调用返回的信息创建一个标签。使用这个动态链接库(WTOPCSvr.DLL)可以迅速地开发OPC数据存取服务器,它提供了一些把定制数据集成到OPC服务器的易于使用的API函数。另外这个动态链接库可以很容易的集成到现有应用中,也可以集成到一个新的应用中。使用动态链接库开发OPC服务器时,关键要求用户对动态链接库的各个API函数要熟悉,从而提高软件开发的灵活性。这个动态链接库包含五大功能块:调用返回定义、初始化和注册函数、OPC项函数、实时信息函数和辅助功能函数。1 调用返回定义明确地定义了DLL用于返回给服务器程序的调用返回的具体含义,以实现客户应用与服务器应用之间的数据交换,DLL提供了以下一些API函数。DeclareFunctionEnableUnknownItemNotificationLib\wnItemNotification@4\:这个函数的返回值表示一个客户请求了一个没有定义或是己经被暂停刷新的标签,但无论客户请求的标签是否是己定义的标签,这个函数都定义了一个从DLL返回的调用返回。当连接建立后,服务器应用可以使用这个调用返回对动态创建的标签进行操作。
DeclareFunctionEnableItemRemovalNotificationLib\movalNotification@4\:当对一个标签的最后客户引用释放后,这个函数将定义一个来自DLL的调用返回,服务器应用程序可以删除这个标签或暂停这个标签的刷新。
DeclareFunctionEnableDisconnectNotificationLib\EnableDisconnectNotification@4\:当客户应用请求断开连接时,这个函数产生一个来自DLL的调用返回通知服务器应用断开连接。
DeclareFunctionEnableWriteNotificationLib\n@8\:当OPC客户写一个己定义的标签时,这个函数产生一个来自DLL的调用返回。正常情况下,DLL将把值转变成项的私有类型,但在某些情况下,它要求应用自己完成这个转变过程。2 初
始化与注册函数
DeclareFunctionInitWTOPCsvrLib\D_SvrAsByte,ByValServerRateAsLong)AsLong:这个函数实现对DCOM的初始化和创建OPC服务器对象。其中参数CLSID_Svr是OPC服务器的类标识(CLSID)——用于OPC客户连接服务器;参数ServerRate定义了客户的数据刷新速率,其单位是毫秒。如果函数调用成功则返回TRUE,否则返回FALSE。
DeclareFunctionUpdateRegistryLib\LSID_SvrAsByte,ByRefNameAsByte,ByRefDescrAsByte,ByRefExePathAsByte)AsLong:这个函数封装了Windows注册函数,用于OPC服务器的注册。其中参数CLSID_Svr是OPC服务器的类标识(CLSID);参数Name定义了服务器的名字;参数Descr可以是任何描述服务器的字符串,但常常包含一些版本信息;参数ExePath定义了可执行程序的完整的Windows路径。如果函数调用成功则返回TRUE,否则返回FALSE。DeclareFunctionUnregisterServerLib\CLSID_SvrAsByte,ByRefNameAsByte)AsLong:这是一个服务器注销函数,其参数CLSID_Svr是OPC服务器的类标识(CLSID);参数Name为服务器的名字。如果函数调用成功则返回TRUE,否则返回FALSE。3 OPC项函数
DeclareFunctionCreateTagLib\e,ByValValueAsVariant,ByValInitialQualityAsInteger,ByValIsWritableAsLong)AsLong:这是一个在动态链接库里创建过程标签的函数,参数Name定义了OPC客户要访问的过程标签,这个名字字符串可以是服务器可接受的任何文本字符串,其中也可使用分层名字(使用“.”分隔符),这将导致动态链接库创建OPC分层名字空间;参数Value定义了标签的初始数据;参数InitialQuality定义了标签的OPC属性标志;参数IsWriteable决定标签是否是可写标签。如果标签创建成功,函数返回数据点的句柄(HANDLE),否则返回INVALID_HANDLE_VALUE。
DeclareFunctionUpdateTagLib\AsLong,ByValValueAsVariant,ByValQualityAsInteger)AsLong:这个函数调用实现对过程标签的数据刷新。Value就是来自现场硬件的数据。
DeclareFunctionUpdateTagWithTimeStampLib\meStamp@32\r,ByValTimestampAsDouble)AsLong:这个函数允许应用改变一个己定义的标签的值、
属性标志和时间标签。如果应用没有提供时间标签(timestamp),则DLL将采用系统时间。参数TagHandle表示数据点;参数Value表示数据值;参数Quality表示新的属性条件。如果函数调用成功则返回TRUE,否则返回FALSE。
DeclareFunctionSetTagPropertiesLib\alTagHandleAsLong,ByValPropertyIDAsLong,ByRefDescriptionAsByte,ByValValueAsVariant)AsLong:任何数量的OPC项属性都可以用这个函数设置,DLL保持了所有已定义属性的一个列表,OPC客户可以访问这些属性。
DeclareFunctionUpdateTagByNameLib\ByRefNameAsByte,ByValValueAsVariant,ByValQualityAsInteger)AsLong:可以使用这个函数来改变一个已定义过程标签的值。
DeclareFunctionSuspendTagUpdatesLib\\:这个函数可以使服务器知道一个客户描述的特殊标签的调用返回。在多数情况下,服务器是随着其接收数据的变化而刷新标签的,DLL处理所有客户请求、通报和刷新。在一定条件下,当客户访问一个项时,希望服务器仅仅刷新OPC标签数据库。通过暂停刷新功能,当客户试图访问这个项时,DLL将处理一个未知项的调用返回,然后,服务器开始重新开始刷新标签直到下一个暂停刷新产生。TagHandle定义了暂停刷新的项。
DeclareFunctionReadTagLib\ng,ByRefValueAsVariant)AsLong:这是一个读标签的函数。
DeclareFunctionReadTagWithTimeStampLib\tamp&16\RefTimestampAsFileTime)AsLong:应用程序使用这个函数去获取一个标签的当前值。参数Value表示了接收的数据值,参数Timestamp是标签的当前时间标签值。4 实时信息
DeclareFunctionStartUpdateTagsLib\ng:开始刷新。
DeclareFunctionUpdateTagToListLib\alTagHandleAsLong,ByValValueAsVariant,ByValQualityAsInteger)AsLong:刷新标签列表。
DeclareFunctionEndUpdateTagsLib\:
上面三个函数必须一起使用,它们一起提供了一次刷新多个标签的有效方式。首先调用StartUpdateTags,然后用UpdateTagToList代替UpdateTag()调用,当所有标签都被刷新后再调用EndUpdateTags()结束此次刷新操作。5 辅助功能函数
DeclareFunctionRefreshAllClientsLib\ng:服务器可以使用此函数对所有连接的客户进行初始化。正常情况下,客户应用数据是基于DLL中的异步时针刷新的,这个函数让服务器可以刷新所有客户数据。DeclareFunctionResetServerRateLib\ServerRateAsLong)AsLong:此函数用于改变服务器应用的数据刷新率。
DeclareFunctionSetVendorInfoLib\orInfoAsByte)AsLong:设置一些服务器的版本信息。
DeclareFunctionNumbrClientConnectionsLib\ions@0\:这个函数返回当前连接到服务器的客户数。
DeclareSubRequestDisconnectLib\:此函数提供了请求所有客户断开连接的功能,但它并不保证这个请求得到响应或者客户真正断开连接。服务器请求客户断开的功能仅仅对那些符合OPC2.0和OPC3.0规范的客户有用。
DeclareFunctionRemoveTagLib\eAsLong)AsLong:此函数从DLL中删除一个过程标签。如果在删除过程标签时有客户连接正在访问这个标签,则这个连接仍然有效,但是将没有新的数据来刷新这个连接。6 对报警与事件的支持
DeclareFunctionUserAEMessageLib\MsgAsByte,ByValSeverityAsLong)AsLong:此函数发送用户定义的事件消息给所有连接的OPC报警与事件客户。
DeclareFunctionSetItemLevelAlarmLib\yValTagHandleAsLong,ByValLevelIDAsLong,ByValLimitAsSingle,ByValSeverityAsLong,ByValEnabledAsLong)AsLong:每个过程标签可以定义几个报警级别,DLL将检测所有报警级别同时在刷新项时通知连接的OPC报警与事件客户。参数LevelID有以下几个级别:#defineID_LOLO_LIMITl、#defineID_LO_LIMIT2、#defineID_HI_LIMIT3、#defineID_HIHI_LIMIT4。
DeclareFunctionGetItemLevelAlarmLib\
ByValTagHandleAsLong,ByValLevelIDAsLong,ByRefLimitAsSingle,ByRefSeverityAsLong,ByRefEnabledAsLong)AsLong:获取一个过程标签的报警级别。
我需要在wince下开发opcserver,急求wince下的opc开发工具。lq74@21cn.com
当然支持,包括DCOM。
只是在COM对象的支持上不完全,如不支持serverlist方法查找OPC服务器。