陈宏君,熊蕙,文继锋
嵌入式系统面向对象的多层次复用架构*
陈宏君,熊蕙,文继锋
(南京南瑞继保电气有限公司,南京211102)
在电力系统保护、工业控制等领域,通常存在冗余配置,需要减少开发工作量。本文以面向对象的复用思想,将程序进行模块化、元件化、图形化封装,支持元件多次实例和重用,并且支持页面封装和重用。通过以插件为对象进行镜像配置,实现插件之间功能、连线的镜像处理。不同层次的复用架构,减少了重复开发配置的工作量,提高了开发效率。
嵌入式系统;面向对象复用;图形化元件;镜像配置
嵌入式系统是嵌入对象系统中用于执行独立功能的专用计算机[1],早期由于资源和性能约束,多以人工编写汇编语言或C代码的方式进行应用程序的开发。随着硬件性能的提升和平台化的开发[2-4],图形化编程、模块化配置、可视化调试成为一种可行趋势[5-8]。随着应用的深入,基于图形化开发的复用功能成为一个迫切需求,例如在电力系统和工业控制领域,存在着冗余配置的应用。本文基于面向对象的设计思想,介绍了嵌入式平台的分层设计架构,设计了基于元件、页面、插件等不同层次结构的复用方案,对嵌入式图形化开发有借鉴作用。
嵌入式系统面向应用人员,可提供硬件、软件开发平台[2]。平台由硬件、系统软件、公共模块、可视化编程配置软件共同组成。通过平台提高研发效率,主要思路就是采用面向对象的设计思想,在系统软件屏蔽硬件差异并提供统一功能接口的基础上,基于成熟、可重用的公共模块,利用不同层级的复用架构,通过可视化工具实现装置快速集成研发。平台化分层结构如图1所示。
图1 平台化的分层架构
硬件层:装置或系统的硬件构成,提供最底层的服务支撑,为平台需求开发硬件,而不直接为应用需求开发硬件,不同应用的硬件功能相同(可裁减),性能可以存在差异,更好地支撑统一平台。
驱动层:封装硬件的访问接口,是硬件对上层软件服务的缓冲层,方便软件在不同硬件上的移植,提供基本的硬件访问服务,复杂服务可由上层软件封装,不允许上层软件服务直接访问硬件接口。
系统管理层:完成系统管理、任务调度、数据交换、动态注册等基本服务,类似计算机的操作系统内核,其稳定可靠,不依赖于硬件的具体形式,独立于后续的应用服务,一旦定型,基本无需修改。
公共服务层:在系统管理层、驱动层的基础上完成多种装置公共的软件服务,与系统管理层、驱动层一起合并后等效为计算机操作系统。通过模块化、可扩展的方式,采用平台沉淀为软件资产库。
可视化开发配置层:提供通用和专用符号库的编辑方式,支持以模块化元件为粒度的图形化页面配置,完成装置功能开发。
专业公共服务层:实现不同专业方向对数据的专用处理,其具有模块化、可重用、专业内统一、小范围维护的特点。
应用层:在驱动层、系统管理层、公共服务层、专业公共服务层的支持基础上,用可视化编程配置软件完成应用功能的软件服务。
对象是系统中描述客观事物的实体,由对象标识、属性、服务3个要素组成,封装为一个整体,以接口的形式对外提供服务[9]。本文将面向对象的设计思想引入到嵌入式应用开发中,支持如下层次结构的复用:
①元件:是完成某个具体功能的一组数据和对数据进行处理的过程,处理完后输出的数据供其他元件进一步使用,元件包含输入、输出、参数、图形等内容。
②页面:图形化页面由若干元件实例、页面输入符号、页面输出符号、连接线组成,是元件(类)的组合。
③插件:插件反映了嵌入式硬件的物理结构,可代表单核或多核处理器,为运行程序提供支持系统,为输入输出通道提供界面和接口,插件程序由若干图形化页面和系统库组成。
2.1元件复用
元件完成一个特定的功能,有比较明确的输入输出定义和参数定义。以过流保护功能为例,输入是计算元件的三相电流幅值,输出是过流标志及跳闸标志,参数包括过流门槛值、延时时间、投退压板,任务函数就是根据输入和参数完成过流保护判定。
元件包括源代码定义.h/.c文件、编译后的目标文件、图形接口文件。在元件文件中定义数据结构体,包括输入变量、输出变量、参数、内部变量等。
例如过流元件:
在元件的C文件中定义元件构造函数、初始化函数、任务函数。在构造函数中调用calloc函数分配数据结构体,并调用系统接口注册结构体首地址信息;在初始化函数中完成变量初始化,并将任务函数添加到任务队列中。在系统的中断函数或定时执行函数中执行对应等级的任务。
高质量的元件源代码是可视化编程配置复用的基础,其设计的原则如下:
①高内聚、松耦合。对各种嵌入式装置的保护测控功能进行粒度适中的划分,形成模块名称定义和功能定义。
②统一的成员变量命名和模块接口,对元件中使用的各种变量命名进行规范,保证各个元件的编程风格统一;在输入、输出、参数、逻辑处理方面,综合考虑各专业的应用需求,对各个模块的属性设置标准化,防止使用的随意性。
③统一的标准子程序库。对常用的公用函数,例如傅氏计算、复数、比较、求和等进行标准化函数库设计。
通过对划分的应用元件进行统一的需求分析、方案设计、接口定义、编码测试等步骤,可形成高可靠、可重用的图形化元件库,即可支持以元件为单位的功能共享和图形化组态。研发人员可以从元件库中选择功能元件,进行可视化连线,实现装置程序的快速集成。可视化编程配置软件针对插件内的元件输入输出连接,在main函数中形成指针赋值代码,针对插件间的元件输入输出则基于层次变量名形成配置文本,由系统软件完成地址映射,通过数据总线交换数据[2,6,7]。图2显示了从模块化元件库中挑选各功能模块集成装置的过程。过流元件的2个实例通过传入不同的实例形参名进行实例创建:
OC1=new OVer Current(“OC1”);
OC2=new OVer Current(“OC2”);
图2 基于模块化元件集成装置示例
2.2页面复用
图形化编程页面是由元件实例搭建形成,在使用过程中,存在将一页或多页的图形化程序进行封装重用的需求,即将若干页面程序封装为可重用的符号库,通过实例化、图形化库页面,功能可多次重用。通过重用功能稳定的页面,可以加快开发效率,提高软件质量。另外图形化程序由于直观易于理解,在面向用户浏览时需要进行相关细节的信息隐藏,只给用户提供顶层封装模块,不用开放源图形页面程序,从而有效保护核心技术。将页面视为组合元件类,由若干子元件实例组成,页面复用的实现步骤如下:
①基于元件库搭建页面功能,通过连接线进行元件间的数据连线,根据页面输入输出块定义对外的引脚和在页面符号上显示的顺序和名称提供工具,可分析页面程序和拓扑连线,自动形成封装后的页面封装图形符号。
②将页面符号按照从上到下、从左到右的顺序初步排序,再按照数据流依赖关系进行二次排序,依次将编程符号对应的变量声明为结构体,并输出到页面数据定义的.h文件中。
③页面功能调用的对外调用接口形成到.c文件中,包括页面的构造函数、初始化函数,其中在相关函数中依次调用子元件的接口,然后调用相关编译器,形成对应的二进制OBJ文件。
④将封装后页面的图形文件、头文件、二进制OBJ文件放入到符号库目录。从符号库中选择相应的页面封装符号,设置符号的数据结构体实例名,形成不同的数据实例,传入不同的形参,调用相同的构造、初始化、运行接口,实现功能重用。
⑤图形化页面程序可以是基本元件、封装库页面的组合,可对包含封装页面实例的页面进行二次封装,记录子页面的结构体名字信息,对二次封装的库页面进行重用时,可自动分析其依赖的子页面函数和文件。支持对封装后的库函数进行组合重用的页面进行二次封装重用,实现图形程序分层设计,易于自上而下理解程序架构和集成,进而开发模块。
如图3所示,定义了TRIP TA、TRIP TB两个实例,通过调用run TRIP(TA)、run TRIP(TB),传入不同形参,执行相同函数体代码。
2.3插件复用
在电力系统保护测控、工业控制等应用领域,为了提高嵌入式系统的可靠性,往往进行功能冗余配置,以图4为例,高压主变保护装置采用保护+启动的双重架构,用两块插件进行相同的数据计算和处理,并进行数据和逻辑的相互校验,避免因某块插件出现故障时装置误动。在冗余配置模式下,由于程序的内部功能和外部输入源相同,仅出口不同,研发人员、用户在源插件进行图形化程序配置时,迫切希望能减少配置的工作量,只进行源插件的功能配置,在设置镜像插件的ID后,其配置能自动同步,这样可减少一半的开发工作,并避免了在修改一个插件的数据时,未修改其他插件的数据,导致功能配置和数据设置不完全匹配,故还需支持插件级复用功能。
图3 页面封装重用实例
图4 保护+启动的硬件结构图
当以插件为单位进行镜像配置时,其实现流程如下:
①点击装置的硬件配置界面,设置源插件的镜像插件ID,例如设置图5中源对象为第2号槽的插件ID为B02,镜像对象为第3号槽的插件ID为B03,并设置B03的图形化配置节点隐藏不显示。
②以图形化的方式进行源插件的功能配置,工具支持同步刷新变量库的源插件、镜像插件显示。编辑操作包括新建删除页面、新建删除功能元件符号、进行本插件内符号之间的数据拉线。在新建页面、符号时,图形编辑模块以事件的方式通知变量库模块,变量库模块接收到事件后,根据事件类型更新层次显示节点,源插件节点展示新建的页面和符号的数据,并且镜像插件变量库节点也同步复制并展示相同内容,两者的区别是,源插件和镜像插件的变量前缀不同,例如源插件的变量前缀为“B02.”,镜像插件的变量前缀为“B03.”。当删除页面、功能元件符号时,变量库在B02、B03的节点下同步删除相关内容。当修改页面名、功能元件实例名时,变量库同步刷新新的名字。
③进行插件间信号拉线。从变量库拖拽输入输出变量,释放到图形化页面,在鼠标释放点自动形成输入输出端子符号,该符号记录层次变量名。如果是源插件和镜像插件的拉线,从变量库中镜像插件B03节点下,拖拽输入变量,释放到B02的图形化页面,在鼠标释放点自动形成输入端子符号,并将B02元件的输出变量拉线给B03输入端子符号;支持从变量库中镜像插件B03节点下拖拽输出变量,释放到B02的图形化页面,在鼠标释放点自动形成输出端子符号,并将B03输出端子拉线给B02元件的输入变量。
④形成源插件配置文本。保存装置的硬件配置、图形化配置等内容,调用数据处理模块,导入并分析源对象页面数据,按照嵌入式装置定义的文件格式,形成源对象的配置文本:汇总各个页面内实例功能元件列表,按照元件结构名、元件实例名、元件命令形参的顺序输出如“OverCurrent OC1 args”的元件文本段。分析元件之间的变量拉线,包括外部插件输出给本插件的输入拉线、本插件内元件之间的拉线、本插件输出给其他插件的拉线、解析元件内脚本函数,输出如“B02.OC1.out1->B02.”。And2.in1的拉线文本段
⑤形成镜像插件的配置文本。从源对象中复制功能元件符号的数据列表、对象内部的数据连线信息。外部对象的输出作为源对象的输入,也同步输出给镜像对象的输入、实现两者之间功能、连线的镜像复制。对于外部插件B12给B02的拉线:例如“B12.BI_Din1->B02.OV1.in1”则在镜像插件的配置文本中,处理为,“B12.BI_Din1->B03.OV1.in1”。对于源插件内部拉线,例如“B02.And2. out1->B02.Not.in1”则在镜像插件的配置文本中,处理为“B03.And2.out1->B03.Not.in1”。
⑥处理装置定值文件。对于未分组的镜像插件的定值变量,通过层次变量名进行匹配,查找源插件对应变量的定值设置项,合并到源对象的定值分组项,作为1个等价变量合并设置。例如“B03.OC1.I1n”未分组设置,源插件“B02.OC1.I1n”分组到装置参数组中,则将两个变量合并为1个定值,合并后的定值文本片段为“B02.OC1.I1n B03.OC1.I1n=1000”,表示2个定值默认设置为1000,如果通过LCD液晶、后台等进行整定时,只需设置1次,对2个变量同时生效。
本文以面向对象的复用思想,将嵌入式程序进行模块化、元件化、图形化封装,支持元件和页面多次实例和重用,实现以插件为对象进行镜像配置,通过对源插件进行图形化页面编程后,在数据处理阶段,形成镜像插件的配置文本时,从源插件中复制功能元件列表、插件内部的数据连线信息,实现两者之间功能、连线的镜像处理。通过不同层次的复用架构,实现了元件、页面、插件的重用性、继承性、安全性,减少了开发配置的工作量,提高了开发效率,在交直流保护控制、工业控制等多种领域的装置程序开发中取得了显著的经济效益。
图5 图形化插件复用原理图
[1]Elecia White.嵌入式系统设计与实践[M].北京:机械工业出版社,2013.
[2]李响,刘国伟,冯亚东,等.新一代控制保护系统通用硬件平台设计与应用[J].电力系统自动化,2012,36(14):5255.
[3]王培进,李晓路.嵌入式系统集成开发平台的设计与实现[J].计算机应用与软件,2012,29(5):10113.
[4]陈海生,邓锐,王峰,等.可复用的基于ARM的W5100底层驱动设计[J].单片机与嵌入式系统应用,2013(3):3942.
[5]陈宏君,刘克金,冯亚东,等.新一代保护测控装置配套工具软件设计与应用[J].电力系统自动化,2013,37(20):9296.
[6]刘克金,陈宏君,冯亚东,等.新一代控制保护系统可视化编程软件设计与实现[J].工业控制计算机,2014,27(10):8287.
[7]陈宏君,冯亚东,文继锋,等.嵌入式程序动态分配内存的调试方案设计[J].单片机与嵌入式系统应用,2015(9):18-21.
[8]谢扬,潘子豪.易安卓开发平台可视化界面在智能家居领域的应用[J].单片机与嵌入式系统应用,2015(9):1417.
[9]希赛教育软考学院.系统架构设计师教程[M].北京:电子工业出版社,2014.
陈宏君(高级工程师),主要研究方向为嵌入式软件平台开发。
Object-oriented and Multi-hierarchy Reusing Architecture of Embedded System
Chen Hongjun,Xiong Hui,Wen Jifeng
(NR Electric Co.,Ltd.,Nanjing 211102,China)
In the power system protection and industrial control and other fields,there is usually redundant configuration,so it is necessary to reduce the development work.Based on the object-oriented reuse design,the program is modular,component,graphical package.The method supports to reuse graphical components for many times,and supports page graph package and reuse,and also supports to reuse the board's function and data linking by image set.Through the different levels of reuse architecture,the method reduces the workload of iterative development configuration,and improves the development efficiency.
embedded system;object-oriented reuse;graphical component;mirror configuration
TP393
A
��薛士然
2016-04-14)
国家高技术研究发展计划(863计划)资助项目(2015AA050101)。