CN111596901A - 基于模块定义图的无人机飞控系统的c++代码生成方法 - Google Patents
基于模块定义图的无人机飞控系统的c++代码生成方法 Download PDFInfo
- Publication number
- CN111596901A CN111596901A CN202010426578.9A CN202010426578A CN111596901A CN 111596901 A CN111596901 A CN 111596901A CN 202010426578 A CN202010426578 A CN 202010426578A CN 111596901 A CN111596901 A CN 111596901A
- Authority
- CN
- China
- Prior art keywords
- code
- block
- attribute
- name
- type
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Traffic Control Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于模块定义图的无人机飞控系统的C++代码生成方法,旨在解决现有无人机飞控系统C++生成代码技术中存在的生成效率和正确率较低的技术问题。其实现步骤包括:构建无人机飞控系统的SysML模块定义图;获取SysML模块定义图对应的XMI文件;基于XMI文件构建结构树;自动生成C++的类代码;自动生成C++的枚举类型代码;将类代码和枚举类型代码连接得到无人机飞控系统的C++代码的生成结果。本发明建立的模块定义图结构简洁,基于结构树生成无人机C++代码的过程简单精准,使得生成无人机C++代码的效率和正确率高。
Description
技术领域
本发明涉及软件开发领域,特别涉及一种基于SysML模块定义图的嵌入式系统软件的C++代码生成方法。
背景技术
嵌入式系统是一个以应用为中心的专用计算机系统,在航空航天安全关键领域被广泛应用。相比于一般的计算机处理系统而言,嵌入式系统存在较大的差异性,不能实现大容量的存储功能,对软件代码有较高的可靠性和实时性要求。一般应用于嵌入式系统开发中使用的程序语言有很多种,包括java、C/C++、python等,其中C++语言实现了面向对象程序设计,且在高级语言中运行速度是最快的,因此在嵌入式系统的开发中应用最为广泛。
一个可应用于嵌入式系统的生成C++代码方法应具有较高的生成效率,且生成C++代码的正确率高,代码结构完整。现有的生成C++代码方法包括技术人员直接开发和使用模型驱动技术自动生成两种,其中使用模型驱动技术自动生成的基本思想是将工作重点放在模型构建上,通过模型转换自动生成代码,避免了人工书写代码可能出现的错误,因此具有开发效率高、生成代码正确率高的优点。模型驱动首先需要建立适合设计对象的模型,建模时可选择的模型分为SysML模型、UML模型等。其中SysML模型是一类专门面向系统工程建立的模型,SysML结构模型是SysML模型的一部分,分为模块定义图、内部模块图和包图,模块定义图用于描述系统的层次以及系统/组件的分类,通过模块之间的组成、泛化、依赖等关系来表示各个子系统之间的关系。
无人机的飞行控制系统是一个典型的嵌入式系统,无人机飞控系统是指能够稳定无人机飞行姿态,并能控制无人机自主或半自主飞行的控制系统,是无人机的大脑,主要的功能就是自动保持飞机的正常飞行姿态,具体包括模态控制、位置控制、切换飞行模式等功能。随着无人机的广泛应用,各项功能趋于完善,无人机飞行控制系统作为一种实时控制系统,其复杂性也日益增加,使得人工开发飞行控制系统难度大,开发时生成代码的效率低,代码正确率低。
为了提高生成C++代码的正确率和效率,研发人员做了尝试,例如授权公告号为CN102929681B,名称为“一种虚拟试验分布式对象模型框架代码自动生成方法”的发明专利,公开了一种从虚拟试验分布式对象模型自动生成C++代码的方法,该专利定义一种虚拟试验分布式对象模型的描述语言,对使用所述语言描述的虚拟试验分布式对象模型的文本文件进行词法分析和语法分析,建立所述描述语言与IDL语言的映射关系,调用IDL编译器生成对应的虚拟试验分布式对象模型框架代码,构建分布式对象模型模板,通过标签替换生成虚拟试验分布式对象模型框架C++代码。该发明给出的方法通过词法分析和语法分析虚拟试验分布式对象模型的描述语言,建立描述语言与其他语言的映射关系,将模型自动转换为C++代码,减少了开发人员的工作量,提高了应用开发的可靠性和效率。但因为只提出了基于虚拟分布式试验对象模型的生成代码方法,应用于生成无人机代码的步骤过多,需要定义模型描述语言并映射为IDL语言,再通过标签替换生成C++代码,生成无人机代码正确率较低,生成效率较低。
发明内容
本发明的目的在于克服现有技术存在的缺陷,提出一种基于模块定义图的无人机飞控系统的C++代码生成方法,旨在解决现有无人机飞控系统C++生成代码技术中存在的生成效率和正确率较低的技术问题。
本发明的技术思路是:首先构建无人机飞控系统的SysML模块定义图,获取SysML模块定义图对应的XMI文件,并将此XMI文件元素映射为结构树节点,生成对应的结构树,之后查找结构树中的所有节点,将节点元素转换为无人机C++代码中类代码、枚举类型代码,最后将类代码和枚举类型代码相连得到完整的无人机飞行模式的C++代码,完成从SysML模块定义图到无人机飞控系统的C++代码转换,其实现方案包括如下步骤:
(1)构建无人机飞行控制系统的SysML模块定义图:
在papyrus软件中,构建无人机飞行控制系统的SysML模块定义图,包括基础功能模块和与其并行连接的多个飞行模式模块,以及多个枚举类型模块,其中:
所述基础功能模块,用于生成无人机C++代码中的部分类代码,该模块包含了无人机飞行控制系统中所有飞行模式共有的操作和块属性,操作用于生成C++类中的函数,块属性用于生成C++类中的变量定义,操作中包含参数定义,用于生成类中函数的参数,操作和属性均具有属性name、visibility、type、isstatic,参数具有属性name、type、direction;
所述飞行模式模块,是为每一种无人机飞控系统飞行模式构建的多个模块,用于生成无人机C++代码中的部分类代码,每个模块包含一种飞行模式用到的操作和块属性,操作中包含参数定义,每个模块包含与基础功能模块的泛化关系,并泛化关系与基础功能模块相连接,操作和块属性均具有属性name、visibility、type、isstatic,参数具有属性name、type、direction,泛化关系具有属性general;
所述枚举类型模块,是为无人机飞行控制系统开发中需要用到的枚举类型构建的多个模块,用于生成无人机C++代码中的枚举类型代码,每个模块包含枚举类型的关键字和具体信息,关键字具有属性name,具体信息包括name和value,关键字用于生成枚举类型的常量定义,具体信息用于生成枚举类型常量中的具体取值和文本;
(2)获取SysML模块定义图对应的XMI文件:
通过papyrus软件读取SysML模块定义图对应的XMI文件,文件里包含对模块定义图中的多个元素,每个元素有对应的标签和属性,元模型为模块定义图,标签为model,基础功能模块、飞行模式模块和枚举类型模块对应的标签均为packagedelement,其中:
packagedelement是model的子标签,其中基础功能模块、飞行模式模块对应的packagedelement类型为block,枚举类型模块对应的packagedelement类型为enumeration;
类型为block的packagedelement,子标签分别为块属性的标签ownedattribute、操作的标签ownedoperation和泛化的标签generalization;其中ownedoperation的子标签为参数的标签ownedparmeter;
类型为enumeraiton的packagedelement,子标签为关键字的标签ownedliteral;ownedliteral的子标签为具体信息的标签specification;
(3)基于模块定义图的XMI文件构建结构树:
(3b)获取结构树节点集V:
(3b1)在XMI文件中查找标签model、packagedelement的元素,并将model的元素作为T的根节点<model>加入至V中;
(3b2)分别将XMI文件中标签packagedelement类型为block、enumeration的元素作为T的枝节点<block>、<enumeration>加入至V中,分别将XMI文件中标签为ownedoperation、ownedliteral的元素作为T的枝节点<ownedoperation>、<ownedliteral>加入至V中,其中<block>、<enumeration>作为<model>的子节点,<ownedoperation>作为<block>的子节点,<ownedliteral>作为<enumeration>的子节点,且所有枝节点个数均大于等于1;
(3b3)分别将XMI文件中所有标签为ownedattribute、generalization、ownedparmeter、specification的元素作为T的叶子节点<ownedattribute>、<generalization>、<ownedparmeter>、<specification>加入至V中,其中<ownedattribute>、<generalization>作为<block>的子节点,<ownedparmeter>作为<ownedoperation>的子节点,<specification>作为<ownedliteral>的子节点,且所有叶子节点个数均大于等于1;
(3c)获取结构树有向边集E:
(3c1)将<model>与<block>、<enumeration>组成的有序二元组(<model>,<block>)、(<model>,<enumeration>)作为有向边加入E;
(3c2)分别将<block>与<ownedattribute>、<ownedoperation>、<generalization>组成的有序二元组(<block>,<ownedattribute>)、(<block>,<ownedoperation>)、(<block>,<generalization>)作为有向边加入E,将<enumeration>和<ownedliteral>组成的有序二元组(<enumeration>,<ownedliteral>)作为有向边加入E;
(3c3)将<ownedliteral>和<specification>组成的有序二元组(<ownedliteral>,<specification>),以及<ownedoperation>和<ownedparmeter>组成的有序二元组(<ownedoperation>,<ownedparmeter>)作为有向边加入E;
(3d)通过结构树有向边集的有向边连接节点集的节点得到结构树:
(3d1)将根节点<model>通过(<model>,<block>)与枝节点<block>相连,将根节点<model>通过(<model>,<enumeration>)与枝节点<enumeration>相连;
(3d2)分别通过(<block>,<ownedattribute>)、(<block>,<ownedoperation>)、(<block>,<generalization>)将枝节点<block>与叶子节点<ownedattribute>、枝节点<ownedoperation>、叶子节点<generalization>相连;通过(<ownedoperation>,<ownedparmeter>)将枝节点<ownedoperation>与叶子节点<ownedparmeter>相连接;
(3d3)通过(<enumeration>,<ownedliteral>)将枝节点<ownedoperation>与枝节点<ownedliteral>相连接;通过(<ownedliteral>,<specification>)将枝节点<ownedliteral>与叶子节点<specification>相连接,得到基于XMI文件的结构树T;
(4)基于结构树自动生成无人机飞控系统的C++的类代码:
(4a)定义C++的类代码Code<block>,并初始化Code<block>为空字符串;
(4b)判断结构树T中每一个枝节点<block>是否存在有向边(<block>,<generalization>),若是,执行步骤(4c);否则,将字符串#include<stdio.h>、#include<stdlib.h>、#include<stddef.h>、#include<string.h>、#include<stdint.h>、#include<cmath..h>、#include"enumType.h"依次相连为库包含代码字符串Code<defaultInclude>,然后将Code<block>和Code<defaultInclude>相连为字符串Code<block>1,并执行步骤(4d);
(4c)将<block>的叶子节点<generalization>的属性general转换为C++代码中类的名称字符串[block.generalization.general],并将Code<block>和字符串"#include\"[block.generalization.general].h\""依次相连为字符串Code<block>2,然后执行步骤(4e),其中"\"为引号的转义字符;
(4d)将<block>的属性name转换为C++代码中类的名称字符串[block.name],并将Code<block>1、字符串"class"以及[block.name]依次相连为字符串Code<block>2,然后执行步骤(4e);
(4e)判断<block>是否连接有向边(<block>,<generalization>),若是,将Code<block>2、":public"、[block.generalization.general]、"{"依次相连得到字符串Code<block>3,并执行步骤(4g);否则将Code<block>2与"{"依次相连为字符串Code<block>3,并执行步骤(4f);
(4f)查找该节点<block>除叶子节点<generalization>以外的其他子节点,将节点信息转换为成员变量以及成员函数的代码Code<X>,并将Code<block>3与Code<X>依次相连得到新字符串Code<block>4;
(4g)将Code<block>4与字符串"}"依次相连为字符串Code<block>5,将Code<block>5写到以"[block.name].cpp"为文件名的类代码文件中,得到与枝节点<block>数量相同的字符串,并将字符串作为最终生成的C++的类代码;
(5)基于结构树自动生成无人机飞控系统的C++的枚举类型代码:
(5a)定义C++的枚举类型代码Code<enum>,并初始化Code<enum>为空字符串;
(5b)对于结构树T中每一个枝节点<enumeration>,将其属性name转换为C++代码中枚举类型的名称字符串[enumeration.name];并将Code<enum>、字符串"enum"、[enumeration.name]和"{"依次相连为字符串Code<enum>1;
(5c)对于<enumeration>的每一个子节点<ownedliteral>,将其属性name的值转换为C++代码枚举常量的名称字符串[ownedliteral.name],将<ownedliteral>子节点<specification>的属性value值转换为C++代码中枚举值[ownedliteral.specification.value],判断当前<ownedliteral>是否为最后一个<enumeration>的子节点,若是,则将Code<enum>1、[ownedliteral.name]、"="、[ownedliteral.specification.value]、"}"依次相连为字符串Code<enum>2;否则,将Code<enum>1、[ownedliteral.name]、"="、[ownedliteral.specification.value]依次相连为字符串Code<enum>2;
(5d)将Code<enum>2写到以"enumType.h"为文件名的头文件中,得到与枝节点<enumeration>数量相同的字符串,并将字符串作为最终生成的C++的枚举类型代码;
(6)获取无人机飞控系统的C++代码的生成结果:
将C++的类代码与C++的枚举类型代码相连得到无人机飞控系统的C++的代码Codefinal。
本发明与现有技术相比,具有如下优点:
1.本发明首先构建无人机的SysML模块定义图,生成模块定义图对应的XMI文件结构树,再基于结构树生成无人机的C++代码。本发明将无人机飞行控制系统的模型具体到模块定义图,简化了建立无人机飞行控制系统的模型的过程,模块定义图结构简洁,使得从模块定义图生成无人机代码的效率更高。
2.本发明基于模块定义图对应的结构树生成无人机的C++代码,结构树读取方便结构清晰,从结构树生成无人机C++代码的过程简单精准,使得生成的代码正确率高,且进一步提高了生成的C++代码的效率,与现有技术相比有效提高了生成C++代码的质量。
附图说明
图1是本发明的实现流程图。
图2是本发明实施例中所构造的结构树的拓扑结构图。
具体实施方式
以下结合附图和具体实施例,对本发明作进一步详细描述:
参照图1,本发明包括如下步骤:
步骤1)构建无人机飞行控制系统的SysML模块定义图:
Papyrus是一个基于Eclipse平台UML2建模工具,在Papyrus软件中构建无人机飞行控制系统的SysML模块定义图,包括基础功能模块和与其并行连接的多个飞行模式模块,以及多个枚举类型模块,其中:
所述基础功能模块,用于无人机C++代码中的部分类代码,该模块包含了无人机飞行控制系统中所有飞行模式共有的操作和块属性,操作用于生成C++类中的函数,块属性用于生成C++类中的变量定义,操作中包含参数定义,用于生成类中函数的参数,操作和属性均具有属性name、visibility、type、isstatic,参数具有属性name、type、direction;
以构建的一个简单的基础功能模块为例,模块属性name为Mode、visibility为public,块属性的属性name为”auto_yaw”、visibility为protected、isstatic为true,操作的属性name为”do_user_takeoff”、visibility为public、type为bool,操作中包含三个参数,第一个参数添加属性name为”takeoff_alt_cm”、type为float、direction为in,第二个参数属性name为”must_navigate”、type为bool、direction为in,第三个参数属性direction为return;
所述飞行模式模块,是为每一种无人机飞控系统飞行模式构建的多个模块,用于生成无人机C++代码中的部分类代码,每个模块包含一种飞行模式用到的操作和块属性,操作中包含参数定义,每个模块包含与基础功能模块的泛化关系,并泛化关系与基础功能模块相连接,操作和块属性均具有属性name、visibility、type、isstatic,参数具有属性name、type、direction,泛化关系具有属性general;
以飞行模式Guided为例的一个简单的飞行模式模块,模块属性name为ModeGuided、visibility为public;模块中块属性的属性name为”guided_mode”、type为GuidedMode、visibility为private,泛化关系属性general为Mode,操作的属性name为”init”、type为bool、visibility为public;操作中包含两个参数,第一个参数属性name为”ignore_checkes”、type为bool、direction为in,第二个参数属性direction为return;
所述枚举类型模块,是为无人机飞行控制系统开发中需要用到的枚举类型构建的多个模块,用于生成无人机C++代码中的枚举类型代码,每个模块包含枚举类型的关键字和具体信息,关键字具有属性name,具体信息包括name和value,关键字用于生成枚举类型的常量定义,具体信息用于生成枚举类型常量中的具体取值和文本;
以构建的一个简单的枚举类型模块为例,枚举类型模块的属性name为ArmingChecks,关键字属性name为ARMING_CHECK_NONE,具体信息属性name为ARMING_CHECK_NONE、value为”0x000”;
所述基础功能模块和飞行模式模块的属性name表示该模块的名称;属性visibility表示该模块的可见性,取值为public、private或protected;
块属性的属性name表示模块内属性的名称;属性type表示模块内属性的类型,或为与该模块有关联关系的模块名称;属性visibility表示块内属性的可见性;属性isstatic表示块属性是否为静态;
操作的属性name块内操作的名称;属性type表示块内操作的返回类型;属性visibility块内操作的可见性;属性isstatic表示块内操作是否为静态;
参数的属性name表示块内操作参数的名称;属性type表示该参数的类型;属性direction取值为in和return,若为in则表示该参数为传入该操作的参数,若为return则表示该参数为该操作返回的参数;
枚举类型关键字的属性name表示枚举类型模块中常量的名称;具体取值的的属性name为枚举常量文本,属性value为枚举常量的具体取值;
泛化关系的属性general表示与该模块相关联的模块的具体名称;
步骤2)获取SysML模块定义图对应的XMI文件:
通过papyrus软件读取SysML模块定义图对应的XMI文件,文件里包含对模块定义图中的多个元素,每个元素有对应的标签和属性,元模型为模块定义图,标签为model,基础功能模块、飞行模式模块和枚举类型模块对应的标签均为packagedelement,其中:
packagedelement是model的子标签,其中基础功能模块、飞行模式模块对应的packagedelement类型为block,枚举类型模块对应的packagedelement类型为enumeration;
类型为block的packagedelement,子标签分别为块属性的标签ownedattribute、操作的标签ownedoperation和泛化的标签generalization;其中ownedoperation的子标签为参数的标签ownedparmeter;
类型为enumeraiton的packagedelement,子标签为关键字的标签ownedliteral;ownedliteral的子标签为具体信息的标签specification;
以上述步骤构建的模块定义图为例,得到的XMI文件为:
步骤3)基于模块定义图的XMI文件构建结构树:
步骤3b)获取结构树节点集V:
步骤3b1)在XMI文件中查找标签model、packagedelement的元素,并将model的元素作为T的根节点<model>加入至V中;
步骤3b2)分别将XMI文件中标签packagedelement类型为block、enumeration的元素作为T的枝节点<block>、<enumeration>加入至V中,分别将XMI文件中标签为ownedoperation、ownedliteral的元素作为T的枝节点<ownedoperation>、<ownedliteral>加入至V中,其中<block>、<enumeration>作为<model>的子节点,<ownedoperation>作为<block>的子节点,<ownedliteral>作为<enumeration>的子节点,且所有枝节点个数均大于等于1;
步骤3b3)分别将XMI文件中所有标签为ownedattribute、generalization、ownedparmeter、specification的元素作为T的叶子节点<ownedattribute>、<generalization>、<ownedparmeter>、<specification>加入至V中,其中<ownedattribute>、<generalization>作为<block>的子节点,<ownedparmeter>作为<ownedoperation>的子节点,<specification>作为<ownedliteral>的子节点,且所有叶子节点个数均大于等于1;
步骤3c)获取结构树有向边集E:
步骤3c1)将<model>与<block>、<enumeration>组成的有序二元组(<model>,<block>)、(<model>,<enumeration>)作为有向边加入E;
步骤3c2)分别将<block>与<ownedattribute>、<ownedoperation>、<generalization>组成的有序二元组(<block>,<ownedattribute>)、(<block>,<ownedoperation>)、(<block>,<generalization>)作为有向边加入E,将<enumeration>和<ownedliteral>组成的有序二元组(<enumeration>,<ownedliteral>)作为有向边加入E;
步骤3c3)将<ownedliteral>和<specification>组成的有序二元组(<ownedliteral>,<specification>),以及<ownedoperation>和<ownedparmeter>组成的有序二元组(<ownedoperation>,<ownedparmeter>)作为有向边加入E;
步骤3d)参考图2,通过结构树有向边集的有向边连接节点集的节点得到结构树:
步骤3d1)将根节点<model>通过(<model>,<block>)与枝节点<block>相连,将根节点<model>通过(<model>,<enumeration>)与枝节点<enumeration>相连;
步骤3d2)分别通过(<block>,<ownedattribute>)、(<block>,<ownedoperation>)、(<block>,<generalization>)将枝节点<block>与叶子节点<ownedattribute>、枝节点<ownedoperation>、叶子节点<generalization>相连;通过(<ownedoperation>,<ownedparmeter>)将枝节点<ownedoperation>与叶子节点<ownedparmeter>相连接;
步骤3d3)通过(<enumeration>,<ownedliteral>)将枝节点<ownedoperation>与枝节点<ownedliteral>相连接;通过(<ownedliteral>,<specification>)将枝节点<ownedliteral>与叶子节点<specification>相连接,得到基于XMI文件的结构树T;
生成的结构树集合了所有生成代码需要用到的信息,结构树节点对应模块定义图中的元素,有向边对应元素之间的关系,节点信息包含元素的名称及属性,通过查找结构树中的节点快速获取到用于生成对应代码的信息,直接从模块定义图对应的结构树生成代码过程简单,生成代码的速度快,生成代码的正确率高。
参照图2,所有节点的个数等于1时,所生成结构树包含四层,具体结构为:
结构树第一层包含1个根节点<model>,出度为2,通过有向边连接2个<model>的子节点;
结构树第二层包含1个节点<block>和1个节点<enumeration>,节点<block>出度为3,通过有向边连接3个<block>的子节点;节点<enumeration>出度为1,通过有向边连接1个<enumeration>的子节点;
结构树第三层包含4个节点,分别为<block>的子节点<ownedattribute>、<ownedoperation>、<generalization>和<enumeration>的子节点<ownedliteral>,<ownedattribute>和<generalization>出度均为0,<ownedoperation>和<ownedliteral>出度均为1,均通过有向边连接1个子节点;
结构树第四层包含2个节点,分别为<ownedoperation>的子节点<ownedparameter>和<ownedliteral>的子节点<specification>,两个节点出度均为0;
步骤4)基于结构树自动生成无人机飞控系统的C++的类代码:
步骤4a)定义C++的类代码Code<block>,并初始化Code<block>为空字符串;
步骤4b)判断结构树T中每一个枝节点<block>是否存在有向边(<block>,<generalization>),若是,执行步骤(4c);否则,将字符串#include<stdio.h>、#include<stdlib.h>、#include<stddef.h>、#include<string.h>、#include<stdint.h>、#include<cmath..h>、#include"enumType.h"依次相连为库包含代码字符串Code<defaultInclude>,然后将Code<block>和Code<defaultInclude>相连为字符串Code<block>1,并执行步骤(4d);
步骤4c)将<block>的叶子节点<generalization>的属性general转换为C++代码中类的名称字符串[block.generalization.general],并将Code<block>和字符串"#include\"[block.generalization.general].h\""依次相连为字符串Code<block>2,然后执行步骤(4e),其中"\"为引号的转义字符;
步骤4d)将<block>的属性name转换为C++代码中类的名称字符串[block.name],并将Code<block>1、字符串"class"以及[block.name]依次相连为字符串Code<block>2,然后执行步骤(4e);
步骤4e)判断<block>是否连接有向边(<block>,<generalization>),若是,将Code<block>2、":public"、[block.generalization.general]、"{"依次相连得到字符串Code<block>3,并执行步骤(4g);否则将Code<block>2与"{"依次相连为字符串Code<block>3,并执行步骤(4f);
步骤4f)查找该节点<block>除叶子节点<generalization>以外的其他子节点,将节点信息转换为成员变量以及成员函数的代码Code<X>,并将Code<block>3与Code<X>依次相连得到新字符串Code<block>4;
所述将节点信息转换为成员变量以及成员函数的代码具体步骤为:
(4f1)定义成员变量代码字符串Code<attr>、成员函数代码字符串Code<op>,并都初始化为空字符串;
(4f2)将节点<ownedattribute>的属性name值转换为成员变量的名称字符串[ownedattribute.name];属性visibility值转换为成员变量的可见性字符串[ownedattribute.visibility];属性type值转换为成员变量的类型字符串[ownedattribute.type];若属性isstatic取值为false,则将Code<attr>、[ownedattribute.visibility]、":"、[ownedattribute.type]、[ownedattribute.name]与";"依次相连为字符串Code<attr>1;若属性isstatic取值为true,则将Code<attr>、[ownedattribute.visibility]、":static"、[ownedattribute.type]、[ownedattribute.name]与";"依次相连为字符串Code<attr>1;
(4f3)将节点<ownedoperation>的属性name值转换为C++函数名字符串[ownedoperation.name];将属性visibility的值转换为C++函数的可见性字符串[ownedoperation.visibility];将属性type的值转换为C++函数的返回值类型字符串[ownedoperation.type];然后将Code<op>、[ownedoperation.visibility]、[ownedattribute.visibility]、":"、[ownedoperation.type]、[ownedoperation.name]与"("依次相连为字符串Code<op>1;
(4f4)对于每一个<ownedoperation>的子节点<ownedparameter>,将<ownedparameter>的属性name值转换为C++函数形式参数名称字符串[ownedparameter.name];将属性type值转换为C++函数形式参数的类型字符串[ownedparameter.type];
(4f5)判断该节点是否为最后一个子节点,若是,将Code<op>1、[ownedoperation.type]、[ownedoperation.name]与")"依次相连为字符串Code<op>2;否则将Code<op>1、[ownedoperation.type]、[ownedoperation.name]与","依次相连为字符串Code<op>2;
(4f6)将Code<op>2与";"依次相连为字符串Code<op>3,并将Code<op>3写到以“[block.name].h”为文件名的头文件中;
(4f7)将Code<attr>1、Code<op>2与"{}"依次相连得到最终的字符串Code<X>。
步骤4g)将Code<block>4与字符串"}"依次相连为字符串Code<block>5,将Code<block>5写到以"[block.name].cpp"为文件名的类代码文件中,得到与枝节点<block>数量相同的字符串,并将字符串作为最终生成的C++的类代码;
共生成四个文件,生成文件Mode.cpp中内容如下:
#include″Mode.h″
bool Mode::do_user_takeoff(float takeoff_alt_cm,bool must_navigate){
}
生成文件Mode.h中内容如下:
生成文件ModeGuided.h中内容如下:
生成文件ModeGuided.cpp中内容如下:
#include"ModeGuided.h"
boolModeGuided::init(boolignore_checks){
}
步骤5)基于结构树自动生成无人机飞控系统的C++的枚举类型代码:
步骤5a)定义C++的枚举类型代码Code<enum>,并初始化Code<enum>为空字符串;
步骤5b)对于结构树T中每一个枝节点<enumeration>,将其属性name转换为C++代码中枚举类型的名称字符串[enumeration.name];并将Code<enum>、字符串"enum"、[enumeration.name]和"{"依次相连为字符串Code<enum>1;
步骤5c)对于<enumeration>的每一个子节点<ownedliteral>,将其属性name的值转换为C++代码枚举常量的名称字符串[ownedliteral.name],将<ownedliteral>子节点<specification>的属性value值转换为C++代码中枚举值[ownedliteral.specification.value],判断当前<ownedliteral>是否为最后一个<enumeration>的子节点,若是,则将Code<enum>1、[ownedliteral.name]、"="、[ownedliteral.specification.value]、"}"依次相连为字符串Code<enum>2;否则,将Code<enum>1、[ownedliteral.name]、"="、[ownedliteral.specification.value]依次相连为字符串Code<enum>2;
步骤5d)将Code<enum>2写到以"enumType.h"为文件名的头文件中,得到与枝节点<enumeration>数量相同的字符串,并将字符串作为最终生成的C++的枚举类型代码;
生成枚举类型文件enumType.h内容如下:
enumArmingChecks{
_ARMING_CHECK_NONE=0x000,};
步骤6)获取无人机飞控系统的C++代码的生成结果:
将C++的类代码与C++的枚举类型代码相连得到无人机飞控系统C++的代码Codefinal。
Claims (3)
1.一种基于模块定义图的无人机飞行控制系统的C++代码生成方法,其特征在于,包括如下步骤:
(1)构建无人机飞行控制系统的SysML模块定义图:
在papyrus软件中,构建无人机飞行控制系统的SysML模块定义图,包括基础功能模块和与其并行连接的多个飞行模式模块,以及多个枚举类型模块,其中:
所述基础功能模块,用于生成无人机C++代码中的部分类代码,该模块包含了无人机飞行控制系统中所有飞行模式共有的操作和块属性,操作用于生成C++类中的函数,块属性用于生成C++类中的变量定义,操作中包含参数定义,用于生成类中函数的参数,操作和属性均具有属性name、visibility、type、isstatic,参数具有属性name、type、direction;
所述飞行模式模块,是为每一种无人机飞控系统飞行模式构建的多个模块,用于生成无人机C++代码中的部分类代码,每个模块包含一种飞行模式用到的操作和块属性,操作中包含参数定义,每个模块包含与基础功能模块的泛化关系,并泛化关系与基础功能模块相连接,操作和块属性均具有属性name、visibility、type、isstatic,参数具有属性name、type、direction,泛化关系具有属性general;
所述枚举类型模块,是为无人机飞行控制系统开发中需要用到的枚举类型构建的多个模块,用于生成无人机C++代码中的枚举类型代码,每个模块包含枚举类型的关键字和具体信息,关键字具有属性name,具体信息包括name和value,关键字用于生成枚举类型的常量定义,具体信息用于生成枚举类型常量中的具体取值和文本;
(2)获取SysML模块定义图对应的XMI文件:
通过papyrus软件读取SysML模块定义图对应的XMI文件,文件里包含对模块定义图中的多个元素,每个元素有对应的标签和属性,元模型为模块定义图,标签为model,基础功能模块、飞行模式模块和枚举类型模块对应的标签均为packagedelement,其中:
packagedelement是model的子标签,其中基础功能模块、飞行模式模块对应的packagedelement类型为block,枚举类型模块对应的packagedelement类型为enumeration;
类型为block的packagedelement,子标签分别为块属性的标签ownedattribute、操作的标签ownedoperation和泛化的标签generalization,其中ownedoperation的子标签为参数的标签ownedparmeter;
类型为enumeraiton的packagedelement,子标签为关键字的标签ownedlitera,ownedliteral的子标签为具体信息的标签specification;
(3)基于模块定义图的XMI文件构建结构树:
(3b)获取结构树节点集V:
(3b1)在XMI文件中查找标签model、packagedelement的元素,并将model的元素作为T的根节点<model>加入至V中;
(3b2)分别将XMI文件中标签packagedelement类型为block、enumeration的元素作为T的枝节点<block>、<enumeration>加入至V中,分别将XMI文件中标签为ownedoperation、ownedliteral的元素作为T的枝节点<ownedoperation>、<ownedliteral>加入至V中,其中<block>、<enumeration>作为<model>的子节点,<ownedoperation>作为<block>的子节点,<ownedliteral>作为<enumeration>的子节点,且所有枝节点个数均大于等于1;
(3b3)分别将XMI文件中所有标签为ownedattribute、generalization、ownedparmeter、specification的元素作为T的叶子节点<ownedattribute>、<generalization>、<ownedparmeter>、<specification>加入至V中,其中<ownedattribute>、<generalization>作为<block>的子节点,<ownedparmeter>作为<ownedoperation>的子节点,<specification>作为<ownedliteral>的子节点,且所有叶子节点个数均大于等于1;
(3c)获取结构树有向边集E:
(3c1)将<model>与<block>、<enumeration>组成的有序二元组(<model>,<block>)、(<model>,<enumeration>)作为有向边加入E;
(3c2)分别将<block>与<ownedattribute>、<ownedoperation>、<generalization>组成的有序二元组(<block>,<ownedattribute>)、(<block>,<ownedoperation>)、(<block>,<generalization>)作为有向边加入E,将<enumeration>和<ownedliteral>组成的有序二元组(<enumeration>,<ownedliteral>)作为有向边加入E;
(3c3)将<ownedliteral>和<specification>组成的有序二元组(<ownedliteral>,<specification>),以及<ownedoperation>和<ownedparmeter>组成的有序二元组(<ownedoperation>,<ownedparmeter>)作为有向边加入E;
(3d)通过结构树有向边集的有向边连接节点集的节点得到结构树:
(3d1)将根节点<model>通过(<model>,<block>)与枝节点<block>相连,将根节点<model>通过(<model>,<enumeration>)与枝节点<enumeration>相连;
(3d2)分别通过(<block>,<ownedattribute>)、(<block>,<ownedoperation>)、(<block>,<generalization>)将枝节点<block>与叶子节点<ownedattribute>、枝节点<ownedoperation>、叶子节点<generalization>相连;通过(<ownedoperation>,<ownedparmeter>)将枝节点<ownedoperation>与叶子节点<ownedparmeter>相连接;
(3d3)通过(<enumeration>,<ownedliteral>)将枝节点<ownedoperation>与枝节点<ownedliteral>相连接;通过(<ownedliteral>,<specification>)将枝节点<ownedliteral>与叶子节点<specification>相连接,得到基于XMI文件的结构树T;
(4)基于结构树自动生成无人机飞控系统的C++的类代码:
(4a)定义C++的类代码Code<block>,并初始化Code<block>为空字符串;
(4b)判断结构树T中每一个枝节点<block>是否存在有向边(<block>,<generalization>),若是,执行步骤(4c);否则,将字符串#include<stdio.h>、#include<stdlib.h>、#include<stddef.h>、#include<string.h>、#include<stdint.h>、#include<cmath..h>、#include"enumType.h"依次相连为库包含代码字符串Code<defaultInclude>,然后将Code<block>和Code<defaultInclude>相连为字符串Code<block>1,并执行步骤(4d);
(4c)将<block>的叶子节点<generalization>的属性general转换为C++代码中类的名称字符串[block.generalization.general],并将Code<block>和字符串"#include\"[block.generalization.general].h\""依次相连为字符串Code<block>2,然后执行步骤(4e),其中"\"为引号的转义字符;
(4d)将<block>的属性name转换为C++代码中类的名称字符串[block.name],并将Code<block>1、字符串"class"以及[block.name]依次相连为字符串Code<block>2,然后执行步骤(4e);
(4e)判断<block>是否连接有向边(<block>,<generalization>),若是,将Code<block>2、":public"、[block.generalization.general]、"{"依次相连得到字符串Code<block>3,并执行步骤(4g);否则将Code<block>2与"{"依次相连为字符串Code<block>3,并执行步骤(4f);
(4f)查找该节点<block>除叶子节点<generalization>以外的其他子节点,将节点信息转换为成员变量以及成员函数的代码Code<X>,并将Code<block>3与Code<X>依次相连得到新字符串Code<block>4;
(4g)将Code<block>4与字符串"}"依次相连为字符串Code<block>5,将Code<block>5写到以"[block.name].cpp"为文件名的类代码文件中,得到与枝节点<block>数量相同的字符串,并将字符串作为最终生成的C++的类代码;
(5)基于结构树自动生成无人机飞控系统的C++的枚举类型代码:
(5a)定义C++的枚举类型代码Code<enum>,并初始化Code<enum>为空字符串;
(5b)对于结构树T中每一个枝节点<enumeration>,将其属性name转换为C++代码中枚举类型的名称字符串[enumeration.name];并将Code<enum>、字符串"enum"、[enumeration.name]和"{"依次相连为字符串Code<enum>1;
(5c)对于<enumeration>的每一个子节点<ownedliteral>,将其属性name的值转换为C++代码枚举常量的名称字符串[ownedliteral.name],将<ownedliteral>子节点<specification>的属性value值转换为C++代码中枚举值[ownedliteral.specification.value],判断当前<ownedliteral>是否为最后一个<enumeration>的子节点,若是,则将Code<enum>1、[ownedliteral.name]、"="、[ownedliteral.specification.value]、"}"依次相连为字符串Code<enum>2;否则,将Code<enum>1、[ownedliteral.name]、"="、[ownedliteral.specification.value]依次相连为字符串Code<enum>2;
(5d)将Code<enum>2写到以"enumType.h"为文件名的头文件中,得到与枝节点<enumeration>数量相同的字符串,并将字符串作为最终生成的C++的枚举类型代码;
(6)获取无人机飞控系统的C++代码的生成结果:
将C++的类代码与C++的枚举类型代码相连得到无人机飞控系统的C++的代码Codefinal。
2.根据权利要求1所述的基于模块定义图的无人机飞控系统的C++代码生成方法,其特征在于,步骤(1)所述属性的具体含义为:
基础功能模块和飞行模式模块的属性name表示该模块的名称;属性visibility表示该模块的可见性,取值为public、private或protected;
块属性的属性name表示模块内属性的名称;属性type表示模块内属性的类型,或为与该模块有关联关系的模块名称;属性visibility表示块内属性的可见性;属性isstatic表示块属性是否为静态;
操作的属性name块内操作的名称;属性type表示块内操作的返回类型;属性visibility块内操作的可见性;属性isstatic表示块内操作是否为静态;
参数的属性name表示块内操作参数的名称;属性type表示该参数的类型;属性direction取值为in和return,若为in则表示该参数为传入该操作的参数,若为return则表示该参数为该操作返回的参数;
枚举类型关键字的属性name表示枚举类型模块中常量的名称;具体取值的的属性name为枚举常量文本,属性value为枚举常量的具体取值;
泛化关系的属性general表示与该模块相关联的模块的具体名称。
3.根据权利要求1所述的基于模块定义图的无人机飞控系统的C++代码生成方法,其特征在于,步骤(4f)所述的将节点信息转换为成员变量以及成员函数的代码Code<X>,具体步骤为:
(4f1)定义成员变量代码字符串Code<attr>、成员函数代码字符串Code<op>,并都初始化为空字符串;
(4f2)将节点<ownedattribute>的属性name值转换为成员变量的名称字符串[ownedattribute.name];属性visibility值转换为成员变量的可见性字符串[ownedattribute.visibility];属性type值转换为成员变量的类型字符串[ownedattribute.type];若属性isstatic取值为false,则将Code<attr>、[ownedattribute.visibility]、":"、[ownedattribute.type]、[ownedattribute.name]与";"依次相连为字符串Code<attr>1;若属性isstatic取值为true,则将Code<attr>、[ownedattribute.visibility]、":static"、[ownedattribute.type]、[ownedattribute.name]与";"依次相连为字符串Code<attr>1;
(4f3)将节点<ownedoperation>的属性name值转换为C++函数名字符串[ownedoperation.name];将属性visibility的值转换为C++函数的可见性字符串[ownedoperation.visibility];将属性type的值转换为C++函数的返回值类型字符串[ownedoperation.type];然后将Code<op>、[ownedoperation.visibility]、[ownedattribute.visibility]、":"、[ownedoperation.type]、[ownedoperation.name]与"("依次相连为字符串Code<op>1;
(4f4)对于每一个<ownedoperation>的子节点<ownedparameter>,将<ownedparameter>的属性name值转换为C++函数形式参数名称字符串[ownedparameter.name];将属性type值转换为C++函数形式参数的类型字符串[ownedparameter.type];
(4f5)判断该节点是否为最后一个子节点,若是,将Code<op>1、[ownedoperation.type]、[ownedoperation.name]与")"依次相连为字符串Code<op>2;否则将Code<op>1、[ownedoperation.type]、[ownedoperation.name]与","依次相连为字符串Code<op>2;
(4f6)将Code<op>2与";"依次相连为字符串Code<op>3,并将Code<op>3写到以“[block.name].h”为文件名的头文件中;
(4f7)将Code<attr>1、Code<op>2与"{}"依次相连得到最终的字符串Code<X>。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010426578.9A CN111596901B (zh) | 2020-05-19 | 2020-05-19 | 基于模块定义图的无人机飞行控制系统的c++代码生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010426578.9A CN111596901B (zh) | 2020-05-19 | 2020-05-19 | 基于模块定义图的无人机飞行控制系统的c++代码生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111596901A true CN111596901A (zh) | 2020-08-28 |
CN111596901B CN111596901B (zh) | 2022-12-02 |
Family
ID=72185876
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010426578.9A Active CN111596901B (zh) | 2020-05-19 | 2020-05-19 | 基于模块定义图的无人机飞行控制系统的c++代码生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111596901B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113821050A (zh) * | 2021-09-13 | 2021-12-21 | 北京航空航天大学 | 一种基于SysML定义无人机系统架构元模型的方法 |
CN115981615A (zh) * | 2023-03-20 | 2023-04-18 | 中科航迈数控软件(深圳)有限公司 | 融合语言模型与知识图谱的g代码生成方法及相关设备 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030188293A1 (en) * | 2002-03-14 | 2003-10-02 | Sun Microsystems, Inc. | Method, system, and program for translating a class schema in a source language to a target language |
WO2008075087A1 (en) * | 2006-12-21 | 2008-06-26 | Loughborough University Enterprises Limited | Code translator and method of automatically translating modelling language code to hardware language code |
US20100318336A1 (en) * | 2009-06-13 | 2010-12-16 | Falangas Eric T | Method of modeling dynamic characteristics of a flight vehicle |
CN102929681A (zh) * | 2012-10-31 | 2013-02-13 | 中国运载火箭技术研究院 | 一种虚拟试验分布式对象模型框架代码自动生成方法 |
CN103885816A (zh) * | 2014-03-28 | 2014-06-25 | 南京大学 | 一种实时嵌入式系统的仿真方法 |
CN107290978A (zh) * | 2017-06-16 | 2017-10-24 | 南京航空航天大学 | 一种直升机飞行仿真方法及系统 |
CN109597421A (zh) * | 2018-11-26 | 2019-04-09 | 河南大瑞物联网科技有限公司 | 无人机飞行状态控制系统代码辅助生成方法 |
-
2020
- 2020-05-19 CN CN202010426578.9A patent/CN111596901B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030188293A1 (en) * | 2002-03-14 | 2003-10-02 | Sun Microsystems, Inc. | Method, system, and program for translating a class schema in a source language to a target language |
WO2008075087A1 (en) * | 2006-12-21 | 2008-06-26 | Loughborough University Enterprises Limited | Code translator and method of automatically translating modelling language code to hardware language code |
US20100318336A1 (en) * | 2009-06-13 | 2010-12-16 | Falangas Eric T | Method of modeling dynamic characteristics of a flight vehicle |
CN102929681A (zh) * | 2012-10-31 | 2013-02-13 | 中国运载火箭技术研究院 | 一种虚拟试验分布式对象模型框架代码自动生成方法 |
CN103885816A (zh) * | 2014-03-28 | 2014-06-25 | 南京大学 | 一种实时嵌入式系统的仿真方法 |
CN107290978A (zh) * | 2017-06-16 | 2017-10-24 | 南京航空航天大学 | 一种直升机飞行仿真方法及系统 |
CN109597421A (zh) * | 2018-11-26 | 2019-04-09 | 河南大瑞物联网科技有限公司 | 无人机飞行状态控制系统代码辅助生成方法 |
Non-Patent Citations (3)
Title |
---|
XIAOHANG HAI等: ""Civil aircraft landing gear brake system development and evaluation using model based system engineering"", 《2017 36TH CHINESE CONTROL CONFERENCE (CCC)》 * |
吴黎明等: ""无人机飞控软件系统建模与测试用例生成研究"", 《计算机科学》 * |
郭鹏等: ""面向嵌入式软件开发的UML到Simulink模型转换方法"", 《计算机科学》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113821050A (zh) * | 2021-09-13 | 2021-12-21 | 北京航空航天大学 | 一种基于SysML定义无人机系统架构元模型的方法 |
CN113821050B (zh) * | 2021-09-13 | 2023-10-27 | 北京航空航天大学 | 一种基于SysML定义无人机系统架构元模型的方法 |
CN115981615A (zh) * | 2023-03-20 | 2023-04-18 | 中科航迈数控软件(深圳)有限公司 | 融合语言模型与知识图谱的g代码生成方法及相关设备 |
CN115981615B (zh) * | 2023-03-20 | 2023-06-30 | 中科航迈数控软件(深圳)有限公司 | 融合语言模型与知识图谱的g代码生成方法及相关设备 |
Also Published As
Publication number | Publication date |
---|---|
CN111596901B (zh) | 2022-12-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8745584B2 (en) | Dependency injection by static code generation | |
US8826225B2 (en) | Model transformation unit | |
CN109522007B (zh) | 面向安全关键嵌入式系统的SysML模型向AADL模型自动转换方法 | |
Poirier et al. | The CGNS system | |
CN111596901B (zh) | 基于模块定义图的无人机飞行控制系统的c++代码生成方法 | |
CN107203468A (zh) | 一种基于ast的软件版本演化对比分析方法 | |
CN109255193B (zh) | 基于模型转换的飞机后缘襟翼控制系统的设计方法 | |
CN110717268A (zh) | 一种基于face架构的可移植组件单元封装方法 | |
Holtmann et al. | Cutting through the jungle: Disambiguating model-based traceability terminology | |
Novak | Software reuse by specialization of generic procedures through views | |
Kim et al. | An MDA approach towards integrating formal and informal modeling languages | |
Jackson | Object models as heap invariants | |
Reza et al. | Mapping AADL to petri net tool-sets using PNML framework | |
Monroe | Rapid development of custom software architecture design environments | |
CN113190222B (zh) | 一种基于SysML的安全关键自治系统建模方法及工具 | |
Hennig | From Data Modeling to Knowledge Engineering in Space System Design | |
Silva-Lepe | Techniques for Reverse-engineering and Re-engineering into the Object-Oriented Paradigm | |
Wölfl | Data management in certified avionics systems | |
Maturana | A translator writing system for algebraic modeling languages | |
CN113190222A (zh) | 一种基于SysML的安全关键自治系统建模方法及工具 | |
Beazley | An extensible compiler for creating scriptable scientific software | |
Dean et al. | A theory model core for module interconnection languages. | |
Michotte et al. | Aspect oriented modeling of component architectures using AADL | |
Sahu et al. | ReqNet and ReqSim: A Network and Semantic Similarity Dataset of Requirements from the Tree Structure of System Requirement Specifications | |
CN114969123A (zh) | 引擎规则定义方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |