8. 系统实现细节

8.1. 功能及组成

仿真模型接口适配开发系统主要由向导式图形界面(简称界面程序)与接口解析及代码生成工具(简称接口程序)构成,并借助系统提供的代码编辑工具,编译构建工具(典型的如make,nmake或CMake等),C/C++编译环境等通用组件完成FMU模型及S-Function模型(统称为模型)的接口适配工作;对于生成FMU模型,还需要系统管理工具与FMI测试工具;对于生成S-Function模型,还需要MATLAB/Simulink软件。

具体的,系统组成关系如 图 8.1 。其中向导式图形界面主要由公用数据结构定义文件解析(用于提供用户可选择的数据类型)、用户模型定义文件解析(用于重新编辑用户已经配置过的模型)、FMU构建脚本生成、S-Function构建脚本生成以及模型用户代码模板生成等部分组成;此外还包括若干通用界面组件,主要有可交互表格控件、多语言界面样式及布局、操作信号传递与处理、系统配置持久化、外部进程调用及监测以及模型目录状态监测等。接口解析及代码生成工具主要由用户模型定义文件解析、公用数据结构定义文件解析、FMI接口代码文件生成、FMU描述文件生成、LCT接口代码文件生成以及LCT模型定义文件生成等部分组成。

../_images/component.svg

图 8.1 系统组成关系

8.2. 运行流程

系统架构及工作流程如 图 8.2 所示。具体的,系统的工作步骤为:

Step-1:用户操作界面程序,可以创建或编辑已有的模型定义文件内容,包括模型信息定义,外部资源定义,定时任务定义以及接口数据定义。其中模型信息包括模型名称,作者,备注,及端口后缀等;对于外部资源定义,包括路径,文件名,后缀名等;对于定时任务定义,包括任务周期,起始时间偏移等;对于接口数据定义,包括输入、输出及参数的数据类型和变量名称,用户可以直接编辑录入,也可以加载公用数据结构定义文件,界面程序解析其中的C语言结构体定义,并形成可供用户选择的数据结构列表,用户可以拖拽列表中的项目,将其添加至模型的接口数据定义区域内。

Step-2:用户填写完界面程序中的信息后,可以操作生成模型用户代码,包括用户模型定义文件及用户模型实现文件。其中用户模型定义文件完全存储了界面程序中的信息;用户模型实现文件则给出了模型受仿真程序调用运行时的接口函数模板,包括对应于FMI标准接口中的实例化代码(在模型加载时执行),初始化代码(在模型处于复位状态时执行),步进代码(每次仿真时间推进时执行),重置代码(将模型切换至复位状态时执行),以及终止代码(在模型退出时执行);此外,还根据外部资源及定时任务定义,自动拓展给出了外部资源引用及定时任务处理的接口。用户可以操作界面程序,设置关联的代码编辑工具,在界面程序中可调用代码编辑工具,填写接口函数模板,即可完成模型代码内容的实现。

Step-3:用户可操作界面程序,调用编译构建工具,完成编译过程。界面程序生成FMU构建脚本(典型的如Makefile或CMakeLists.txt)以及S-Function构建脚本(MATLAB语言);FMU构建脚本以及S-Function构建脚本均支持多个模型的批处理操作,界面程序在启动编译操作前,提示用户选择当前需要操作的模型。编译过程中,编译构建工具调用接口程序,根据用户模型定义文件中的接口数据定义,查询公用数据结构定义文件中的已有模型接口数据结构;接口程序递归地解析用户模型定义文件中的接口数据定义,建立已有模型接口数据结构与FMI中所需的一维展开的接口变量间的映射关系,从而能够自动填写FMI接口代码模板、FMI描述文件模板,生成FMU模型对应的FMI接口代码文件以及FMU描述文件。同样的信息也用于自动生成S-Function模型对应的LCT接口代码文件以及LCT模型定义文件。

Step-4:用户可操作界面程序,调用编译构建工具,完成构建过程。构建过程中,编译构建工具首先调用系统管理工具,创建或清理出FMU模型目录结构;然后,调用C/C++编译环境,完成FMU模型对应的FMI接口代码文件、FMI标准通用文件(包含适应多种系统环境的代码,不需要用户修改)与用户模型实现文件的编译与链接,生成FMU动态链接库(在不同系统环境下生成对应版本的文件,如.dll/.so/dynlib等,支持多文件共存),并将过程中可能的调试信息提示给用户;之后,将FMU模型所需的FMU动态链接库、FMU描述文件、FMU资源文件以及FMU源代码文件等汇集到FMU模型目录结构中,完成压缩打包工作;最后,调用FMI测试工具,尝试仿真所生成的FMU模型文件,将测试运行结果打印反馈给用户。

Step-5:用户可以启动MATLAB软件(需要带有LCT模块并配置了C/C++编译环境),执行所生成的S-Function构建脚本,能够根据已生成的LCT接口代码文件以及LCT模型定义文件,创建S-Function动态链接库、总线定义文件、Simulink模块以及Target Link Compiler, TLC脚本文件。

../_images/workflow.svg

图 8.2 系统架构及工作流程

8.3. 详细目录结构

MASTERSIMULATOR WITH MILESTONE 1.0   <<-------- MasterSim根目录
│  MasterSimulator.exe      <<-------- MasterSim 求解器
│  MasterSimulatorUI.exe    <<-------- MasterSim 主界面
│  ...
│
├─Milestone             <<-------- Milestone根目录
│  │  CMakeLists.txt        <<-------- Milestone FMU构建脚本
│  │  Readme.txt            <<-------- Milestone 快速使用指南
│  │  SFcnLists.m           <<-------- Milestone S函数构建脚本
│  │
│  ├─bin
│  │      milestone         <<-------- Milestone 核心程序 (Linux)
│  │      milestone.exe     <<-------- Milestone 核心程序 (Windows)
│  │      ...
│  │
│  ├─export
│  │  │  fmu_controller.fmu <<-------- 导出的模型FMU文件
│  │  │  fmu_plant.fmu
│  │  │  fmu_plant_1.fmu
│  │  │
│  │  └─mastersim           <<-------- MasterSim 测试工程目录
│  │      │  sim.bm
│  │      │  sim.msim
│  │      │
│  │      └─sim
│  │          └─results
│  │                  values.csv    <<-------- MasterSim 测试数据
│  │
│  ├─include                <<-------- FMI标准头文件、模板文件
│  │
│  ├─license
│  │      00-0C-29-19-A4-33.lic     <<-------- 单机授权文件
│  │      00-0C-29-7E-DB-12.lic
│  │      ...
│  │
│  └─model                  <<-------- 模型目录
│      │  interface.h               <<-------- 全局接口头文件
│      │
│      ├─controller                 <<-------- 示例模型:控制器
│      │  ├─resources               <<-------- 示例模型数据文件
│      │  │      init_config.txt
│      │  │      init_data.dat
│      │  │
│      │  └─sources
│      │          controller.cpp    <<-------- 示例模型代码文件
│      │          controller.h      <<-------- 示例模型头文件
│      │
│      ├─plant                      <<-------- 示例模型:被控对象
│      │  └─sources
│      │          plant.cpp
│      │          plant.h
│      │
│      └─plant_1                    <<-------- 示例模型:被控对象1
│          └─sources
│                  plant_1.cpp
│                  plant_1.h
│
├─...