1、OPCserver OPCGroup OPCItem的关系
一个OPC服务器的开发,主要包括两大部分的工作:OPC接口的实现和设备驱动部分的开发。 OPC接口的实现,实质上就是按照OPC标准进行COM接口开发,对于大多数的OPC服务器开发者来说,我认为没有必要涉足。目前市场上有很多OPC服务器开发工具,国内外都有,当然价格也不尽相同,调研一下的话应该会找到适合自己的。有必要进行OPC接口开发的大致有这几种情况:1、有实力的大公司,OPC相关产品较多,需要对OPC技术进行深入了解;2、OPC服务器开发工具厂商;3、对OPC技术感兴趣的个人、院校及研究机构。除此之外,一般没有必要一头扎进COM的泥沼,去和内存分配、线程管理等繁琐的事务打交道。
OPC(DA 2.0)里主要定义了两个对象:OPCServer 和 OPCGroup。OPCServer对象是OPC服务器的核心,它提供的接口函数主要包括对OPCGroup对象的管理、OPCItem属性查询、连接点管理、以及地址空间浏览(可选)等。OPCGroup 对象的主要作用是管理一组数据项(Item),包括数据项的同步/异步访问、添加删除、属性查询等。从客户程序角度看,访问一个OPC服务器的过程大致是首先创建一个 OPCServer 对象,然后通过它创建一个 OPCGroup,在其中添加想要访问的数据项,之后利用订阅回调机制周期性获取动态数据或通过读写接口直接访问数据项。
2、OPC服务器测览地址空间的实现
OPC服务器的测览地址空间主要供客户端程序查看OPC服务器中可访问的数据项(Item)的信息,客户端程序可以先测览地址空间,再往Group里添加自己感兴趣的数据项。OPC服务器中的服务器(Server)对象下的IOPCBrowseSewerAddressSpace接口实现该功能。
要注意的是,不同的DCS其OPC服务器的测览地址空间的实现方法也不同,但共同点是:
a.设计地址空间的体系结构;
b.实现地址空间的查询。
所谓地址空间体系结构的设计,就是指OPC服务器把服务器内部能访问的数据项以一定的层次结构组织起来。地址空间的查询实现是指在设计完地址空间的体系结构之后,客户程序调用IOPCBrowseSewerAddressSpace接口中的函数,能获得地址空间不同层次上节点(Node)的名字信息。以XDPS400为例,服务器内部能访问的数据项就是XDPS400实时数据库中的全部全局点。为了实现OPC服务器的测览地址空间,在服务器初始化时加载XDPS400的全局点目录组态文件Pointdir.cfg(点目录组态文件定义所有全局点的标识、显示格式、描述、源节点等信息)。由此获得XDPS实时数据库中的所有全局点的名字信息(ItemID)。
地址空间体系结构的设计中服务器的地址空间采用分层结构,在地址空间中,本身没有下层节点的节点称为Leaf,有下层节点的节点称为Branch。地址空间分成3层,第1层是唯一的一个Branch型节点Root,第2层是2个Branch型节点Analog和 Digital,把全部全局点区分为模拟量和数字量,第3层的节点都是Leaf型节点,它们的名字就是全局点目录组态文件Pointdir.cfg中各个全局点的名字标签,地址空间体系结构如图2所示。
3、异步I/0通信实现
在基于DCS的OPC服务器设计中,使用异步I/0通信方式能减少DCS的OPC服务器和客户端程序(比如SIS)之间的通信次数和通信流量,提高通信效率。OPC服务器和客户端程序实现异步I/0通信主要是由服务器调用连接点接口IOPCDataCaback中的函数OnDataChange实现的。在文中的异步I/O通信中,实时数据的刷新采取类似例外报告的机制,在一个刷新周期过后,只有当数据项的当前值不同于上一次的历史值时,服务器才会调用函数OnDataChange,通知客户端程序,并给客户端程序发送这个数据项的最新当前值,若是数据项的当前值和历史值相等,则既不通知客户端程序也不发送值。异步I/0依赖于COM机制中的连接点,在开发过程中可以参考以下文献:文献[13]阐述了COM中连接点的概念,文献[14]对利用ATL实现连接点作了详细说明,文献[10]介绍了利用定时器实现每个组(Group)在各自时间周期下的数据刷新,实现异步I/0通信。
联系客服