APP下载

Lua脚本与C++交互流程及在其HSTPN仿真软件的应用

2018-10-24陈佳铭王风立邓君湘曹瑞珉

计算机应用与软件 2018年10期
关键词:数据结构视图文档

陈佳铭 王风立 邓君湘 曹瑞珉

1(东北大学中荷生物医学与信息工程学院 辽宁 沈阳 110819)2(海信网络科技股份有限公司 山东 青岛 266071)3(沈阳特种设备检测研究院 辽宁 沈阳 110035)4(东北大学机械工程与自动化学院 辽宁 沈阳 110819)

0 引 言

Petri网是一种简洁的、图形化的网络模型,它既能表示静态的系统拓扑结构,也能用于系统动态行为的仿真。然而,传统Petri网并不能全面描述系统中连续、随机、时延和冲突等混杂特性。混杂随机时延Petri网HSTPN[1]是基于条件事件网改进的高级Petri网模型,其含有离散、连续、随机、时延和控制5种库所,能有效描述系统中存在的多种混杂特性, 目前已成功应用于梯级水库防洪控制系统[2]和物流自动分拣系统[1]。本文针对其仿真系统的开发,讨论Lua脚本与C++的交互流程。

1 HSTPN仿真软件功能设计

HSTPN仿真软件的功能划分为如图1所示的4类功能,包括建模功能、推演功能、模型存储与加载功能、数据输出功能。

图1 软件功能划分

2 软件开发框架、工具及运行环境

该仿真软件的开发框架为微软基础类库MFC的“文档-视图类”开发框架[3],文档类负责数据的存储与管理,视图类负责数据的显示和编辑,文档类与视图类的交互通过指针调用实现。该框架将数据的管理与显示分离,降低了类与类之间的耦合度,进而提高了框架的可扩展性。同时,该框架可通过文档类和视图类的配合,灵活管理数据的显示,方便程序的编写与维护,适合本文软件的开发。

该仿真软件基于MFC单文档程序框架开发,主要包含4个C++类,如图2所示,分别为App类、框架类、视图类和文档类。其中App类表示应用程序本身,框架类用于承载视图、工具栏、菜单栏、状态栏等,视图类负责数据的显示与编辑,文档类负责数据的存储与管理。

图2 MFC单文档程序框架

该软件开发工具包括Microsoft Visual Studio 2010(简称VS)平台、Lua脚本和TinyXML。VS是一个基本的、完整的开发工具集,包括整体软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境等[4]。

Lua是一种开源的、小巧、使用方便的解释性语言。Lua能很方便地嵌入到应用程序并为它们提供灵活的扩展和定制功能。Lua还提供非常丰富和实用的功能,比如函数式编程(所有的函数都是第一类值)、协同程序、自动内存管理等[5]。由于Lua所有源代码均由ANSI C编写,它与C/C++能非常方便的交互,可使用C/C++的扩展库完成一些功能较复杂的应用。而所有这些特性都归功于它有一个精简的、巧妙的、高效的Lua虚拟机的设计[6]。Lua采用了一种最简单的执行框架设计方式(switch-case),由于它指令数较少,因此也获得了较好的执行效率。Lua以其简洁、可扩展、高效性以及可移植的特点广泛应用与web服务器、游戏引擎以及嵌入式开发等领域[7-8]。本软件基于Lua脚本设计了连续过程的编程实现方案,采用了Lua 5.3版本的解释器。

软件的运行平台为Windows操作系统,软件的运行需要Microsoft.NET Framework 4.0环境的支持;HSTPN推演仿真过程中,需要将模型信息全部加载到内存中,因此要求计算机拥有3 GB及以上的内存配置。

3 整体架构设计

3.1 软件分层架构设计

根据需求分析,并结合MFC框架“文档-视图类”结构,设计HSTPN仿真软件的整体架构如图3所示,软件架构划分为四个层次,包括人机交互层、推演仿真层、数据结构层及文件存储层。

图3 软件整体架构

(1) 人机交互层 该层用于实现软件的人机交互界面,直接面向用户。在人机交互层,用户通过创建HSTPN模型的节点、设置仿真参数、基于Lua语言进行连续方程编写等操作完成网络模型的创建,并通过点击按钮进行模型推演仿真、控制仿真进程、进行模型存储、模型加载、数据存储等操作。人机交互层将用户操作信息转化为数据,存储在数据结构层相应的数据结构中;该层还不断监测数据结构层中各种数据的变化,并转化为人机交互层中各种图形的改变,从而完成模型状态、推演动画及数据展示等功能。

(2) 数据结构层 该层封装了HSTPN仿真软件建模、仿真、数据输出等过程中用到的各类数据结构。当用户通过人机交互界面进行建模、参数设置等操作时,数据结构层接收人机交互层的操作信息,并将其转换成数据存储在对应的数据结构中;在HSTPN推演过程中,该层不断接收模型的数据变化信息、仿真输出数据等,并重新存储到相应的数据结构中。

(3) 推演仿真层 该层主要完成三部分的功能,一是读取数据结构层存储的HSTPN模型的数据信息,基于HSTPN推演引擎完成模型推演仿真,并将推演过程中的数据实时传递回数据结构层;二是模型推演过程中,利用推演动画展示程序实时的驱使相应的数据传递给人机交互层,引起人机交互层各图形的变化,从而实现推演动画展示的功能;三是在模型推演过程中,利用仿真数据输出程序驱动数据结构层中接收的仿真数据赋值给相应的数据输出节点。

(4) 文件存储层 该层主要负责模型文件的存储与加载、仿真数据的存储功能。当用户通过点击人机交互界面上的“保存”按钮进行存储操作时,文件存储层读取数据结构层存储的模型数据或仿真数据,将其写入文件并存储在电脑磁盘中;当用户通过点击人机交互界面上的“打开”按钮,文件存储层读取存储电脑磁盘文件中的信息,并将其转换成相应的数据,重新存储于数据结构层。

3.2 基于MFC的软件类架构设计

根据图3的软件分层架构,结合MFC单文档程序的框架及各C++类的功能,设计HSTPN仿真软件的程序架构如图4所示,是对软件分层架构程序的实现方案。具体的对应关系如下:

1) CHSTPN_SYSView类:

CHSTPN_SYSView类继承自CView类,即视图类。在MFC架构中,视图类负责数据的显示与编辑,因此,在HSTPN仿真软件中,CHSTPN_SYSView类用作人机交互层的实现类。图4中CHSTPN_SYSView类的结构图列出了该类主要涉及的功能的实现方法,其中:

(1) CreateNode方法:用于创建HSTPN模型中的状态节点及事件节点;

(2) CreateArcs方法:用于创建HSTPN模型中的有向弧;

(3) Draw方法:用来实现推演动画的展示、仿真数据展示等功能;

(4) MoveNode方法:用来实现HSTPN模型中节点的移动功能;

(5) DeleteNode方法:用来实现HSTPN模型中节点删除功能。

图4 软件分层架构的程序实现类关系图

2) CHSTPN_SYSDoc类:

CHSTPN_SYSDoc类继承自CDocument类,即文档类。在MFC架构中,文档类负责数据的存储与管理,因此,数据结构层中的各数据结构定义在文档类中;由于文件存储层的功能本质是对数据结构层中的数据的直接读取、保存和重新生成,因此,文件存储层的功能也在CHSTPN_SYSDoc文档类中实现。图4中CHSTPN_SYSDoc类的结构图,列出了该类主要涉及的数据结构及功能的实现方法,其中:

(1) vecPlaces、vecTrans、vecArcs和vecOutput:四个动态数组,分别用于存储HSTPN模型中包含的状态节点、事件节点、有向弧和输出节点,上述元素的实现类,即CPlace、CTransition、CArc和COutput类的详细设计与实现将在第4章讲述;

(2) SaveModel方法:用来实现HSTPN模型存储功能;

(3) LoadModel方法:用来实现HSTPN模型加载功能;

(4) SaveSimData方法:用来实现仿真数据存储的功能。

3) CHSTPN_SYSSim类:

在软件设计开发过程中,应用面向对象的建模思想,推演仿真层单独构建一个类来实现,将其命名为CHSTPN_SYSSim。CHSTPN_SYSSim类的结构如图4所示,其中:

(1) SimEngine方法:表示模型推演引擎,负责实现仿真推演功能;

(2) AnmatnDemo方法:用于模型推演的同时,驱动CHSTPN_SYSView类中Draw方法的执行;

(3) SimDataOut方法:用来将仿真过程中模型数据赋值给输出节点。

4 基于Lua脚本的连续过程的建模实现

4.1 Lua脚本与C++的交互流程

建模功能是HSTPN仿真软件的基本功能,需要完成HSTPN模型的状态节点、事件节点和有向弧创建,节点属性设置,连续物理层的编程等操作。其中,HSTPN模型中的连续物理层一般采用微分方程或状态方程来描述。随着仿真案例的不同,HSTPN模型中用于描述连续过程的微分方程或状态方程也不相同。HSTPN仿真软件中,在连续状态节点中内嵌一个Lua脚本,用户可在该脚本中通过Lua语言设计、编写自己的微分方程或状态方程,提高了软件的可扩展性。

当一个连续状态节点激活后,其内嵌的Lua脚本开始执行,此时连续状态节点中创建一个Lua虚拟堆栈,用于Lua和C++程序之间的交互。Lua脚本与C++的交互流程如图5所示。

图5 Lua脚本与C++交互流程

4.2 连续模型的案例创建

HSTPN仿真软件界面如图6所示,界面分为3个区域:菜单栏与工具栏、元素选择区、模型展示区。其中菜单栏和工具栏中列举了“保存”、“打开”等菜单项,模型元素选择区列出了HSTPN博弈模型的基本元素及软件的数据输出节点,模型编辑区负责HSTPN博弈模型的搭建、属性设置、动画展示等。

图6展示的仿真模型中,p4和p28两个状态节点分别用于描述两个连续过程,通过Lua脚本进行编程实现,Lua脚本的创建过程如图7所示。

5 结 语

本文结合MFC“文档-视图类”结构设计了软件的分层架构及程序实现框架。本软件包含的功能主要分为四类:HSTPN模型搭建功能、推演功能、仿真模型的存储与加载功能、仿真数据输出功能。分析了Lua脚本与C++的交互流程,实现了连续过程编程功能。

猜你喜欢

数据结构视图文档
浅谈Matlab与Word文档的应用接口
有人一声不吭向你扔了个文档
数据结构线上线下混合教学模式探讨
重典型应用,明结构关系
为什么会有“数据结构”?
视图
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
Word文档 高效分合有高招
Django 框架中通用类视图的用法