由 OPC服务器具体实现接口的功能?服务器具体确定了可以存取的设备和数据、数据单元(dataitem)的命名方式以及对具体设备存取数据的细节,并且通过OPC标准接口开放给外部接口程序?各个OPC客户程序通过OPC标准接口对各OPC服务器管理的设备进行操作,而无需关心服务器实现的细节和设备内部的具体细节?服务器组件提供并管理那些OPC对象的接口?应用程序作为OPC接口的客户方,硬件驱动程序作为OPC接口中的服务器方?每个OPC客户程序都可接若干个 OPC服务器,每个硬件驱动程序可以给若干个应用程序提供数据?
按照功能的不同,每套接口又分为三类接口,分别是:(1)OPC数据访问接口(OPC Data Access Interface);(2)OPC报警和事件接口(OPC Alarm & Event Access Interface);(3)历史数据访问接口(OPC Historical Data Access Interface)。相应的,分别实现这三类接口的OPC服务器就称为DA服务器、AE服务器和HAD服务器。
(2) OPC数据存取(Data Access)规范
OPC DA 服务器提供符合OPC规范的定制接口,它的基本结构如图所示。从图中可以看出服务器包含三种对象:服务器对象(OPC Sever)、组对象(OPC Group)和项对象(OPC Item)。
OPC服务器对象是客户端与服务器交互的首要对象。客户端通过访问服务器对象的接口函数与之交互。一个服务器对象里就可以设置一个以上的组对象。OPC服务器对象的主要功能是:创建和管理组对象;管理服务器内部的状态信息;将服务器的错误代码翻译成描述性语句;浏览服务器内部的数据组织结构。
OPC服务器对象提供了对数据源进行存取(读/写)或通讯的方法,而数据源可以是现场的I/O设备,也可以是其它的应用程序。通过接口,OPC客户应用程序可以同时连到由一个或多个厂商提供的OPC服务器上。OPC服务器封装了与I/O控制设备进行通讯和访问数据的类型与名字及进行设备操作的代码。
组对象用于组织管理服务器内部的实时数据信息,它是OPC项对象的集合。正因为有了组对象,OPC应用程序就可以成批地对所需要的数据进行访问,也可以以组为单位启动或停止数据访问。其主要功能:管理组对象内部的状态信息;创建和管理项对象;进行数据访问。
OPC组提供客户应用程序组织数据的机制,例如:一个组可以包含一个显示面板所有数据的项,并可对数据进行读写。在一些特殊情况下,还可以在组里建立客户应用程序与项的连接,并可以根据需要禁止或允许这种连接。OPC客户应用程序还可以修改OPC服务器向OPC客户应用程序提交数据变化的刷新数率。
OPC组有两种类型:公共组(Public)和局部组(Local or Private)。公共组可以为多个客户程序共享,而局部组只为某一个客户程序所有。在每个组里,客户程序可以定义多个OPC项。
OPC项代表了与服务器里数据源的连接。从定制接口(Custom Interface)角度来看,一个OPC项不能被OPC客户程序作为一个对象来进行操作,因此,在
OPC项中没有定义外部接口。所有对OPC项的操作都是利用OPC项的包容器 (OPC组)或OPC项的定义来进行的。
项对象则与实际的现场设备相对应,每个OPC项包含值(Value)、品质(Quality)和时间标签(Time Stamp)。值(Value)的类型是VARIANT,品质的类型是SHORT。
应当注意的是项不是数据源,而只是与数据源的连接。例如:在DCS系统中定义的可以让OPC客户程序访问的标签。OPC项应该被看成是数据地址的标示,而不是数据的物理源。
OPC标准接口定义了以下三层接口,依次呈包含关系。
OPC Server:OPC启动服务器,获得其他对象和服务的起始类,并用于返回OPC Group类对象;
OPC Group:存储由若干OPC Item组成的Group信息,并用于返回OPC Item类对象;
OPC Item:存储具体Item 的定义、数据值、状态值等信息。 (3) OPC DA服务器与OPC客户的数据通讯
OPC服务器提供了两种数据读写方式:同步方式和异步方式。IOPCSyncIO接口提供了同步方式的数据访问,IOPCAsyncIO2接口(在10版本里是IOPCAsyncIO接口)提供了异步方式的数据访问。同步方式比较简单,在访问的数据量比较少或不太在意访问效率的情况下,可以使用同步方式;异步方式实现起来相对比较复杂,但在数据量比较大和要求较高访问效率的情况下必须使用异步方式。
OPC客户通过创建OPC Server对象,获得其接口指针,进而调用接口函数与服务器交互。当服务器想传送数据给客户时,它是通过异步通报方式或连接点方式来实现的。异步通报方式主要用于OPC规范1.0版规定的异步I/O接口,连接点方式主要用于OPC规范2.0版规定的异步I/O接口。通过COM的连接点技术实现了服务器方到客户方的通讯,即定时或当数据变化超过一定范围时向客户方发送变化的数据。
服务器提供可连接对象,客户方必须实现接收器接口的相关函数。调用异步读写操作函数后,函数马上返回,客户程序可以处理其他事务。当操作完成时,
OPC服务器通过接受器的相关函数,通知客户程序进行处理。 OPC规定定义的客户方接收器IOPCDataCallback接口包含如下四个函数:OnDataChange函数在服务器方数据发生变化时,由服务器方调用;OnReadComplete函数在异步读操作完成时,由服务器方调用;OnWriteComplete函数在异步写操作完成后,由服务器方调用;OnCancelComplete函数在取消操作(取消某一个异步读或写操作)完成后,由服务器方调用。客户方可以在这四个函数里添加自定义的处理代码。 实现好客户方接收器接口,并调用连接点对象的Advise函数激活连接后,就可以使用IOPCAsyncIO2接口来进行异步读写操作了。IOPCAsyncIO2接口函数包括:Read,Write,Cancel1,Refresh2,SetEnable。这些函数提供了强大而灵活的异步数据访问功能。
1) 异步读写操作
当异步读事件完成后,OnReaComplete函数会被服务器调用来通知客户,客户可以通过OnReadComplete函数来取得读取得数据以及相关信息。由于可能同时存在多个异步读操作,可以根据DwTransactionID来判断是哪个读操作完成。 类似,当异步写完成时OnWriteComplete函数被激发。
2) 异步数据自动更新
当服务器方有数据变化,且满足一定的条件(由AddGroup的相关参数决定)时,OnDataChange函数被激发,客户可以取得变化的数据以及相关信息。 客户还可以调用Refresh2函数来主动强制服务器调用一次OnDataChange向客户发送一次最新数据。 如果客户暂时不需要OnDataChange功能,可以调用SetEnable函数暂时停止OnDataChange数据更新功能。
3) 异步取消操作
在OnReadComplete,OnWriteComplete,OnDataChange函数响应前,客户可以使用IOPCAsyncIO2接口的Cancel2函数来取消本次异步读操作。当取消操作完成时,OnCancelComplete函数被激发。
删除Items,Group,关闭OPC服务器
调用连接点对象的UnAdvise函数断开连接,调用IOPCItemMgt的RenoveItems函数删除所有Item。,调用IOPCServer的RemoveGroup函数删除Group,释放IOPCServer接口,关闭OPC服务器。

