拓展联仿系统的思路(一)

418 阅读3分钟

一、支持第三方求解器

在FMI协议中,定义了 CS 与 ME两种类型的模型,

CS表示联合仿真,数值求解器会嵌入并由导出工具提供。导入工具将设置输入,告诉 FMU 前进给定时间,然后读取输出。 ME表示模型交换,数值求解器由导入工具提供。FMU 提供了设置状态和输入以及计算状态导数(即方程左侧)的函数。导入工具中的求解器将确定使用哪些时间步长,以及如何计算下一个时间步长的状态。

这两种类型差异不大,之所以进行区分是因为模型交换使用的是导入软件的求解器、而联合仿真使用的是导出软件的求解器。当然,协议也考虑到模型导出者希望模型既支持使用自身的求解器、也可以使用外部的求解器,所以这两种类型是可以同时配置的。

什么是fmi4j

FMI4j 是一个用Kotlin编写的软件包,用于处理 Java 虚拟机 (JVM) 上的功能模型单元 (FMU) 。FMI4j 支持导入FMI 1.0 和 2.0 进行联合仿真。支持 Model Exchange 2.0 版。与其他针对 JVM 的 FMI 库相比,由于我们使用 JNI 而不是 JNA, FMI4j 的速度要快得多。考虑到 FMI 导入,与 JVM 的其他开源 FMI 实现相比,预计会有显着的加速(2-5 倍)。

image.png

注:上述的是官方的相关文档,拉取主分支后没有发现支持ME执行的逻辑,等待后续跟进。

二、支持子系统联仿

设计一个算法来支持带子系统的联合仿真模型进行计算,需要考虑以下步骤:

  • 实现
    • 定义联合仿真框架:创建一个框架或平台,用于整合和管理子系统之间的交互和协调。这个框架可以负责数据传输、同步子系统的计算步骤、处理子系统间的通信等。
    • 确定数据流:确定子系统之间的数据流和交互方式。这包括确定数据传输的方式、频率和格式。可能需要定义数据传输协议或接口标准。
    • 确定调度算法:常见的有固定步长、动态步长两种
  • 使用
    • 定义子系统:确定联合仿真模型包含哪些子系统。每个子系统应该具有明确定义的输入和输出,以及与其他子系统的接口。
    • 实现和集成:实现每个子系统的仿真模型(建模人员处理),并将其集成到联合仿真系统中。确保每个子系统能够正确地与其他子系统进行交互,并按照预期执行计算。

落地方案

联合仿真框架:可以基于ssp实现,不过ssp只定义了一个壳,内部的仿真逻辑需要自行填充

子系统调度算法的实现:与单层联仿类似,可以对每一个嵌套级使用targin算法解代数环,如果某个节点表示一个子系统,该系统执行时应该使用自身独立的步长进行求解,再协调与父系统的步长差距。

确定数据流(数据交互协议):如果模型中的每个节点都在同一个系统中,那么就不需要考虑这个问题。但如果联合模型中的某些节点来自外部,例如使用python实现的onnx组件、或者联合系统比较复杂,父子系统甚至不在同一个物理机上仿真;那么就要考虑通讯问题。

  • 分布式协同仿真协议DCP,旨在用于实时和非实时系统的集成
  • 通过websocket或消息队列自定义实现一套逻辑