Simulink模型接入运行支撑系统的插件式技术

2021-05-31 10:25:30金雪松申立群
计算机集成制造系统 2021年5期
关键词:次序插件数值

胡 涛,金雪松,申立群+,刘 磊

(1.哈尔滨工业大学 仪器科学与工程学院,黑龙江 哈尔滨 150001;2.哈尔滨商业大学 计算机与信息工程学院,黑龙江 哈尔滨 150028)

0 引言

Simulink是MATLAB提供的建模、分析和仿真工具,其支持可视化建模的特点降低了仿真模型的开发难度,从而得到了广泛应用[1]。然而Simulink本身运行在单机环境,若将其应用到多机参与的分布式仿真系统中,则需开发仿真模型间的通信功能,而高层体系结构(High Level Architecture, HLA)提供了一套标准的分布式仿真系统构建规范,开发人员可依此对仿真网络通信部分进行开发[2-3]。另一方面,在分布式仿真系统中,使用Simulink搭建数值计算模型比手写代码更加简单和高效,可以节约开发时间。因此,将Simulink模型接入HLA仿真系统的核心组件运行支撑系统(Run-Time Infrastructure, RTI),参与HLA分布式仿真,具有很强的现实意义[4]。现有的Simulink模型接入方法使用起来比较繁琐,而且随着需要接入Simulink模型数目的增加,仿真系统的开发效率越来越低。

插件技术不用在开发设计过程中修改主体软件程序源代码,就可以有效扩展软件程序功能。结合不同需求,选择载入不同的功能插件,能够加快软件程序的开发进度,从而方便、轻松地使软件具备新功能,节省开发成本[5]。动态链接库是一种常见的插件技术[6],本文将动态链接库插件技术应用于Simulink模型接入RTI方法,对基于插件的接入方法进行了研究。该方法将数值计算模块作为单独的功能模块提取出来,以动态链接库插件的形式载入,邦员程序调用流程时只需约定的接口规范,无需考虑实现细节,因此可以满足不同Simulink模型的接入需求,具有较好的通用性。与其他接入方法相比,该方法兼顾避免重复开发、不需要MATLAB运行环境、模型运行效率高和实现简单等需求,用户可以在不手动修改数值计算程序源码的情况下进行Simulink模型的接入工作,有效提高了HLA仿真联邦的开发效率。

1 接入方案设计

MATLAB提供的RTW(real-time workshop)工具可以将Simulink模型转化为C++代码程序[7],由RTW生成C++代码程序是Simulink模型接入RTI工作的起点和基础。

1.1 现有接入方法分析

现有的3种接入方法分别为在RTW生成C++代码中嵌入RTI编程接口、在邦员程序中调用MATLAB引擎、使用S-Function编写RTI通信模块[8-10]。3种接入方法的原理如图1所示。

如图1所示,方法1对RTW生成的C++代码进行分析,并在合适的位置手工编写符合HLA协议规范的RTI通信接口,缺点是接入不同模型时需要重复全部开发流程,接入效率较低;方法2在邦员程序中调用MATLAB引擎接口驱动Simulink模型来计算仿真数值,缺点是仿真系统运行在MATLAB环境下,且与MATLAB进程间通信,导致运行效率不高;方法3采用S-Function语法编写嵌入RTI接口的仿真数据通信模型,通过RTW直接生成邦员程序代码,缺点是使用S-Function语法开发满足HLA技术规范的接口难度较大,方法实现比较困难。这些方法均未将仿真计算模块从邦员程序中进行外部抽离,编译生成邦员程序后无法替换Simulink模型,而且不同的Simulink模型接入RTI均需重新修改源码、编译链接生成邦员程序,其步骤繁琐,影响开发效率。

1.2 基于插件的接入方案设计

结合常见的3种接入方法的缺点,对基于插件的Simulink模型接入RTI方法进行研究。该方法充分利用插件技术的优势,将Simulink模型转换为动态链接库,仿真初始化时由邦员程序载入,不同Simulink模型接入RTI时无需手动修改任何源代码,其原理如图2所示。

方法流程描述如下:首先将RTW生成C++源文件中的接口进行包装,编译生成动态链接库插件;然后在邦员程序初始化时载入该插件,并进行数据绑定及仿真数据更新,完成接入仿真联邦工作。在该方法中,邦员程序的通信模块与数值计算模块耦合度低,数值计算模块以独立的模块形式存在,运行时以动态链接库插件的形式载入,邦员程序采用约定的接口规范进行调用,因为可以将同一邦员程序接入满足接口的不同Simulink模型,所以插件方法的通用性较好。该方法可以避免重复开发,而且不需要MATLAB运行环境,所采用的动态链接库插件形式还可以达到模型运行效率高和实现简单的目的。

1.3 插件方法和其他常用方法的对比分析

从前面的分析可见,插件方法具有优越性,与其他方法的对比总结如表1所示。

表1 几种接入方法的对比

由表1可以看出,其他几种常用方法都有明显的缺陷,而基于插件的接入方法集合各种方法的优点,通过载入数值模型动态链接库,使运行时计算模块和通信模块处于同一进程,相比调用MATLAB引擎的接入方式具有更高的运行效率,而且通过进行统一的接口适配包装和数据绑定,编写统一的调用流程,相比修改Simulink生成源文件的方法具有更强的通用性;另外,由于S-Function语法复杂,该接入方法具有更高的开发效率。

2 接入实现步骤

基于插件的Simulink模型接入RTI方法的关键步骤包括:①对RTW生成C++源文件的接口适配包装;②仿真数据绑定;③仿真运行时的数据更新。

2.1 接口适配包装

由RTW生成的代码需要根据约定的接口规则进行接口适配包装操作,使其能够被邦员程序正确调用,完成仿真数值计算。对仿真推进过程进行抽象后可知,为满足数值计算功能,需提供模型初始化、模型停止运行、模型单步推进、获取模型输入数据指针、获取模型输出数据指针、查询模型状态6个关键接口。约定调用规范如图3所示。

分析RTW生成的C++源代码,在Simulink中所定义模型名的基础上,对相应模型的对象类、输入数据结构体、输出数据结构体和单步推进接口进行规范命名,然后基于该命名规则,通过宏定义进行字符串替换,以满足接口规范的要求。在对不同数值模型进行接口适配时,只需采用统一的包装接口文件对不同的模型名称进行宏定义即可。接口适配包装完毕后,调用C++编译器对源文件进行编译链接生成模型计算动态链接库,邦员程序初始化时载入动态链接库插件,按照约定的调用规范调用接口,即可使用Simulink模型的计算功能。

2.2 仿真数据绑定

在邦员程序中,将仿真通信模块的输入和输出与数值计算模块的输入和输出对应绑定,实现邦员程序中通信模块与计算模块的数据共享。以火箭飞行仿真中六自由度Simulink模型为例进行分析,封装后的模型如图4所示,采用RTW对该六自由度模型生成代码中的输入、输出结构体的定义如图5与图6所示。

由图4~图6可知,模型图中输入、输出的参数定义排布次序与生成代码结构体中的参数排布次序相同,模型图中对应的参数维数体现在生成代码结构体中参数数组的维数上。由C++内存模型可知,当结构体中的参数数据类型相同时,参数在结构体内存中按定义顺序依次排布[11-12],因此相等的Simulink模型图中属性的排布次序,与生成代码结构体中属性的定义次序,对应同一属性参数。例如图4输入的第2次序属性参数,与生成代码结构体中第2次序对应的属性参数相同,均为火箭受到的合力矩参数。根据以上分析,可以以同样的方式对数据进行绑定,以达到接口兼容的目的。

基于上述方法对仿真数据进行绑定,在存储构造的映射关系时常选用map数据结构[13]。从RTI接收数据的回调函数参数出发,参数包括接收数据的对象句柄,具体映射关系为由属性句柄作为键,属性值作为值。用数据源对象句柄和属性句柄构造唯一的属性标识,将唯一的属性标识与该属性在Simulink模型中的输入数据排序次序进行绑定,构造映射关系并采用map数据结构保存,即完成输入数据绑定。输出数据绑定原理类似,不再赘述。绑定流程如图7所示。

在订阅数据绑定流程中,s_map1为邦员程序中数值计算模块的各输入属性在Simulink中的排序次序和订阅属性名的映射集;s_map2为订阅属性名与由RTI分配的订阅属性句柄的映射集;s_map3为属性标识及其对应Simulink计算模型中的排序次序的映射集。在发布数据绑定流程中,p_map1为邦员程序中数值计算模块各输出属性在Simulink中的排序次序和发布属性名的映射集;p_map2为发布属性名与由RTI分配的发布属性句柄的映射集;p_map3为发布属性标识及其对应Simulink计算模型中的排序次序的映射集。数据绑定为仿真数据更新提供了映射依据。

2.3 仿真数据更新

当从RTI中获取仿真数据时,在更新数据回调中得到数据源的属性句柄和对象句柄,通过仿真数据绑定过程构造的映射关系,得到该更新属性在Simulink模型中输入的排序次序,由上述分析可知,该排序次序与更新属性在RTW生成代码的输入数据结构体中定义的排布次序相同,即可由次序值与数据类型长度的乘积得到该属性参数在数值模型输入结构体内存中的偏移量,然后用结构体首地址加偏移的方式得到指向该更新属性的指针,进行数据更新工作。更新本地数据至RTI的原理类似,不再赘述。仿真数据更新流程如图8所示,仿真运行时依据该流程进行数据更新,实现将Simulink模型接入RTI,参与HLA分布式仿真的目标。

3 应用实例

对本文的接口适配方法编写使用操作界面如图9所示。用户采用该方法操作界面将Simulink模型接入RTI过程的用例描述如下:①在该方法操作界面载入RTW生成的Simulink模型C++项目文件;②点击开始进行转换,等待输出界面显示动态链接生成成功;③启动HLA邦员程序载入生成的动态链接。通过上述几个简单步骤,用户就完成了将Simulink模型接入RTI。

采用该方法构建小型固体火箭分布式飞行仿真系统,对小型固体火箭进行飞行仿真实验,仿真系统组成如图10所示。通过Simulink进行数值建模,其中六自由度Simulink模型的具体实现如图11所示。采用本文接入方法将所有Simulink模型接入RTI,所构建的仿真联邦如图12所示,其中仿真数值计算模型集为用本文方法接入的计算邦员,通过载入构建的数值计算动态链接库插件,具备了仿真计算功能;仿真支撑组件提供了相关的HLA仿真服务。采用所构建的HLA仿真系统对意大利ROCKSANNE 2-ALPHA小型固体火箭进行仿真,该型号火箭箭长4.4 m,直径0.174 m,发动机由Cesaroni Technology Inc.公司生产,型号为O4900-BS,设计最高点高度为10 km。火箭飞行轨迹仿真结果如图13所示。

由图13可知,仿真飞行高度与预期的10 km射高相符,验证了由该方法构建的HLA仿真联邦的正确性,因此仿真过程中的各个仿真邦员能够正确地收发数据,证明该方法已成功地将Simulink模型接入RTI,使其可以参与分布式仿真,并实现不同Simulink模型间的仿真数据通信。

对于有6个Simulink模型接入的小型固体火箭飞行仿真系统,本文方法的优越性得到了充分体现。若采用现有方法,则由于开发人员需要熟悉RTI编程接口或S-Function语法,且接入较繁琐,其将在HLA系统的搭建上耗费大量时间。本文方法在仿真系统构建过程中未修改邦员程序,邦员程序可一直使用,接入不同Simulink模型只需替换不同的动态链接库插件,整个接入过程简单高效,开发人员可以快速、正确地搭建HLA仿真联邦,进行分布式仿真。本文方法适用于需要将大量Simulink模型接入RTI,构建HLA仿真联邦的情况。

4 结束语

本文从Simulink模型接入RTI,参与HLA分布式仿真的实际出发,针对现有接入方法的不足,基于RTW提供的将Simulink模型生成C++源代码的功能,将仿真计算模块从邦员程序中独立提取出来,然后基于插件方式将Simulink模型接入RTI。论文阐述了实现该方法涉及的关键流程,并采用该方法将Simulink模型接入RTI,构建了小型固体火箭飞行仿真系统应用实例,验证了该方法的可行性与正确性。应用实例的构建过程简单快捷,充分体现了所提方法能够有效提高模型的接入效率,降低分布式仿真联邦的开发成本,具有较好的工程实用价值。本文主要侧重小型固体火箭动力学的分析建模,下一步将对控制、导航与制导系统等进行建模和接入。

猜你喜欢
次序插件数值
《汉纪》对汉帝功业次序的重构及其意义
用固定数值计算
数值大小比较“招招鲜”
自编插件完善App Inventor与乐高机器人通信
电子制作(2019年22期)2020-01-14 03:16:34
生日谜题
基于Fluent的GTAW数值模拟
焊接(2016年2期)2016-02-27 13:01:02
MapWindowGIS插件机制及应用
基于Revit MEP的插件制作探讨
放假一年
浅谈交换积分次序
河南科技(2013年18期)2013-11-07 07:47:14