刘 伟,孔袁莉,雷斯聪,郑 柏,李晶晶
(上海航天设备制造总厂有限公司,上海 200245)
控制软件[1-3]是运载火箭型号各类软件中非常重要的一类软件,该类软件负责控制流程的执行和调度,以自动的方式调度各子系统和各单机,使子系统和各单机按照规定的逻辑在规定的时间段内完成规定的任务。由于火箭测试的流程由控制软件来进行发起和判断,因此控制软件是运载火箭型号中重要程度较高的一类软件。在传统的模式下,各型号都会有特定的控制软件,软件由特定的人员进行研发和维护,各型号之间的控制软件设计和实现以实现本型号的需求为主,型号间的需求并不做过多的考虑。该种模式下,由于不同设计人员采用的设计方案和使用技术的原因,各型号之间的控制软件即使有相同的功能,相互之间复用的难度也较大。这种模式下,型号间相同的功能存在重复开发的情况,并且在软件的维护上也存在效率不高的情况。
本文针对传统模式下,设计和维护效率较低、功能重复开发等缺点,为了提高软件的设计和维护效率,设计了基于面向对象[4]的通用[5-8]控制软件,对控制软件的业务逻辑和业务过程进行了分析,将控制逻辑抽象为可组合的类。用户可以根据需要自由组合各控制逻辑类,并将结果以XML的方式保存在本地磁盘。软件会读取并解析XML文件,将XML文件的内容解析为对应的逻辑控制类,以执行用户配置的控制逻辑。
通用控制软件主要功能是对流程进行控制,需要根据已经和正在执行的控制命令,判断任务的执行是否正确,是否继续执行下一个控制命令。
通过对控制软件的需求进行整理和分析,对现有型号的控制软件的设计和实现方案进行归纳总结,将控制软件依据功能划分为相对独立的4个模块:数据源模块、数据解析模块、命令模块、工具模块,功能模块图如图1所示[12]。
图1 软件结构图
数据源模块的功能是实现数据传输。通过对具体需求的实现,命令传输可使用Socket套接字、串口和Http等传输方式[13]。
数据处理模块的功能是实现数据转换。主要功能有两个:第一是将命令和命令参数转换为数据源可传输的数据形式;第二是将数据源接收到的数据转换为命令或命令的参数。常见的形式是对网络传输(TCP、UDP)字节序列和实体类进行相互转换[14]。
命令模块是控制软件的核心模块。用户根据实际的功能需求,可以使用现有的命令组合成需要的控制功能,也可以自定义新的命令类,实现当前不具备的功能。命令的关系是松散的,命令之间可以相互组合为新的命令,组合出的命令可以像普通的命令一样进行进一步的组合[15]。
功能模块是辅助模块。对软件代码中的一些常用操作进行封装,减少常用功能的重复开发。
通用控制软件由控制命令、命令存储及解析、命令数据传输和命令数据正确性判断4部分组成。为了提高控制类软件的通用性和开发、维护的效率,对传统模式下的业务进行进一步分析,将具有相同功能的业务抽象封装为类,将可变的功能抽象为接口,为后续的功能扩展提供接口。通过将软件功能进行模块化,对软件核心功能控制命令进行可配置化处理,提高了软件开发、维护的规范性和效率。
为了验证通用控制软件方案的正确性,需要用户控制命令的执行并将执行的状态向用户反馈。软件在Visual Studio 2010平台上采用C#语言进行设计和实现,以Windows窗体界面风格实现人机交互。
通用控制软件核心原则就是面向对象方法中的“对扩展开发,对修改封闭”原则,是指将控制类软件的相似的功能进行整合,用户的可变需求通过扩展实现,而不需要更改原有逻辑,通过软件的可扩展性保证软件的灵活性和稳定性[16]。
在通用控制软件的设计过程中,不仅需要考虑软件的扩展性和可维护性,而且还需要考虑对现有型号的专用控制软件的兼容性,以确保设计的软件能够更好地适应型号的需求[17]。通过对软件的需求进行分析,对现有型号的专用控制软件的设计方案和使用场景进行归纳总结,通过使用面向对象分析与设计技术,将当前涉及到的控制操作转换为软件代码中的类,目前包括1个父类和10个实现类,父类参考建造者设计模式,通过模板类的形式为子类提供统一的业务逻辑的执行顺序,实现类根据需求实现特定的操作,实现类之间可以以积木的形式组合成新的命令,完成复杂的控制逻辑。软件类图如图2所示。
图2 软件类图
通用流程控制软件的执行流程如图3所示。
图3 软件执行流程图
为了提高软件维护的灵活性和便利性,控制流程被保存在本地磁盘上的XML文件,用户通过修改该XML文件即可达到更改控制逻辑的目的。
软件工作的具体流程如下:软件启动后,软件会根据用户配置的保存控制流程的XML文件的路径,自动加载该XML文件并解析为控制命令。在成功解析到控制命令后,软件会将控制命令以人机交互界面的形式呈现,便于用户使用[18]。
在通用控制软件的设计时,通过对现有型号的控制软件的业务功能进行分析,发现现有型号的控制软件在业务功能上和流程控制逻辑上有相似的部分,这一部分属于冗余的重复开发的部分。
面向对象分析与设计(OOAD,object orient analysis & design)的优点就是能够构建与现实世界相对应的问题模型,并保持他们的结构、关系和行为为模式,通过对业务逻辑的合理的分析和设计,有效的避免重复的部分[19]。
通过面向对象分析和设计技术对软件的业务逻辑进行抽象和分析,将业务逻辑中需求的实体提取成类,功能提取成方法。各个类的含义如下:
Command类:命令类的基类,定义命令的基本属性。
ComplexCommand类:命令的一种实现,是一组命令的集合,将多个命令组合成一个命令,完成命令的执行和执行成功、失败的判断。
AllSuccessCommand类:复合命令的一种实现,是指所包含的所有命令均执行成功,该命令执行成功,否则该命令执行失败。
OneSuccessCommand类:复合命令的一种实现,是指所包含的任意一个命令执行成功,该命令执行成功,否则该命令执行失败。
DataCommand类:命令的一种实现,数据命令类,是指该命令需要进行数据交互。
CircleCommand类:数据命令的一种实现,循环数据命令,是指该命令需要多次进行主动的数据推送,而不需要数据回馈。
DataReplyCommand类:数据命令的一种实现,数据回馈命令类,是指该命令需要主动推送数据并需要回馈数据。
DataQueryCommand类:数据回馈命令类的一种实现,数据查询类,是指该命令需要主动推送数据并对回馈数据进行判断。
AlertCommand类:命令的一种实现,警告命令,该命令是对用户操作的一种提升,用户可在控制流程中,通过弹出警告对话框以实现控制流程的用户确认。
ConfirmCommand类:命令的一种实现,确认命令,该命令是对用户操作的一种提升,用户可在控制流程中,通过弹出确认对话框以实现控制流程的用户选择。
SleepCommand类:命令的一种实现,延时命令,该命令是用于自定义延时,用户可根据需要定义延时命令的时机和延时的时间。
通过对业务逻辑进行建模和分析[9],将命令抽象成类。同时考虑到用户需求和软件设计的扩展性,将一些非功能性需求的功能也提升为命令,如界面中的弹出窗口等,以提升软件的维护性,提高软件的维护效率,降低软件的维护成本[20]。
在分析出功能性需求和非功能性需求的命令后,再通过面向对象中的继承和多态技术,达到屏蔽细节而实现不同功能的目的。举例而言,AlertCommand和SleepCommand是两个功能完全不同的命令,但是这两个类均继承于Command类,则这两个类就可以以相同的方式使用。AlertCommand实现弹出一个警告对话框,只有在用户选择确认后流程才继续执行,否则流程一直等待;SleepCommand则是一个延时命令,延时会自动执行,直到延时完成或用户终止流程[21]。
在上诉的抽象设计下,不用的命令之间可以相互组合,多个命令也可以组合成一个命令。组合出的命令又可以和其他命令进一步组合成更复杂的命令。这种组合方式类似“搭积木”的方式,软件业务中有不同的类,但是提供相同的“外形”(接口/父类),那么不同的类就可以在一定的规则下进行自由组合。用户通过这种“搭积木”似的命令组合,已达到用户期望的控制逻辑的目的。
XML(extensible markup language),可扩展标记语言,是一种基于文本、跨平台的结构型标记语言,可用于保存和传输数据,用户可以非常方便地使用文本编辑工具对XML文件进行编辑,完成测试流程的添加、修改和删除操作。
用户将多个命令按照一定规则组合成测试流程,测试流程需要持久化[10-11]后才能永久保存,否则就只能临时存在于内存中,软件关闭后数据丢失,无法再次使用。为了便于用户对测试流程进行维护,采用XML文件作为测试流程持久化的方式,通过序列化和反序列化的方式高效的实现持久化文本与软件代码的相互转换。
在通用控制软件中,为了便于管理和维护,设计了继承“AllSuccessCommand”类的子类“TestProject”作为一个项目,其他的命令实现类可以以自身或者多个实现类组合成的新命令作为项目命令集合的一个子项,通过类似“搭积木”的方式将各个实现类组合成一个实现特定要求的测试项目。
举例而言,新建一个名为“测试项目”的测试流程,设计项目包括一个名为“测试一”的任意成功命令;“测试一”由一个名为“测试一1”的任意成功命令和一个名为“测试一2”的全部成功命令组成;“测试一1”由一个名为“测试一11”的选择确认命令和一个名为“测试一12”的查询命令组成;“测试一2”由一个名为“测试一21”的确认命令和一个名为“测试一22”的选择确认命令组成。
测试流程结构如图4所示。
图4 测试项目结构
测试项目的执行流程如图5所示。
图5 测试项目执行流程
测试项目持久化为XML文件的情况如下所示:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> Attempts="1" AttemptInterval="500">
举例中的测试流程的设计过程,测试流程的新增或修改完全是在对配置文件的新增或修改的方式上完成的,不需要进行任何代码的修改,实现了软件代码设计和维护的分离,维护人员只需要按照规定的方式进行XML文本文件的新增和修改即可实现测试流程的新增和修改。而且在软件设计和实现时按照模块化和插拔式的原则,使得基础的各种控制命令和组合出的控制命令可以进行无差别的组合,通过类似“搭积木”的方式,将各种基础命令和组合命令组合成具有更复杂功能的命令。
为了验证本文的设计和实现思路的可行性,软件二次开发和维护的效率。二次开发的过程以实现现有的XX-6型号的等效控制软件功能的方式进行。
XX-6型号等效控制软件的通讯方式采用TCP网络的方式,数据交互对象为一个上位机软件,根据型号对控制软件的设计要求,二次开发的过程主要由3个步骤组成:
1)根据数据源模块的接口要求,设计一个TCP网络通讯数据源模块,完成控制软件与交互上位机软件的TCP网络通讯。
2)根据数据处理模块接口的要求,依据XX-6型号的数据格式,设计满足型号实际需求的数据处理模块,完成命令、命令参数与二进制数据的相互转换;
3)根据命令模块要求,依据XX-6型号控制逻辑要求,软件提供的基础命令类能够满足功能要求,只需按照要求新建测试流程的XML文件。
在通用控制软件基础功能的基础上,XX-6型号控制软件的开发过程只需要对差异性的模块进行二次开发,相同的功能模块无需重复开发,控制流程的修改可以通过修改文件的方式实现,开发和维护的效率显著提高。
在开发过程中,控制软件相似功能的部分,如简单命令成功、失败逻辑控制、复合命令成功、失败判断及控制、控制流程持久化等无需重复开发;特殊需求,如各型号的数据解析、数据合格性判断等可通过扩展的方式实现,而不影响原有的业务逻辑。
在维护过程中,由于采用了统一的设计思路,测试流程也存储在XML文件中,测试流程的维护的效率也得到了提高,降低了后期维护的成本。测试结果达到了预期的目的。
但是在开发过程中也发现了一些不足之处,控制流程的修改是通过对XML文件的修改来实现,但是XML文件的编辑是直接手动修改文件,目前还没有提供可视化的编辑方式,用户需要熟悉XML文件中的每个标签的含义,编辑时的错误也不容易发现,后续提供可视化的操作接口,用户可以在软件中编辑测试流程并自动保存为XML文件,这样可以减少人为的文本编辑错误,用户也无需了解XML文件的标签所代表的含义,降低测试流程维护的难度,进一步提高软件维护的效率。
针对传统模式下,各型号的控制软件相互间通用性低、相似功能重复开发的问题。设计了一套基于面向对象的通用控制软件。对软件业务流程中的功能性需求和非功能性需求进行抽象和分析,将业务需求中的实体抽象成命令类,并将部分非功能需求也提升成命令,使得用户可以通过类似“搭积木”的方式组合各种命令。
通过采用统一的设计思想和通用化设计,提高软件开发和维护的效率,节省了软件开发和维护工作的人力成本,在应对当前的高强度任务方面具有重要意义。