复杂系统实时仿真的可视化建模方法研究

2020-12-26 01:22李艳红唐成师赵吕懿胡启鹏柴娟芳姚新宇
空天防御 2020年4期
关键词:扁平化代码组件

李艳红,唐成师,赵吕懿,胡启鹏,柴娟芳,姚新宇

(1. 上海机电工程研究所,上海 201109;2. 国防科技大学 系统工程学院,湖南 长沙 410073)

0 引 言

随着仿真对象的复杂化以及对仿真系统应用要求的提高,仿真技术进入了以复杂系统仿真为主的新阶段。传统的实时仿真建模以C/C++代码为主要建模手段,直接操作底层硬件,代码效率高。但是,随着仿真系统规模的扩大,这种以代码为主的建模方法,系统调试复杂,效率低,且极易出错。因此,传统以C/C++代码为主的建模方法,已经不适合于复杂系统的实时仿真建模。可视化建模是围绕现实想法组织模型的一种思考方法,着眼于系统的组件如何相互作用,而不是局限于具体的细节,同时能够了解设计组件之间的相互关系。该方法目前得到了飞速发展。仿真应用工程师能够从繁杂代码开发中解脱出来,从而大大提高了仿真效率。

针对复杂系统实时仿真领域的应用需求,本文提出一种仿真模型组件化设计、基于关系数据库的模型管理、模型接口封装及代码自动生成的方法,从而实现了C/C++、Modelica、Simulink等多种仿真模型的开发、管理和运行。该方法既简化了复杂系统的建模过程,又保证了仿真模型的运行效率和良好的集成能力,结合复杂系统实时制导仿真和协同仿真应用,验证了可视化建模方法的正确性和可行性。

1 可视化建模的国内外发展现状

在动态测试与仿真领域,常用的建模工具或者语言有Matlab/Simulink、C/C++、Fortran、SimulationX、MWorks、dSpace等。在模型封装接口方面,国际上制定了通用模型接口(functional mockup interface, FMI)标准,每个专业人员使用不同的建模工具设计的仿真模型具有统一的模型描述格式和数据存储方法,将涉及到的底层细节进行充分的标准化封装。上述建模工具或者语言均支持FMI标准,方便模型集成[1-2]。

国内在实时仿真领域提出了图形化、模块化、参数化的通用仿真建模工具,具有集仿真模型开发、实时运行与可视化于一体的集成环境,支持基于组件的建模开发及实时仿真代码的自动生成,可实现多种建模模型的兼容[3-5]。但在复杂系统的动力学仿真模型构建等具体方面缺乏统一明确的指导性规范[6-8]。

2 复杂系统实时仿真的可视化模型设计

复杂系统实时仿真模型涉及多个专业,模型的数量和种类繁多,包括C/C++模型、Matlab模型以及Modelica等其他模型。一方面,随着半实物仿真应用的扩展,仿真模型的数量会持续增长,提供有效的、便于重用的管理机制十分必要。另一方面,实时仿真的核心问题是仿真的时间约束,对于模型而言,就是保证模型重用前提下的效率设计,要求模型接口标准和代码实现简洁高效。因此,构建复杂系统实时仿真模型,要从模型的管理效率和运行效率两个方面来考虑。

模型设计包括4个过程:①模型的组件化设计,采用扁平化的组件模式;②模型的管理,引入关系数据库来管理模型;③模型的接口设计,综合考虑管理和运行效率;④模型的代码生成,减轻代码开发工作量的同时,保证代码封装的一致性。

2.1 组件化扁平化模型设计

复杂系统实时仿真模型采用扁平化的两级设计模式。在仿真模型设计层级,内部统一整体化设计,如果需要引用其他模型,则通过函数调用模式嵌入,而不是模型引用;在模型运行层级,由仿真引擎按设定的时序调度所有模型,对模型间数据通信予以封装转发,不干涉模型内部计算。这样便于专业领域技术人员在模型建模中专注于模型算法的构建和实现,仿真技术人员专注于在引擎层次实现模型的调度、交互和实时运行。

以某飞行器半实物仿真模型为例,采用扁平化建模方法,只需要将运动平台拆分为运动学组件、动力学姿控组件、控制器组件、舵机组件、制导陀螺组件5个模型。模型内部结构由相应的专业领域技术人员采用模型设计工具实现,仿真引擎不干预模型内部的调度运行,只要调度5个模型和实现5个模型间的数据交互。模型间传递的数据只有38个,其他需要记录的内部数据可以直接单向输出,不需要仿真引擎进行重复打包管理和转发。

扁平化模型设计的关键是模型的封装粒度,保证模型内部算法和外部仿真调度平衡。如图1所示,根据试验需求,在模型库中选择恰当粒度封装的模型组合进行仿真试验,不同粒度模型的封装由模型设计工具实现。编译器在模型编译时完成组装,而不是由仿真引擎在运行中实现多粒度模型混合调度。仿真引擎按一个层次调度所有模型,因此,仿真试验中模型粒度匹配,模型数量适中,可以有效提高实时仿真的运行效率。

图1 多粒度模型的扁平化模型设计Fig.1 Multiple granularity models flat design

2.2 基于关系数据库的模型管理

采用扁平化模型设计以及模型、数据、引擎分离的架构,并采用关系数据库来管理整个系统的模型库和仿真试验配置数据。基于关系数据库进行数据管理,支持主键、外键和视图进行关系表模型设计,支持索引、事务和触发器等提供安全有效的数据访问,同时提供分布式访问支持,提供数据表之间的关联设定,提供过程存储,提供标准接口支持和应用程序的集成,同时也提供可视化的数据库管理工具直接进行数据库的操作维护。数据库的用户授权管理、安全维护、数据备份以及通用的查询统计可以直接借用数据库系统自身提供的功能模块来实现。

数据库的管理包括模型类的管理和仿真试验配置数据的管理,模型类的管理包括:

1) 模型类表:记录某个模型类的有关信息;

2) 模型类参数表:记录指定模型类的各项参数信息;

3) 模型类输入信号表:记录指定模型类的各项输入信号的信息;

4) 模型类输出信号表:记录指定模型类的各项输出信号的信息;

5) 模型表:记录指定模型类的不同模型的信息。

这些表之间的数据流图如图2所示。

图2 基于关系数据库的模型类管理设计Fig.2 Model management based on relational database

2.3 模型的接口封装

为保证实时仿真中多类型、多数量模型的集成效率,采用C/C++为模型封装标准。每个模型具体封装为3个函数:初始化模型函数、实时仿真函数和仿真结束函数。函数原型参考如下定义:

extern “C” int model_init(struct SimParam*pSimParam, void*pPar, void*pInput, void*pOutput, void*g_pUser);

extern “C” int model_sim(struct SimParam*pSimParam, void*pPar, void*pInput, void*pOutput, void*g_pUser);

extern “C” int model_end(struct SimParam*pSimParam, void*pPar, void*pInput, void*pOutput, void*g_pUser);

输入参数均为指针,内存均由主控函数分配和释放。pSimParam为系统参数,包含仿真时间、帧计数等系统信息;pPar、pInput、pOutput分别为参数、输入信号、输出信号数组;pUser用于模型内部交换数据,暂定为1 024字节。模型从pPar、pInput数组中读取数据,将结果输出到pOutput数组中。参数、输入信号、输出信号的排列顺序和个数与数据库中的记录相匹配。每个模型分配唯一的模型编码,和数据库中的模型编码相匹配。模型接口数据类型统一为4/8字节,可以是浮点或整型数据类型。模型业务代码在这3个函数中实现,仿真引擎根据仿真进程对3个函数进行调度。

2.4 可视化模型的代码自动生成

C/C++语言是工程领域大量采用的计算机编程语言,拥有丰富的资源和灵活强大的系统操作能力,在通信、调度、同步等仿真运行控制方面具有优势。直接采用C/C++语言,通过模型模板实现模型设计的可视化,同时采用代码自动生成的方式来实现Modelica、Simulink等可视化模型向标准C/C++代码的转换,既简化了复杂系统的建模过程,又保证了仿真模型的运行效率和集成能力。

采用向导式、文件模板式或者拖拽式的任意一种可视化模型设计封装,都可以通过代码生成工具生成模型代码,如图3所示。C/C++代码作为代码生成工具的输出,生成的代码主要是模型类框架代码,然后联合模型算法代码、公共算法服务支持库等,用选定的目标C/C++编译器联合编译得到模型类的二进制代码。

图3 可视化交互式模型建立Fig.3 Establishment of visual interactive models

3 可视化建模与仿真实现

利用上述可视化建模方法,建立某飞行器多类型可视化模型,并开展飞行器制导仿真和协同仿真来进行实时仿真试验验证。

3.1 建立可视化模型

1) 模型的组件化设计。根据某飞行器的组成,将模型划分为11个组件。采用面向对象机制设计模型,将模型数据和模型算法分离,并以模型类形式进行管理。为每个模型类定义一个唯一的编号并命名,如图4所示。

图4 输入模型变量名Fig.4 Input of model variable names

2) 模型的设计封装。定义模型类的外特性,包括模型类的参数、输入信号、输出信号,这是模型和外部交互的关键,也是模型类管理的核心。对于这3类变量,均需要定义其序号、变量名、数据类型,缺省参数也要定义。如目标运动模型的定义如表1~3所示,该函数命名为“Target”。

表1 参数表Tab.1 Parameter table

表2 输入信号表Tab.2 Input signal table

表3 输出信号表Tab.3 Output signal table

通过向导式数据录入模式录入表格信息,也可以通过模板文件进行模型类的录入。

3) 模型代码生成。首先生成模型代码框架,包括模型输入、输出、接口参数定义,以及标准的模型函数定义。模型函数主要包括模型初始化函数model_init()、模型运行函数model_sim()、模型结束运行函数model_end()。模型框架代码生成后,再添加业务代码,生成界面如图5所示。对于VxWorks实时系统,采用风河的Workbench集成编译平台;对于Linux实时系统,选择GNU编译器套件(GNU compiler collection,GCC)。针对两类实时系统,提供接口兼容的公共算法服务支持库和编译模板。

图5 模型框架代码生成界面Fig.5 Interface of model framework code generation

4) 模型信息进入模型数据库。将模型设计输出的模型外特性描述信息通过模型库管理工具导入到模型数据库中。采用统一的模块同步进行模式代码框架和模型数据库信息表的自动化生成,确保模型代码和模型数据库的一致性。

3.2 实时仿真试验验证

利于向导式可视化建模,将上述飞行器模型输入输出信号进行关联后,启动仿真运控管理程序,开展型号试验,点击加载、初始化、开始仿真、停止试验,得到仿真结果曲线,运行结果正常,运行界面如图6所示。

图6 仿真试验运行界面Fig.6 Interface of simulation test running

同理,分别将Modelica和Simulink构建的模型接入闭环仿真,运行结果均显示正常,实现了向导式、拖拽式和Simulink多类型兼容的可视化建模与仿真。

为进一步验证复杂系统的可视化建模能力,开发了16枚飞行器协同仿真案例,其中1枚采用半实物仿真,其余采用数字仿真。在RT-Linux操作系统下开展实时仿真,得到1枚飞行器姿态角和目标位置变化曲线,如图7所示。

图7 飞行器姿态角和目标位置变化曲线Fig.7 Aircraft attitude angle and target position variation curves

其他飞行器相对距离变化曲线如图8所示,仿真结果正常。

图8 相对距离变化曲线Fig.8 Relative distance variation curves

通过两次仿真分析可知,在Linux操作系统下,利用可视化建模设计与仿真,单套半实物仿真模型系统运行时,每帧周期最大耗时约140 μs;复杂系统(即1个半实物仿真模型和15个数字仿真模型)运行时,每帧周期最大耗时约469 μs,开发模型的效率满足实时仿真的要求。

4 结束语

本文针对复杂系统实时仿真应用的特点,通过扁平化的模型设计方法,实现仿真模型与仿真引擎的分离,使得专业设计师专注于模型算法实现,仿真设计师专注于仿真引擎的开发优化与仿真模型的调度,提高了仿真开发的效率。同时,扁平化的模型设计方法,使得不同粒度之间的模型封装在模型编译阶段完成,不需要仿真引擎对不同粒度的仿真模型进行混合调度,有效提高了实时仿真的运行效率;采用基于关系数据库的模型管理技术,解决了复杂系统建模参数及输入、输出复杂且难以管理的问题;定义了标准的模型封装接口函数,解决了不同类模型间集成的难题;设计了可视化建模与自动代码生成支撑环境,将仿真建模从传统的代码编写提升为图形化的建模,并能一键生成实时仿真代码,提高了仿真建模的效率,降低了错误率。后续将进一步优化模型标准设计,将更多类型、不同颗粒度的仿真模型进行高效管理,实现复杂系统通用化半实物仿真的需求。

猜你喜欢
扁平化代码组件
Kistler全新的Kitimer2.0系统组件:使安全气囊和安全带测试更加可靠和高效
创建Vue组件npm包实战分析
智能机械臂
舰载雷达TR组件冲击计算方法分析
神秘的代码
一周机构净增(减)仓股前20名
重要股东二级市场增、减持明细
扁平化的球星Ⅱ
近期连续上涨7天以上的股
扁平化的球星