戴赛1 李晓明1 陈少明2
(1.武汉大学,湖北武汉430072;2.孝南供电局,湖北孝感432000)
随着电力系统信息化的不断发展,在一个电力企业内部,往往同时存在着不同厂家开发的各种电力系统应用软件,如SCADA系统、调度自动化系统、MIS系统、地理信息系统、操作票智能生成系统等。在这些应用软件中,经常要有界面友好的图形系统,它们是由不同的开发厂家分别独立开发,虽然能满足各自的要求,但不能做到很好的系统集成,往往存在着功能重复设计,即增加一个应用系统时,整个图形系统又要重复设计,重复开发等问题,这样极大地浪费了开发人员的时间,增加了企业的负担。增强软件复用性,提高软件生产率是一个亟待解决的问题。
电力企业的应用软件应按照系统开放的原则,遵循共同的标准,做到插入兼容性(Plug-Compatible),从而提高系统集成度。微软公司推出的COM/DCOM标准为此提供了有效的工具。
组件对象模型(ComponentObjectModel/DistributeCOM即COM/DCOM)技术是继模块化、结构化,面向对象开发方法之后,发展起来的又一新的软件开发方法。它主要思想是将一个对象的外观(接口)同其工作方式(实现)分离开来〔1〕,这一封装思想应用到二进制层次上,使得我们可以在COM架构下开发出各种各样的功能专一的软件“积木块”,然后根据需要将其装配起来构成复杂的应用系统,最大程度地实现了软件的复用。
1 组件对象模型
1.1 COM标准
COM标准包括规范和实现两大部分。COM规范是一套为组件架构设置标准的文档,它定义了组件与组件之间的通信机制,这些规范不依赖任何特定的语言和操作系统。COM实现部分是一个COM库(COMLibrary)的API(ApplicationProgrammingInterface),它为COM规范的具体实现提供核心服务。
1.2 COM工作原理
COM本质上是客户机/服务器(C/S)模式。当客户通过传递一个组件类的CLSID(ClassIdentifier)请求其服务时,Windows通过注册表透明地查找到组件对象地址,然后创建该组件对象,并把客户请求的接口指针回传给客户。在COM模型中,客户请求服务时,只是通过GUID(GloballyUniqueIdentifier)获取接口指针,从而调用其相应的成员函数。而COM对象对客户而言是不可见的,客户只是通过接口才感受到对象的存在。对客户而言,接口便是一切。
COM接口规范规定,所有接口都必须直接或间接地从IUnknown接口继承。IUnknown接口只有3个函数:QueryInterface()用于接口查询,AddRef()和Release()用来维护对象的生存期管理。COM对象可支持多个接口。
C++通过实现继承来支持重用,即一个类继承其基类的代码或实现,COM对象重用机制为接口继承,它指的是一个类继承其基类的类型或接口,实现方法有2种:包容(containment)或聚合(aggregation)。包容是指外部对象A作为内部对象B的客户调用内部对象B的方法来实现自己的功能。
聚合是指外部对象A将内部对象B的接口暴露出来,就象它自己的接口一样。
组件程序通常有2种实现形式:一种是动态链接库,运行时客户程序与组件程序运行在同进程地址空间,故也叫进程内组件;另一种形式是EXE文件,这种组件运行时,客户程序和组件程序运行在不同的进程地址空间,故也叫进程外组件。
当跨越机器的边界时,为适应分布式环境,微软推出了DCOM,进一步提供位置透明性。
总的来说,COM的特点有:语言无关性。它采用的是一种二进制代码级的标准,而非源代码级的标准;进程透明性。客户与服务器既可以在一个进程中,也可不在一个进程中;位置透明性。客户与服务器既可以在1台机器上,也可跨越网络;版本兼容。组件可以在不妨碍已有客户的情况下被升级。
1.3 COM组件开发
现在微软公司在VisualC++中提供了2种方法来开发COM组件:MFC库(MicrosoftFoundationClassLibrary)和ATL模板库(ActiveTemplateLibrary)。MFC不仅可用于建立COM应用,而且是一套Windows平台上各种应用开发的基本类库。ATL主要侧重于开发一些小巧、快捷的COM组件。
2 电力系统实时图形系统设计方法
2.1 总体设计
文章致力于利用MFC库开发一个可复用的电力系统实时的图形系统,从而为众多电力系统应用软件提供开放的、统一的图形用户界面。系统的总体结构如图1所示。
作为一个图形子系统,要有良好的用户界面,每种图元都应有显示、编辑、删除等功能,即图形元件的显示、旋转、缩放、移动、填充颜色、状态改变等子操作。
为保证图形系统实时反映设备当前状态,需要将本系统与实时数据库相连,动态刷新设备当前状态,以满足电力系统对图形系统实时的要求。
为保证绘图子系统有更好的重用性,本系统还将图元属性保存在数据库中,以便与其它系统更高效地进行数据交换。数据库要保留元件的静态参数和状态属性。
2.2 绘图子系统功能实现
在开发时,我们选用MFC库来开发各组件对象。MFC库作为事实上的Windows类库标准,也提供了全面的COM支持,可方便地开发出各种COM应用。
根据面向对象的思想,将电力系统中的各设备元件都封装成相应的类(如图2)。
以开发一个断路器组件为例,介绍主要开发过程。
首先利用VisualC++6.0新建一工程,工程类型为MFCAppWizard(DLL),选择Automation支持,其它保持缺省设置,从而获取动态链接库的6个标准导出函数。
在工程中新建一文件用于定义一组接口。接口均直接派生于IUnknown。按照系统功能,定义的主要接口有:
IInit用于初始化元件的各种属性;IShow用于元件的显示、编辑、修改等功能;IState用于设置与查询元件状态;IRealTimeDB用于与实时数据库相连,以及时更新设备状态;IDatabase用于处理该图形与数据库连接,保存图元各种属性。
由此定义具体的COM组件类。
利用ClassWizard新增断路器类CBreak,该类派生于CcmdTarget类,将接口定义文件加到该类声明中,用MFC提供的宏可方便的为COM类增加类厂支持和接口支持。
在实现文件中,根据断路器的具体情况书写各接口函数。这样利用MFC提供的聚合模型实现了一个COM组件(见图3),最后编译成独立的DLL文件(Dynamic-linklibrary),经过注册之后,便可方便地实现动态联接。
在以后的系统功能升级中,若不满意当前某个接口的具体实现,我们可直接更改它的具体实现,编译注册后,便实现了升级,而不需客户程序作任何改动。若随着系统的要求变化,组件要增加新的功能,我们只需定义新的接口及接口函数,在组件中实现即可。
2.3 与数据库的连接
在组件类的实现中,为了能与电力系统其它应用系统方便地交换数据,我们采用了数据库文件来存储图形的各种属性信息。我们用ADO(ActiveXDataObject)来访问数据库〔4〕,ADO是微软公司继ODBC,DAO,RDAO,OLEDB之后新近推出的基于COM双接口的数据访问方法,它具有方便灵活,简单易用的优点。
为使用ADO模型需要[1][2]下一页