曾水根,刘 浏,刘万斌,丁俊健
(国电南京自动化股份有限公司,南京210032)
新一代保护软件开发平台系统(以下简称系统)是一个面向保护类产品PC机端工具软件快速二次开发的基础开发平台,使用Visual C++2010(以下简称为VC++2010)进行开发。
之所以选定VC++2010作为开发语言,是因为VC++2010为所有的VC++开发人员做了贴心而又周全的考虑。具体表现在其Ribbion界面可视化的设计、更加人性化的使用、提升了的安全可靠性、更加容易发布与部署简洁等特点[1],并且VC++2010对C++新标准C++0x全面支持。
系统大量采用.NET成熟的组件技术,降低二次开发及维护成本与风险,提供统一的语言、数据库、配置、通信、公共功能、日志、权限角色等公共模块,并可根据二次开发需求随意组装、删减模块,快速开发出满足实际工程应用需求的应用软件。
系统功能模块使用Visual Studio2010.NET作为主要开发工具,综合应用VC++2010的CLI、MFC、COM等技术实现封装和系统之间的跨进程通信,并利用Win32API技术实现和Windows系统间的交互[2]。
系统由多语言功能模块、数据库功能模块、串口通信功能模块、以太网通信功能模块、公共类功能模块、公用重写控件功能模块、权限角色功能模块和事件日志功能模块共八大功能模块组成。各功能模块项目开发为VC++2010的CLR类库项目。
系统项目开发过程中采用SVN进行多人同步开发的源代码管理,为避免不同模块间的名称命名冲突,充分运用标准C++引入的关键字namespace(命名空间/名字空间/名称空间/名域),每个功能模块拥有独一无二的命名空间名称。各功能模块命名空间名称原则上要反应出模块功能。为了省去每次调用模块成员都要添加“命名空间名::成员名”的麻烦,使用标准 C++的using编译指令(“using namespace命名空间名称”)来简化对命名空间中的成员的使用;同时,使用using声明来简化对命名空间中的名称的使用。
系统的串口、以太网通信功能模块以国电南自以太网103规约为实施标准。
总体功能框架如图1。
图1 新一代保护软件开发平台系统框架图
名称定义原则上要基本体现类型和意义。如以“CLR”开头的名称代表命名空间名称,以“lbl”开头的名称表示标签(Label)类型的名称,表示用户名有关的名称应该包含“username”字符,表示密码有关的名称应该包含“pass”字符等。
为方便二次开发人员快速的读懂程序,命名空间命名采用有名的命名空间命名法则,C++标准文档中的有名命名空间语句如下:
named-namespace-definition:
namespace identifier{namespace-body}[3]
简单描述为:
namespace命名空间名{
声明序列[可选]
}
命名空间名称从字面上要基本反映出模块的功能。如多语言功能模块命名空间名称为“CLRDllMLanguage”,其中“CLRDll”前缀表示类型为 VC++的 CLR 类库项目,“MLanguage”为“Multi Language”的简写,从字面上即体现出该模块功能和多语言有关。
各功能模块主要类的名称与命名空间名称差别仅在于前1-6个字符,这1-6个字符反应出功能模块类型。如CLR类型类库项目功能模块命名空间名前缀以字符“CLRDll”开始,而类以字符“C”开始。后面的字符基本相同,从字面上体现功能。如多语言功能模块的命名空间名称为“CLRMLanguage”,其主要类名为“CMLanguage”,从字面上很容易理解分别为多语言功能模块命名空间名称和多语言功能模块主要实现类的名称。
命名空间中的名称均使用有意义的名称,通过名称基本能反映出具体的类型和用途。
(1)对于控件类型的变量,前3个字符一般为控件类型名的缩写,后面的字符反应变量的作用。如“mnuAlltrip”表示这是个菜单项的名称,和跳闸功能有关。
(2)对于类的实例变量,变量名即为类名去掉前缀“C”(如果有)后余下部分的小写。如“commonfunc”为“CCommonFunc”类的实例。
(3)一般变量命名采用骆驼命名法规则,即混合使用大小写字母,第一个单词以小写字母开始,第二个单词的首字母大写或每一个单词的首字母都采用大写字母。如username,myFirstName。
各模块对应命名空间名称如表1。
(1)多语言功能模块
适应软件项目国际化的需要,实现多语言切换功能。
(2)数据库功能模块
根据系统设置中选择的数据库类型和位置提供相应的数据连接支持,以实现数据的提取、添加、修改及删除和统计等操作。
(3)串口通信功能模块
实现串口通信控件及相关功能的封装,二次开发人员只需创建该模块实例即可直接进行串口通信相应的设置、数据发送及接收等,而不用每次重复繁琐的串口控件创建与管理。
(4)以太网通信功能模块
实现以太网通信控件及相关功能的封装,二次开发人员只要创建该模块的实例即可实现以太网通信相应的设置、数据发送和接收及网络监听等功能。
(5)公共类功能模块
将使用频率较高的公用方法归集到公共类功能模块,方便维护或BUG查找及改进。
(6)公用重写控件功能模块
将使用频率较高且需要进行个性化定制的系统控件集中于此模块进行重写实现,以便根据实际情况需要对此类控件的限制条件统一进行调整。
(7)权限角色功能模块
纳入角色分级管理模式实现用户权限的划分。
(8)事件日志功能模块
自动记录用户每次操作并分类存档。
表1 新一代保护软件开发平台系统命名空间表
各模块主要类如表2。
表2 新一代保护软件开发平台系统主要类表
各个模块都要用到公共类功能模块,以公共功能模块为例介绍系统的模块实践和跨命名空间(这里其实就是跨模块)标识符的调用方法。
(1)COMSetT枚举
串口数据参数数据结构枚举,包含串口一般设置项,枚举项见图2。
图2 COMSetT枚举(部分截图)
(2)EvevtType枚举
图3 EvevtType枚举(部分截图)
列出事件/日志类型可能的列表,以便将事件按照所属类型自动分类,枚举项见图3。
(3)IniFile类
实现文本配置文件的读写,内含IniKey和IniSection两个类,类视图见图4。
图4 IniFile类视图(部分截图)
(4)ComFunc类
实现不同数据类型转换功能,类视图部分转换方法见图5。
(5)CCommonFunc类
公共功能模块的主类,类视图部分截图见图6。
图5 ComFunc类视图(部分截图)
图6 CCommonFunc类视图(部分截图)
(6)跨命名空间标识符使用
为简化代码,使用其它命名空间的标识符,可使用标准C++的using编译指令来简化对命名空间中的名称的使用,加入了“using namespace命名空间名称”后就可以直接使用该命名空间中的标识符了。当然还可以使用using声明来简化对其它命名空间中的名称的使用[4]。
基于以上设计,研发了新一代保护软件开发平台系统,并以此编写了以DGT801系列的发变组保护装置PC机端数据定义为目的的测试样例对其进行了测试[5],测试结果见表3。
表3 新一代保护软件开发平台系统测试结果
基于保护类软件系统功能复杂,且对数据传输稳定性、精确性要求高的特性,笔者选定VC++2010作为系统的开发语言,测试结果表明此平台系统完全符合保护产品PC机端软件的二次开发需求。
通过搭建一个性能卓越、技术先进、安全可靠、易于扩展、便以进行快速二次开发的基础平台,为后期发变组保护软件系统的升级换代及新产品开发提供了有效的技术支撑和保障。
[1]霍顿.Visual C++2010入门经典.5版[M].北京:清华大学出版社,2010.
[2]李瑞生,李燕斌,周逢权.智能变电站功能架构及设计原则[J].电力系统保护与控制,2010,38(21):24-27
[3]ISO/IEC14882,INTERNATION STANDARD of Programming languages-C++[S].
[4]吴克力.C++面向对象程序设计 ——基于Visual C++2010[M].北京:清华大学出版社,2013.
[5]颜炯,王戟,陈火旺.基于模型的软件测试综述[J].计算机科学,2004,31(2):184-187.