CN 111737888 A
2020.10.02
权利要求书2页 说明书13页 附图16页
A
8
8
8
7
3
7
1
1
1
N
C
(19)中华人民共和国国家知识产权局(12)发明专利申请(10)申请公布号 (43)申请公布日 (21)申请号 202010861043.4(22)申请日 2020.08.25(71)申请人 南京国睿信维软件有限公司地址 210013 江苏省南京市鼓楼区古平岗4号院53号楼7楼(72)发明人 余洋 陈超 余翔 许梦宇 (74)专利代理机构 南京苏创专利代理事务所(普通合伙) 32273代理人 凤婷(51)Int.Cl.G06F 30/20(2020.01)G06F 30/12(2020.01)G06F 8/30(2018.01) (54)发明名称功能逻辑动态执行方法(57)摘要本发明涉及一种功能逻辑动态执行方法,属于智能设计的技术领域,包括以下步骤:MSM图标准性预校验,转换指令的发送,状态高亮与ES图展示,多时间条件下的资源竞争,C代码的执行,Matlab代码编辑与调试,代码导出仿真执行。本发明将系统各部分的Matlab仿真程序嵌入系统架构模型中,基于系统架构模型的模式状态机进行动态执行,保证了系统仿真内容与系统架构设计内容的一致性,并使得系统方案设计与仿真紧密集成在一起,有效提高了系统设计质量。
CN 111737888 A
2
1.一种功能逻辑动态执行方法,其特征在于:包括以下步骤步骤1:校验MSM图有效性:若无效则结束,若有效,进去步骤2;步骤2:创建ES图;步骤3:对EditPart分屏并展示;步骤4:创建并显示模型,执行发送指令页面;步骤5:指令待发送状态;步骤6:时间倒计时指令是否触发:若否,则进入步骤7,若是,则进入步骤10;步骤7:发送指令;步骤8:判断是否为有效指令:若为无效指令进入步骤9,若为有效指定进入步骤10;步骤9:记录指令到历史记录,并判断是否退出执行,若是,则结束,若否,则进入步骤5;步骤10:将指令的源状态模式中的Exit,转换的effect,目标状态模式的入口、执行活动、运行活动功能记录到ES图中;步骤11:执行功能中的代码,调用C或Matlab仿真程序,并执行步骤9;步骤12:判断是否自动发送指令,若是,进入步骤5,若否,则不需要处理。2.根据权利要求1所述的功能逻辑动态执行方法,其特征在于:所述步骤1:校验MSM图有效性具体为:通过迭代算法的方式确认每张MSM图或某个模式/状态下有且仅有一个初始化节点,每个模式/状态最多有一个不含有触发器的转换。3.根据权利要求1所述的功能逻辑动态执行方法,其特征在于:所述步骤3具体为:在模型执行过程中,创建一张用于展现执行过程的ES图,并通过分屏技术在客户端原本的展示容器中创建两个画布,以左右布局的形式将MSM图装载入左边画布,将ES图装载入右边画布,达到同步展示的效果,每次指令执行的结果,新增元素都会被插入当前的ES图中,并被实时刷新展现到ES图中。4.根据权利要求1所述的功能逻辑动态执行方法,其特征在于:所述步骤4显示模型执行具体为:在模型执行页面中,选择不同对象中的转换,若是有效的转换,则转换中的触发器,影响及模式状态中的入口、执行活动、出口和运行活动/功能中的元素被插入到ES图中,若是发送无效的转换,则只会将转换插入到ES图中,并且能够指定具体的交换项、交换项元素、属性的值,每次发送的转换指令都将被记录到转换历史中。5.根据权利要求4所述的功能逻辑动态执行方法,其特征在于:所述步骤4发送指令页面具体为:在模型执行的过程中,通过发送相关指令指定执行的路径,在模式状态机模型图中在当前状态相关记录会高亮显示,将模型转换执行的路径抽象成链表数据结构,处于当前执行状态的节点以红色高亮展示,指向当前状态节点的指针和上一个节点以橘黄色高亮显示,当模型继续往下执行时,进入下一个节点,以迭代算法的方式改变当前节点,上一指针和节点以及其他历史指针和节点的高亮显示形式。6.根据权利要求1所述的功能逻辑动态执行方法,其特征在于:所述步骤6具体为:当模型转换的触发条件为时间事件时,通过计时方式,到达指定时间即会触发模型执行事件,当存在多个时间事件竞争模型事件执行时,通过多线程的方式,同时启用多个计时,谁最先触发即最先执行某一转换,其余事件线程强制终止,进入下一模型执行状态。7.根据权利要求1所述的功能逻辑动态执行方法,其特征在于:所述步骤11中的C代码的执行具体为:当“功能”中的代码为C代码时,则通过freemarker模板生成标准格式的C代权 利 要 求 书1/2页2
CN 111737888 A
3
码文件将相关C代码通过GCC编译执行生成.exe可执行文件,并通过基于RMI与JNI的方式封装数据交互接口,通过从入向功能交换中读取输入数据,设定出向功能交换中的输出数据,反向调用SMEX-Designer生成输出数据,实现SMEX运行环境与C环境数据的交互运行。8.根据权利要求7所述的功能逻辑动态执行方法,其特征在于:所述步骤11中的Matlab代码编辑与调试具体为:SMEX中的模型具备代码级的表达能力,模型中的“功能”可以嵌入C或Matlab代码,若是编辑Matlab代码,可以右键“功能”模型对象,以定制化的Matlab编辑器编辑该“功能”模型对象的代码,并在编辑过程中可以使用提示快捷键,通过对本地文件状态的实时监控,使得本地文件的数据能够实时同步到“功能”模型中,在Matlab代码中添加断点,再执行过程中进行断点调试。9.根据权利要求1所述的功能逻辑动态执行方法,其特征在于:所述步骤7中发送至指令具体为:代码导出仿真执行:选中模型后,通过对模型内关键字对每一个层级的元素进行遍历,获得该模型元素的信息,遍历到的模型通过结构化存储存入Matlab工作空间,以备状态运行时调用,模型在读取过程中若存在端口,需要对所有端口做赋默认值0;模型读取成功后,自动对相关插件进行赋值,赋值语句为若上一级选中模型元素中不包含下一级模型元素,则对对应控件赋默认值;在用户选中某一模型元素时,需要对下级控件进行赋值,赋值语句为若上一级选中模型元素中不包含下一级模型元素,则对对应控件赋默认值;同时,由于在运行过程中需要随时读取模型以及对端口进行读取和赋值,需要对模型变量和端口变量进行全局化处理,用户点击发送按钮后,开始运行状态机,状态机通过全局变量判断是否持续运行,当前状态稳定,即状态机无死循环,无正在运行的延迟转换且当前状态的出向转换不为空时,全局变量设置为1,通过while结构循环对当前状态和出向转换进行更新判断,状态持续运行停止时全局变量设置为0,持续运行过程中按照自动转换,功能交换,延迟转换的次序进行id匹配判断,由于状态机运行涉及到延时转换且需要实时反应当前状态,因此延时部分通过tic,toc函数搭配while结构进行,状态转换通过状态id和转换的sid,tic匹配进行判断,同时通过drawnnow实时显示,由于需要运行逻辑功能中导出的代码,且允许用户进行断点运行,因此需要对状态下是否挂载代码进行判断,通过eval函数运行代码,在执行状态机过程中,通过全局化的端口列表进行赋值,对功能转换的两端端口进行数值传递。权 利 要 求 书2/2页3
CN 111737888 A
4
功能逻辑动态执行方法技术领域[0001]本发明涉及一种功能逻辑动态执行方法,属于智能设计的技术领域。背景技术[0002]传统的结构功能设计或者产品设计,是在设计完成后进行效果/运行验证,当验证达不到预期效果时,需要对程序进行更改。该过程存在2个显著弊端,1是有些产品或结构设计的周期很长,当一直盲目设计到最后,验证不能执行时,可能要将整个设计都要重头做,非常浪费时间,2是,在设计完成后验证,当不能运行得到预期效果时,不能直观给出出错环节,需要设计人员自行排查,工作量非常大,很容易造成工时浪费,严重影响设计进度。 而且,如果错误发生在设计前期阶段,后续阶段需要对应调整的内容很多,增加很多无效工作。发明内容[0003]为了解决上述技术问题,本发明提供一种功能逻辑动态执行方法,本方法将系统各部分的Matlab仿真程序嵌入系统架构模型中,基于系统架构模型的模式状态机进行动态执行,保证了系统仿真内容与系统架构设计内容的一致性,并使得系统方案设计与仿真紧密集成在一起,有效提高了系统设计质量,其具体技术方案如下:一种功能逻辑动态执行方法,包括以下步骤步骤1:校验MSM图有效性:若无效则结束,若有效,进去步骤2;步骤2:创建ES图;步骤3:对EditPart分屏并展示;步骤4:创建并显示模型,执行发送指令页面;步骤5:指令待发送状态;步骤6:时间倒计时指令是否触发:若否,则进入步骤7,若是,则进入步骤10;步骤7:发送指令;步骤8:判断是否为有效指令:若为无效指令进入步骤9,若为有效指定进入步骤10;步骤9:记录指令到历史记录,并判断是否退出执行,若是,则结束,若否,则进入步骤5;步骤10:将指令的源状态模式中的Exit,转换的effect,目标状态模式的入口、执行活动、运行活动功能记录到ES图中;步骤11:执行功能中的代码,调用C或Matlab仿真程序,并执行步骤9;步骤12:判断是否自动发送指令,若是,进入步骤5,若否,则不需要处理。[0004]进一步的,所述步骤1:校验MSM图有效性具体为:通过迭代算法的方式确认每张MSM图或某个模式/状态下有且仅有一个初始化节点,每个模式/状态最多有一个不含有触发器的转换。[0005]进一步的,所述步骤3具体为:在模型执行过程中,创建一张用于展现执行过程的[ES]Scenario图ScenarioDiagramCreate.createScenarioDiagramByArchitecture说 明 书1/13页4
CN 111737888 A
5
(BlockArchitecture ba),并通过分屏技术EclipseUtil.buildDoubleEditor(IEditorPart leftEditorPart,MPart rightMPart,boolean horizontal)在客户端原本的展示容器中创建两个画布,以左右布局的形式将MSM图装载入左边画布,将ES图装载入右边画布,达到同步展示的效果,每次指令执行的结果,新增元素都会被插入当前的[ES]Scenario图中,并被实时刷新RefreshDiagramAction.refresh(ModelContext.selection)展现到ES图中。[0006]进一步的,所述步骤4显示模型执行具体为:在模型执行页面中,选择不同对象中的转换ExecutionDialog.sendTransitionMessage(),若是有效的转换,则转换中的触发器,影响及模式状态中的入口、执行活动、出口和运行活动/功能中的元素被插入到ES图中ScenarioDiagramProcess.execute2(List involvedModelElements,boolean isEffective),若是发送无效的转换,则只会将转换插入到ES图中,并且能够指定具体的交换项、交换项元素、属性的值,每次发送的转换指令都将被记录到转换历史中ModelContext.opeartionList.add(getOperationRecord(DEdge edge))。[0007]进一步的,所述步骤4发送指令页面具体为:在模型执行的过程中,通过发送相关指令指定执行的路径,在模式状态机模型图中在当前状态相关记录会高亮显示DiagramModel.initStyle(...),将模型转换执行的路径抽象成链表数据结构,处于当前执行状态的节点以红色高亮展示,指向当前状态节点的指针和上一个节点以橘黄色高亮显示,当模型继续往下执行时,进入下一个节点,以迭代算法的方式改变当前节点,上一指针和节点以及其他历史指针和节点的高亮显示形式。[0008]进一步的,所述步骤6具体为:当模型转换的触发条件为时间事件时,通过计时Thread.sleep(sleepTime)方式,到达指定时间即会触发diagramModel.execute(next)模型执行事件,当存在多个时间事件竞争模型事件执行时,通过多线程ExecutorService executor=Executors.newCachedThreadPool()的方式,同时启用多个计时,谁最先触发即最先执行某一转换,其余事件线程强制终止thread.interrupt(),进入下一模型执行状态。[0009]进一步的,所述步骤11中的C代码的执行具体为:当“功能”中的代码为C代码时,则通过freemarker模板生成FreemarkerUtil.processTemplateContent(String templateName, Map< , > root)标准格式的C代码文件将相关C代码通过GCC编译执行生成.exe可执行文件,并通过基于RMI与JNI的方式封装数据交互接口,通过ModelContextCaller.getInput(...)从入向功能交换中读取输入数据,ModelContextCaller.setOutput(...)设定出向功能交换中的输出数据,ModelContextCaller.genOutput(...)反向调用SMEX-Designer生成输出数据,实现SMEX运行环境与C环境数据的交互运行。[0010]进一步的,所述步骤11中的Matlab代码编辑与调试具体为:SMEX中的模型具备代码级的表达能力,模型中的“功能”可以嵌入C或Matlab代码,若是编辑Matlab代码,可以右键“功能”模型对象EditWithMatlabAction.run(...),以定制化的Matlab编辑器编辑该“功能”模型对象的代码,并在编辑过程中可以使用提示快捷键,通过对本地文件状态的实时监控FileAlterationMonitor.start(),使得本地文件的数据能够实时同步到“功能”模型中,在Matlab代码中添加断点,再执行过程中进行断点调试。说 明 书2/13页5
CN 111737888 A
6
[0011]进一步的,所述步骤7中发送至指令具体为:代码导出仿真执行:选中模型后,通过对模型内关键字对每一个层级的元素进行遍历,获得该模型元素的信息,遍历到的模型通过结构化存储(struct)存入Matlab工作空间,以备状态运行时调用,模型在读取过程中若存在端口,需要对所有端口做赋默认值0;模型读取成功后,自动对相关插件进行赋值(对于逻辑组件,功能交换,交换项目,交换项目元素,包含属性,组件列表和当前状态为属性名,对于属性值需要显示value),赋值语句为若上一级选中模型元素中不包含下一级模型元素,则对对应控件赋默认值;在用户选中某一模型元素时,需要对下级控件进行赋值,赋值语句为若上一级选中模型元素中不包含下一级模型元素,则对对应控件赋默认值;同时,由于在运行过程中需要随时读取模型以及对端口进行读取和赋值,需要对模型变量和端口变量进行全局化处理,用户点击发送按钮后,开始运行状态机,状态机通过全局变量smex_running判断是否持续运行,当前状态稳定,即状态机无死循环,无正在运行的延迟转换且当前状态的出向转换不为空时,smex_running置为1,通过while结构循环对当前状态和出向转换进行更新判断,状态持续运行停止时smex_running置为0,持续运行过程中按照自动转换,功能交换,延迟转换的次序进行id匹配判断,由于状态机运行涉及到延时转换且需要实时反应当前状态,因此延时部分通过tic,toc函数搭配while结构进行,状态转换通过状态id和转换的sid,tic匹配进行判断,同时通过drawnnow实时显示,由于需要运行逻辑功能中导出的代码,且允许用户进行断点运行,因此需要对状态下是否挂载代码进行判断,通过eval函数运行代码,在执行状态机过程中,通过全局化的端口列表进行赋值,对功能转换的两端端口进行数值传递。[0012]本发明的有益效果是:本发明提供设计模拟环境,设计人员在设计过程中,可以随时模拟设计结构,及时验证设计是否合理,是否能正常执行,及时发现错误,在设计的过程中分阶段多次验证设计的可靠性,避免设计完成后无法运行,造成工时浪费。附图说明[0013]图1 是本发明的系统框图,图2定义各分系统的模式状态机的界面,图3定义系统架构场景的界面,图4 模式状态机中当前状态高亮显示的界面,图5 选择外部激励面板界面图,图6 在首选项里选择代码编译器的路径的界面,图7 在系统架构模型的功能中选择内嵌代码类型的界面,图8 在系统架构模型的功能中嵌入对应代码类型的仿真代码界面,图9 当前状态高亮显示界面,图10 Matlab整体仿真结果界面,图11 在首选项里选择代码编译器的路径的界面,说 明 书3/13页6
CN 111737888 A
7
图12 在系统架构模型的功能中选择内嵌代码类型的界面,图13 输入输出端口名重复弹出的提醒界面,图14 模式状态机执行按钮界面,图15 功能输入端口界面,图16 功能输出端口界面,图17 输入输出参数值通过构建Matlab表达式传递值的界面,图18 “Guard”代码选中界面,图19 “Guard”代码表达界面,图20 模式状态机与该ES图并排显示在窗口中的界面,图21 界面执行窗口,图22 ES元素插入操作。具体实施方式[0014]现在结合附图和具体实现过程对本发明作进一步详细的说明。[0015]如图1所示,本发明的整体过程为:步骤1:校验MSM图有效性:若无效则结束,若有效,进去步骤2;步骤2:创建ES图;步骤3:对EditPart分屏并展示;步骤4:创建并显示模型,执行发送指令页面;步骤5:指令待发送状态;步骤6:时间倒计时指令是否触发:若否,则进入步骤7,若是,则进入步骤10;步骤7:发送指令;步骤8:判断是否为有效指令:若为无效指令进入步骤9,若为有效指定进入步骤10;步骤9:记录指令到历史记录,并判断是否退出执行,若是,则结束,若否,则进入步骤5;步骤10:将指令的源状态模式中的Exit,转换的effect,目标状态模式的入口、执行活动、运行活动功能记录到ES图中;步骤11:执行功能中的代码,调用C或Matlab仿真程序,并执行步骤9;步骤12:判断是否自动发送指令,若是,进入步骤5,若否,则不需要处理。[0016]通过上述过程,分区段验证,并且将验证结果分为有效命令和无效命令,分别进行发送或存储为记录。[0017]一、本发明方法中,运算具体过程为:1、MSM图标准性预校验MSM图绘制的标准性是模型动态执行的前提,需要保证待验证的所有MSM图都符合标准,ScenarioDiagramCreate.execute()通过迭代算法的方式确认每张MSM图或某个模式/状态下有且仅有一个初始化节点,每个模式/状态最多有一个不含有触发器的转换。[0018]2、转换指令的发送在模型执行页面中,可以选择不同对象中的转换ExecutionDialog.sendTransitionMessage(),若是有效的转换,则转换中的触发器,影响及模式状态中的入口、执行活动、出口和运行活动/功能中的元素被插入到ES图中ScenarioDiagramProcess.execute2(List<说 明 书4/13页7
CN 111737888 A
8
DDiagramElement> involvedModelElements,boolean isEffective),若是发送无效的转换,则只会将转换插入到ES图中,并且能够指定具体的交换项、交换项元素、属性的值。每次发送的转换指令都将被记录到转换历史中ModelContext.opeartionList.add(getOperationRecord(DEdge edge))。[0019]3、状态高亮与ES图展示在模型执行的过程中,可以通过发送相关指令指定执行的路径,在模式状态机模型图中在当前状态相关记录会高亮显示DiagramModel.initStyle(...),将模型转换执行的路径抽象成链表数据结构,处于当前执行状态的节点以红色高亮展示,指向当前状态节点的指针和上一个节点以橘黄色高亮显示:当模型继续往下执行时,进入下一个节点,以迭代算法的方式改变当前节点,上一指针和节点以及其他历史指针和节点的高亮显示形式。[0020]同时,在模型执行过程中,会创建一张用于展现执行过程的[ES]Scenario图ScenarioDiagramCreate.createScenarioDiagramByArchitecture(BlockArchitecture ba),并通过分屏技术EclipseUtil.buildDoubleEditor(IEditorPart leftEditorPart,MPart rightMPart,boolean horizontal)在客户端原本的展示容器中创建两个画布,以左右布局的形式将MSM图装载入左边画布,将ES图装载入右边画布,达到同步展示的效果,每次指令执行的结果,新增元素都会被插入当前的[ES]Scenario图中,并被实时刷新RefreshDiagramAction.refresh(ModelContext.selection)展现到ES图中。[0021]4、多时间条件下的资源竞争当模型转换的触发条件为时间事件时,通过计时Thread.sleep(sleepTime)方式,到达指定时间即会触发diagramModel.execute(next)模型执行事件,当存在多个时间事件竞争模型事件执行时,通过多线程ExecutorService executor=Executors.newCachedThreadPool()的方式,同时启用多个计时,谁最先触发即最先执行某一转换,其余事件线程强制终止thread.interrupt(),进入下一模型执行状态;5、C代码的执行当“功能”中的代码为C代码时,则通过freemarker模板生成FreemarkerUtil.processTemplateContent(String templateName, Map< , > root)标准格式的C代码文件将相关C代码通过GCC编译执行生成.exe可执行文件,并通过基于RMI与JNI的方式封装数据交互接口,通过ModelContextCaller.getInput(...)从入向功能交换中读取输入数据,ModelContextCaller.setOutput(...)设定出向功能交换中的输出数据,ModelContextCaller.genOutput(...)反向调用SMEX-Designer生成输出数据,实现SMEX运行环境与C环境数据的交互运行;6、Matlab代码编辑与调试SMEX中的模型具备代码级的表达能力,模型中的“功能”可以嵌入C或Matlab代码,若是编辑Matlab代码,可以右键“功能”模型对象EditWithMatlabAction.run(...),以定制化的Matlab编辑器编辑该“功能”模型对象的代码,并在编辑过程中可以使用提示快捷键,通过对本地文件状态的实时监控FileAlterationMonitor.start(),使得本地文件的数据能够实时同步到“功能”模型中,在Matlab代码中可以添加断点,可以再执行过程中进行断点调试。[0022]7、代码导出仿真执行说 明 书5/13页8