舰船操纵控制系统是舰船上用于改变或保持航速、姿态、航向、深度[1]的自动控制系统,是保障舰船生命力和遂行作战使命的重要关键装备[2]。该装备上运行的舰船操纵控制软件系统是典型的分布式多任务异构嵌入式系统,功能涵盖避碰决策、航路规划、航迹控制、航向控制、舵角控制、姿态控制、推进控制以及水下载体特有的深度、潜浮、均衡、悬停控制[3]等功能,如图1所示。作为嵌入式系统具有硬件依赖性[4],不同型号设备的硬件平台差异较大,诸如总线形式、硬件驱动、操作系统、通信协议皆是形态各异,一般都是专为特定型号专门设计[5],无法实现软件整体复用。为了屏蔽底层软硬件平台差异,实现功能模块基于数据运行达到即插即用的目的,从而最终解决舰船操控系统软件通用化的问题,必须站在顶层设计的高度,采用分层及构件化框架设计思路,开展舰船操控系统通用软件架构的设计和实现。
张智慧[6]提出了基于分层技术的嵌入式系统架构设计思路,重点探讨了架构分层原则、分层设计方法、分层技术应用,对嵌入式系统架构设计具有一定的理论指导价值和方法借鉴意义。曹敬瑜等[7]提出一种适用于嵌入式分布计算环境下的高效软件构件化框架。该软件构架基于开放服务网关倡议(OSGi)标准,通过加入传输抽象层实现了在多通讯协议环境下的应用,具有通用性好、稳定性高、内存占用量少的特点。魏许等[8]采用分层架构、抽象工厂的设计模式以及配置文件的方法,实现了多型号的自动化测试软件的兼容,解决了软件的通用性问题,对通用嵌入式软件架构设计有重要参考价值。孙婧等[9]提出了一种基于XML文件的可配置、易更新的通用测控程序框架,使用XML配置文件对测控软件外部接口属性进行描述,实现了软件接口代码的自动生成,提高了软件的开发效率和可靠性。闫瑞东[10]提出了基于软总线的卫星姿控系统软件体系结构,制定了基于软总线的各模块的通讯机制和数据结构,实现了可复用的软件体系结构,增强了软件的静态和动态适应性,降低了软件的开发和集成成本。
本文在研究总结舰船操纵控制系统的业务特点后,抽象出了生产者-消费者模式的业务逻辑模型[11],创新性地将该设计模式与软总线思想相结合,提出适用于舰船操纵控制系统的通用软件架构设计,实现了对舰船操控专业所有应用场景和需求的覆盖,提高了软件的整体复用性。本架构设计的优势包括:
1)开放的体系结构
在CORBA规范中,软总线负责对各功能模块进行调度和管理,并规定了各功能模块必须满足相关接口标准要求才能“连接”到总线上与其他模块协同工作[12]。本文的架构设计仅对软总线接口设计执行了严格的标准要求,但对功能模块没有任何要求和限制,即功能模块对于软总线不可见,因此软总线与功能模块的耦合度较低,这就意味着功能模块的开发和扩展更自由方便,同时软总线也具有更广泛的适用性。
2)易用的访问接口
软总线向功能模块提供简洁、规范、高效的数据访问接口,功能模块仅需凭借数据对象名称即可获得数据对象的访问服务,实现对数据对象的属性读取、数值更新等操作。
3)可配置的数据对象
软总线中的数据对象采用专用的信息描述模型,通过XML文件实现描述对象的最小完备及可配置化定义,提高了软总线的灵活性和适用性。
4)可容错的并行结构
本架构摒弃了多功能模块联合组成系统的串行结构,采用容错能力更强的并行结构,避免了某一功能模块失效会造成系统瘫痪的缺陷,提高了系统的鲁棒性和可靠性。
1 舰船操控软件的通用架构总体设计 1.1 业务抽象模型舰船操控软件包含的每个单元功能模块,都具备处理数据和产生数据的基本功能。如果将产生数据的模块称为生产者,处理数据的模块称为消费者,这便是面向过程的生产者-消费者设计模式[13]。生产者的职责是负责制造、更新数据并放入缓冲区,消费者的职责是获取、处理数据。生产者和消费者彼此之间不是直接通信,而是通过阻塞队列来进行通信[14]。
为了实现软件设计“高内聚低耦合”的目标,本文将生产者-消费者模式引入嵌入式通用软件架构设计中,把功能模块的业务逻辑抽象成“数据生产者-数据消费者-数据仓库”模型,如图2所示。
基于以上业务逻辑抽象模型,将功能模块视为数据生产者和消费者的组合,各功能模块将集合了众多数据对象的数据仓库作为唯一的对外通信对象,于是建立起以数据交换为核心的功能模块交互模型,如图3所示。
软总线技术的概念最早由CORBA规范提出,它属于一种中间件技术,是虚拟的数据信息传输线。CORBA规范定义了一组标准接口,遵循该规范所开发出的软件模块能够相互通信,协作完成预期的任务,实现软件模块的“即插即用”[11]。软总线的技术优势恰好与数据仓库的需求相吻合,可以很好屏蔽底层硬件平台、操作系统以及网络传输协议的异构性,降低各模块之间的耦合性,实现在不同数据标准或格式的异构系统之间进行高效便捷的数据交换。
本文将生产者-消费者设计模式与软总线概念深度融合,搭建起舰船操纵控制软件通用架构,如图4所示。该架构提高了应用系统的互联、互通、互操作能力,大大增强了代码的灵活性、复用性。
本文所涉及的软总线核心架构主要包括3部分:软总线接口、数据交换池、通信接口,如图5所示。
1)软总线接口,是软总线架构设计的关键和灵魂。它是提供给上层应用功能模块使用的标准接口类,拥有数据对象的数值、属性读取,数据更新通知事件的注册、注销等功能。软总线接口的作用在于一方面解除了各功能模块彼此之间的直接联系,避免了相互调用接口导致的相互依赖;另一方面实现了数据的封装,屏蔽了各种复杂的底层实现,为实现功能模块即插即用的目标提供了条件。
2)数据交换池,是存储数据对象数据信息的仓库。数据交换池是在系统初始化时开辟的一段连续的内存区,存储所有数据对象的实时数据。当数据发生更新时新数据将覆盖旧数据。触发数据更新的情况只有2种:
①功能模块完成数据处理后,将结果写入数据交换池指定位置;
②通信接口接收到新数据后,将新数据覆盖至数据帧对应的内存空间。
3)通信接口,搭建了网络内节点设备互通的桥梁,实现了节点之间信息交互和共享。通信接口对上层应用而言屏蔽了底层硬件、通信协议以及操作系统的差异,隔离了底层硬件和上层编程的关联,使上层应用能兼容不同操作系统,从而具有良好的可移植性。
1.3 舰船操控软件的通用架构设计基于以上功能模块抽象模型和软总线设计,搭建应用于舰船操控领域的嵌入式软件通用架构,如图6所示。该设计采用分层架构[15],从底至顶一共分为5层:物理链路层,通信接口层,数据分发层,数据交换层,业务应用层。
1)物理链路层
物理链路层是指为数据端设备提供传送通路、传输数据的具有物理形态的传输介质和设备,主要表现为物理形态的总线或网络,例如串口、以太网、CAN总线、1553B总线等。
2)通信接口层
通信接口层通过封装一组具有统一格式的标准数据访问接口,屏蔽了通信硬件及其驱动的差异性,实现了硬件驱动的无关性,解决了节点设备之间通信所用的总线类型、接口方式、通信协议形式复杂多样、难以统一的痛点。通信接口层对上统一了数据传输接口,对下封装了具体总线的通信功能,在整个框架中起着承上启下的作用。框架使用XML配置文件来描述具体系统的通信通道及配置信息。
3)数据分发层
数据分发层实现通信数据路由、转发功能,将来自通信接口层的数据作分流处理,如向上传递存储到数据交换池,或者向其他通信通道透明转发或者重新组帧转发数据,或者进行数据帧过滤、筛选处理等。框架使用XML配置文件来描述具体系统的数据分发器及配置信息。
4)数据交换层
数据交换层包含数据交换池和软总线对外接口。数据交换池是存储数据对象的连续内存区。功能模块通过软总线接口读取或改写数据对象对应的数据交换池数据,通信接口层接收的通信数据也会更新到对应的数据交换池内存区中。
5)业务应用层
业务应用层是系统所有应用功能模块的集合,涵盖了执行系统任务的具体功能实现。因为采用了软总线技术,上层各功能模块通过软总线接口进行信息交互,相互之间不可见,彼此基于数据而独立运行。
2 舰船操控软件的通用架构实现 2.1 系统架构分解软件架构分解作为识别架构元素的有效手段,是建立层次清晰的系统组织结构的前提和关键步骤。根据业务切分和功能分解,可以将舰船操控软件系统划分为如图7所示的层次结构,主要分为底层数据交换包(DataExchange)和应用任务执行包(TaskExecute)两大部分。
底层数据交换包包含了软总线的所有功能实现,负责读取系统配置文件、加载子模块、驱动通信硬件、监控设备状态、接收数据、缓存数据及数据自动发送,为TaskExecute应用层提供数据访问接口。其作用在于为上层应用模块屏蔽和隔离底层硬件的差异,解除了应用层和底层的耦合关系,使上层应用因为基于数据运行而可以专注于系统功能的实现,为TaskExecute中各功能模块的独立和通用奠定了基础。
底层数据交换包下的目录包括驱动(Driver)、数据分发器(Distributor)、数据解码器(Decoder)、数据编码器(Encoder)、配置文件解析器(XmlParser)、帧协议解析器(ProtocolParser)共6大类基本框架模块,如图8所示,其目录结构和具体描述见表1。
应用任务执行包是所有上层应用功能模块的集合,它的实现要点包括:
1)输出接口描述需规范完备。本文采用XML格式的配置文件来描述功能模块的输出数据对象的属性;
2)通过软总线接口与外界通信。功能模块调用统一的软总线接口来访问本地或远程的其他功能模块的输出数据;
3)相似功能模块力求通用化。任务类型相似的功能模块经过抽象、封装可以达到复用,如通道表决模块、PID控制模块等都具有很好的复用性;
4)专用功能模块允许定制化。功能模块的功能与系统要求的具体任务需求密不可分,需要开发者编写代码实现扩展定制,但对功能模块的形式未做强制约束,这提高了对具体功能需求复杂性的适应性。
2.2 系统配置信息描述模型系统构建的可配置化可使系统架构拥有良好的扩展性和灵活性。实现系统可配置化的前提是必须抽象出被描述对象的属性,建立对应的信息描述结构模型,并且要求该模型能最小完备的刻画对象特征。
2.2.1 系统通信协议描述模型在实际系统开发中面对的通信协议复杂多样,对数据对象信息采用统一的形式进行描述是实现系统构建可配置化的关键。通过对数据对象的属性进行抽象,建立了数据对象的信息描述结构。
2.2.2 通信接口配置描述模型通信接口模块与硬件平台、操作系统、网络协议等息息相关,以往的开发模式是针对具体应用专门开发,无法做到支持多种总线类型、协议格式及软硬件平台。为了实现对上述差异因素的兼容,采取固化封装共用业务逻辑、提取配置差异化信息的策略,抽象出了通信接口配置描述模型,具有配置灵活和扩展便捷的优点。
2.2.3 数据分发器配置描述模型数据分发器用于描述通信接收数据的分发和路由方式,如上传给数据缓存池、转发至其他通信通道或数据筛选过滤等。
2.3 软总线功能模块设计 2.3.1 数据接收通信接口模块采用了环形缓冲区的数据结构来缓存接收的数据帧,每个通信接口对应一个环形缓冲区,保证一个环形缓冲区仅有一个读用户和一个写用户,不需要额外添加互斥保护机制就可以确保数据的安全性和正确性。用于描述数据接收的过程如图8所示,接收数据的处理流程说明如下:
1) 通信接口(如CAN1)接收到数据,进入中断处理程序;
2)将数据帧写入环形缓存区,并向通信接口管理类发送异步消息;
3)通信接口管理类收到接收数据的通知后,从环形缓存区读取数据;
4)通信接口管理类将新接收的数据传递给数据分发管理者;
5)数据分发管理者将数据分发给Distributors.xml中配置的所有分发器,如通用分发器和数据转发器;
6)通用分发器负责将数据帧拷贝到数据交换池内指定的内存区域,完成数据更新;
7)数据转发器负责将数据通过CAN2接口发送出去,完成数据的转发。
2.3.2 数据发送存储在数据交换池内的数据是经过编码器编码处理的,可以在需要的时候直接发送。如果在Devices.xml配置文件中指定了发送频率,本框架支持数据帧的自动周期发送功能,用于描述数据发送的过程如图9所示。
实现步骤说明如下:
1)系统初始化时,由数据帧管理者(CPDOManager)创建定时器;
2)应用层的功能模块调用软总线接口函数,获取数据帧对象(CPDO)指针;
3)调用接口函数启动数据帧对象的自动发送接口;
4)遍历指定了自动发送功能的所有数据帧。每次定时器轮转周期到时,计算当前时间与上次成功发送本帧数据的时间间隔;
5)当时间间隔超过Devices.xml中配置的发送时间间隔时,则通过指定通信通道将本数据帧发送出去;否则本次不发送。
2.3.3 数据访问应用层的功能模块通过调用软总线接口可以非常方便的访问数据对象,读取实时数值或数据属性。用于描述数据访问的过程如图10所示,以访问数据对象“航向”实时数值为例,说明具体调用过程。
1)在功能模块里调用软总线接口函数,获取“航向”数据对象(CSignal)的指针;
2)获得“航向”数据对象对应数据交换池中的内存空间的地址;
3)从数据交换池中读取“航向”的原始数据;
4)调用“航向”数据对象的解码器将数据交换池中的原始数据解码;
5)返回“航向”数据对象的实时物理值。
2.4 软总线跨平台设计本通用架构的应用环境是面向多操作系统平台,要求具有兼容多平台的能力,所以需要对操作系统的主要API做统一封装,使得用户可以基于统一的接口来开发各种嵌入式应用程序,从而实现这些应用程序在不同平台上的代码复用。本框架主要对Windows,Linux,VxWorks操作系统的API做了统一封装,形成统一的标准接口。
3 结 语本文提出的基于生产者-消费者模式和软总线技术的舰船操控系统通用软件架构,已经成功应用到舰船操纵控制系统软件的开发,反馈结果表明架构具有良好的灵活性、可靠性、跨平台性以及较高的运行效率,能较好满足多型号产品的适用性需求。下一步的工作重点是为了适应操作系统国产化的需要,将开展本框架向麒麟、道等国产操作系统移植的适应性工作。
[1] |
金鸿章, 李国斌. 船舶特种装置控制系统[M]. 北京: 国防工业出版社, 1995: 3–74.
|
[2] |
施生达. 潜艇操纵性[M].北京: 国防工业出版社, 2021: 1–13, 134–163.
|
[3] |
马运义, 许建. 现代潜艇设计理论与技术[M]. 北京: 中国工信出版社, 哈尔滨工程大学出版社, 2019: 385–400.
|
[4] |
洪锡军, 张激. 嵌入式应用软件通用运行平台研究[J]. 计算机工程, 2004, 30(24): 67-69. DOI:10.3969/j.issn.1000-3428.2004.24.027 |
[5] |
荣国平, 等. 嵌入式系统开发中敏捷方法的应用研究综述[J]. 软件学报, 2014, 25(2): 267-283. |
[6] |
张智慧. C语言嵌入式系统编程软件设计架构研究[J]. 单片机与嵌入式系统应用, 2018(1): 3-6. |
[7] |
曹敬瑜, 柴玮岩, 等. 嵌入式分布计算环境下的高效软件构件化框架研究[J]. 兵工学报, 2013, 34(4): 451-457. |
[8] |
魏许, 张怡文. 飞轮通用测试软件平台的设计与实现[J]. 计算机测量与控制, 2017, 25(12): 129-132. |
[9] |
孙婧, 刘莹, 孟景涛, 等. 基于XML的软件通用程序框架[J]. 无线电工程, 2015, 45(6): 25-27,31. |
[10] |
闫瑞东. 基于软总线的卫星姿控系统软件体系结构及关键构件设计[D]. 哈尔滨: 哈尔滨工业大学, 2012.
|
[11] |
刘晓平, 石慧, 等. 基于信号量的生产者-消费者问题设计与分析[J]. 合肥工业大学学报(社会科学版), 2008, 22(5): 84-88. |
[12] |
周星宇. 基于软总线的飞行控制软件设计与开发[D]. 南京: 南京航空航天大学, 2018.
|
[13] |
帖军, 陈幼均. 进程同步中的生产者一消费者模型分析[J]. 武汉科技学院学报, 2007, 20(4): 30-34. |
[14] |
黄世泉, 金晅宏. 基于LabVIEW的生产者/消费者模式研究[J]. 电子科技, 2017, 30(9): 75-77,81. |
[15] |
赖炳宇, 李言华. 软件设计模式在嵌入式控制系统中的应用[J]. 单片机与嵌入式系统应用, 2015(2): 4-6. |