# 通过 MWORKS 仿真 FMU
通常情况下,Sysplorer 能够顺利导入并仿真由其自身导出的 FMU 文件。但对于其他建模工具生成的某些特定形式的 FMU,如果用户未充分了解其使用要求,则可能在 Sysplorer 中出现导入或仿真失败的问题。
提示
有关 Sysplorer FMU 导入功能的详细信息,请参见本手册的 FMU 导入章节。
# FMU 由 MWORKS 导出
提示
- 在此类场景下,请首先确保导出 FMU 的原始模型能够在 Sysplorer 平台上正常编译和仿真,以排除模型本身的建模问题;
- 此外,用户还可以尝试将原始模型或导出的 FMU 移植到另一台安装相同版本 Sysplorer 的计算机上进行交叉验证。
# 导入阶段
# #1101 导入时卡滞无响应
问题现象:导入 FMU 时,Sysplorer 软件出现卡滞或长时间无响应。
问题分析:FMU 导入功能需要解析 FMU 文件中的
modelDescription.xml文件,该文件记录了 FMU 的各类信息,包括模型变量。当XML文件中模型变量过多时,解析过程可能导致软件卡滞或长时间无响应。提示
有关
modelDescription.xml文件的详细介绍,请参见本手册的 XML 文件结构章节。问题定位:
- 使用解压工具(如 WinRAR、Bandzip 等)解压 FMU 文件;
- 使用文本编辑工具(如 VSCode、记事本等)打开
modelDescription.xml文件; - 检查
XML文件的行数是否过多,例如达到几万行或几十万行。
解决方案:重新导出轻量化 FMU。在 FMU 导出页面,使用变量过滤功能避免将不必要的局部变量生成到
modelDescription.xml文件中。提示
有关变量过滤功能的详细介绍,请参见本手册变量过滤章节。
有关局部变量,即
causality = local变量的详细信息,请参见:- FMI 3.0 规范 2.4.7 节 (opens new window);
- FMI 2.0 规范 2.2.7 节:可前往 FMI 官网 (opens new window)下载
PDF查阅。
# #1102 FMU 文件名过长
问题现象:导入某个文件名过长的 FMU 时失败。
问题分析:Windows 和 Linux 对单个文件名和文件路径的最大长度均有限制。若 FMU 文件名超出限制,导入程序会尝试截断文件名,但截断后的名称可能仍然导致路径超长或丢失
.fmu后缀,从而引发导入失败。问题定位:
- 检查 FMU 文件名是否超过系统限制(Windows:255 个字符;Linux:255 个字节);
- 检查 FMU 文件的完整路径是否超出系统限制。
解决方案:
- 将 FMU 文件重命名为较短的名称;
- 或将 FMU 移动到更上层的文件夹,以缩短完整路径长度。
# #1103 重复导入失败
问题现象:在本机多次(重复)导入同一 FMU 文件时,导入失败。
问题分析:导入程序需要解压 FMU 文件,并将其中内容拷贝至资源路径中。若该资源路径中已存在同名文件夹,导入程序会尝试先删除该文件夹。但如果其中包含带有只读属性的文件,则删除操作失败,从而导致重复导入失败。
问题定位:
- 打开【模型文件存储位置】,进入其中的
Resources文件夹; - 找到与模型同名的文件夹(如
FMU_Model1); - 遍历文件夹,检查其中是否存在只读文件。
示例如下:
提示
若导入时选择将 FMU 文件【插入到】多层包的子包
TopPackage\SubPackage\BottomPackage中,并假设TopPackage位于C:\test\TopPackage,则:- FMU 封装模型的完整路径为:
C:\test\TopPackage\SubPackage\BottomPackage\FMU_Model1.mo; - FMU 解压后的资源文件路径为:
C:\test\TopPackage\Resources\FMU_Model1。
- 打开【模型文件存储位置】,进入其中的
解决方案:
- 手动删除同名文件夹;
- 或为避免后续重复导入问题,可先手动解压 FMU,去除其中所有文件的只读属性,然后重新打包为 FMU。
注意
重新压缩时必须使用
zip格式。
# #1104 模型文件存储位置只读
问题现象:指定的【模型文件存储位置】文件路径导致导入失败。
问题分析:类似案例 #1103,若指定的【模型文件存储位置】为只读文件夹,导入程序无法在该路径下生成 FMU 封装模型文件,从而导致导入失败。
问题定位:打开模型文件存储位置,检查其是否具有只读属性。
解决方案:
- 修改模型文件存储位置为其他非只读文件夹;
- 或修改模型文件存储位置所在文件夹的只读属性。
# #1105 FMU 导入后无输入输出端口
问题现象:FMU 本身定义了多个输入和输出端口,但在导入模型后,部分端口未正常显示,取而代之的是出现了一个黄色的 Bus 端口。
问题分析:FMU 的输入与输出变量名可能具有结构化层次,例如输入变量名为
Test.inport,输出变量名为Test.outport。导入 FMU 时,需要根据Modelica规范声明顶层输入输出变量,但上述具有层次结构的变量名不符合Modelica规范。为解决这一限制,Sysplorer 构建了一种 SignalBus 连接器类型(即黄色端口),内部封装了相应的输入与输出变量。SignalBus 连接器可以与其他信号端口连接,连线时界面会弹出内部端口,用户可根据连接关系选择需要连接的信号。
问题定位:
- 双击黄色 Bus 端口进入类定义;
- 切换到文本视图查看是否正确封装了原模型的输入与输出端口。
解决方案:用户可按照普通输入输出端口使用,连线时软件会弹出关联的信号供选择。

# #1106 FMU 解压失败
问题现象:导入 FMU 时出现报错:解压 FMU 文件失败。
问题分析:FMU 本质上是一个
zip压缩包。如果用户自行解压后再次压缩,必须确保压缩格式为zip,否则可能导致解压失败。
问题定位:使用 FMI 官方验证工具(如 FMPy)导入 FMU,检查是否能够正常解压。
提示
有关 FMPy 的详细信息,请参见本手册 FMU 验证工具章节。
解决方案:重新压缩 FMU 文件,并确保使用
zip压缩格式。
# #1107 找不到动态库
问题现象:在人为修改 FMU 文件中的动态库文件名后导入,出现报错:找不到对应导入平台的动态库。
问题分析:原则上不允许用户手动修改 FMU 文件内容。根据 FMI 规范,动态库文件名应与
modelDescription.xml中的modelIdentifier属性一致。
问题定位:
- 检查 FMU 文件中是否包含当前平台所需的动态库文件;
- 检查动态库文件名是否与
modelDescription.xml中modelIdentifier属性一致。
解决方案:
- 重新导出目标平台所需的 FMU 文件;
- 恢复动态库文件的原始名称。
# 编译阶段
# #1201 模型编译很慢
问题现象:模型编译耗时过长。
问题分析:FMU 中的模型变量数量过多,导致生成的
Modelica模型规模过大,从而引起编译过程严重耗时。问题定位:
- 检查编译完成后 Sysplorer 的输出报表,确认时变量的统计数量是否异常偏多;
- 打开生成的
Modelica模型,检查代码行数是否过大(例如达到几万行甚至几十万行)。
解决方案:重新导出轻量化 FMU。在导出页面使用变量过滤功能,避免将不必要的局部变量写入
modelDescription.xml。提示
有关变量过滤功能的详细介绍,请参见本手册变量过滤章节。
# 仿真阶段
# #1301 导入后仿真很慢
问题现象: 相比原模型,FMU 导入后的封装模型仿真速度明显变慢。
问题分析:
- 仿真过程中需要通过 FMU 的
GetXXX函数获取模型变量值,当变量数量过多时,频繁调用GetXXX函数会导致仿真速度下降; - 仿真 FMU 封装模型时若未设置通信步长
fmu_StepSize,且该值与原模型的输出步长差异较大,则可能影响模型求解步长。若通信步长过小,将严重降低仿真效率。
- 仿真过程中需要通过 FMU 的
问题定位:
- 检查编译完成后软件输出报表,确认时变量的统计数量是否过大;
- 打开生成的
Modelica模型,检查代码行数是否异常庞大(如达到几万行或几十万行); - 对比原模型仿真设置的输出步长与 FMU 导入模型的通信步长参数
fmu_StepSize是否一致。
解决方案:
- 重新导出轻量化 FMU。在导出页面使用变量过滤功能,避免将不必要的局部变量写入
modelDescription.xml; - 调整参数
fmu_StepSize,使其与原模型的输出步长匹配。
提示
有关变量过滤功能的详细介绍,请参见本手册变量过滤。
- 重新导出轻量化 FMU。在导出页面使用变量过滤功能,避免将不必要的局部变量写入
# #1302 无法加载 FMU
问题现象: 仿真报错
The specified module could not be found. Can't load fmu.问题分析:
- FMU 动态库的位数与当前软件平台设置的位数不一致;
- FMU 文件缺少当前系统环境(Windows 或 Linux)对应的动态库。
问题定位:
- 使用解压工具(如 WinRAR)解压 FMU 文件;
- 查看
binaries文件夹,确认是否包含目标环境及对应位数的动态库文件。
提示
有关 FMU 文件结构的详细介绍,请参见本手册 FMU 文件结构。
解决方案:
根据 FMU 动态库的位数调整软件平台位数设置,确保与目标环境匹配。
# #1303 无法加载 FMU
问题现象:同 #1302,将 FMU 导入后的模型复制到新的
package后无法正常仿真。问题分析:FMU 导入时,程序会在生成的
Modelica模型文本中定义 FMU 解压文件在当前package中的相对路径。若后续直接复制该Modelica模型文本,相对路径不会随package变化而自动更新,因此在新package中可能无法找到动态库文件。问题定位:
- 检查
Modelica模型文本的constructor函数中LibraryDirectory的相对路径是否正确; - 检查
Modelica模型文本所在package的Resources文件夹中是否包含 FMU 解压文件。

- 检查
解决方案:
- 在新
package中重新导入 FMU,而不是直接复制; - 修改
Modelica模型文本中的相对路径为新package路径,并将 FMU 解压文件复制到该package的Resources文件夹中。
- 在新
# #1304 动态库重名导致报错
问题现象:因动态库重名导致仿真报错 FMU 加载失败或仿真崩溃。
问题分析:使用 Sysplorer 导入并仿真 FMU 时,Sysplorer 求解器程序会动态加载 FMU 动态库文件。如果 FMU 动态库文件名,或其依赖的其他动态库文件,与系统动态库或当前进程已加载的动态库同名,则可能导致 FMU 加载失败,甚至引发仿真崩溃。
问题定位:使用解压工具(如 WinRAR)解压 FMU 文件,查看
binaries文件夹中目标平台文件夹是否包含与系统动态库重名的库文件。解决方案:修改与系统动态库重名的库文件,并重新生成 FMU。
# #1305 其他机器上仿真失败
问题现象:FMU 在本地电脑导入后可正常仿真,但在其他电脑上导入后仿真失败。
问题分析:导出 FMU 的原模型可能依赖某些绝对路径下的文件,导致该 FMU 在其他电脑上无法正常运行。
问题定位:
- 在问题电脑直接仿真原模型,检查是否同样失败;
- 检查原模型中是否依赖绝对路径下的文件,例如
C:/Users/admin/Desktop/case.csv; - 检查原模型中是否存在外部对象或外部函数依赖绝对路径下的文件。
解决方案:在
Modelica建模和外部函数中均采用相对路径。使用示例可参考标准库模型Modelica.Utilities.Examples.readRealParameterModel:
提示
Modelica模型的相对路径写法可参考Modelica规范 13.5 External Resources (opens new window)章节。
# #1306 内存不足
问题现象:FMU 动态库文件为 32 位,仿真加载 FMU 动态库时报错:没有足够的内存(
ERROR_NOT_ENOUGH_MEMORY)。问题分析:32 位程序的虚拟地址空间大约为 4 GB。如果 FMU 动态库文件过大,或 FMU 依赖了过多其他动态库文件,可能因进程的用户模式虚拟地址空间不足而导致加载失败。在 32 位环境下,根本原因往往是虚拟地址空间的碎片化或耗尽,而非物理内存或页面文件不足。
问题定位:
- 使用解压工具(如 WinRAR)解压 FMU 文件,查看
binaries文件夹中目标操作系统对应的动态库文件是否过多或过大; - 使用工具(如 VMMap)检查进程的地址空间状态。
- 使用解压工具(如 WinRAR)解压 FMU 文件,查看
解决方案:
- 使用 64 位 FMU;
- 参见 #1307。
# #1307 仅在 Sysplorer 中出现内存不足
问题现象:同 #1306,在 Sysplorer 中导入仿真时出现内存不足,但直接使用
C程序或其他工具调用 FMU 时不会出现该问题。问题分析:在 Sysplorer 中导入并仿真 FMU 时,同一进程中还包含 Sysplorer 求解器程序。求解器自身会占用部分内存地址空间,如果 FMU 变量数量过多,求解器为其分配的内存需求也会增大,从而导致剩余可供 FMU 动态库使用的地址空间不足。
问题定位:同 #1306。
解决方案:
- 使用 64 位 FMU;
- 同 #1301,导出轻量化 FMU,减少 Sysplorer 求解器的内存占用。
# #1308 初始化时非线性方程求解失败
问题现象:导入 Co-Simulation 类型 FMU,连接输入与输出端口后形成环路,仿真初始化时非线性方程求解失败。

问题分析:Co-Simulation 类型 FMU 不建议置于代数环路中。Sysplorer 导入的 FMU 模型输入和输出端口在初始阶段默认具有直接馈通特性,因此模型连成环路后可能产生初始非线性方程组,导致求解失败。
问题定位:
- 检查 FMU 模型的输入输出是否直接馈通,即是否连成环路,如存在环路且无延迟行为相关模块,则表示两者直通;
- 勾选【仿真设置-模型翻译-输出非线性迭代变量及其初值】选项,重新翻译模型,打开模型翻译后的输出窗口,检查翻译报表中非线性系统迭代变量是否包含 FMU 模型的输入或输出变量。

解决方案:
- 修改 FMU 模型输入与输出端口在初始阶段的直接馈通特性;
- 打开 FMU 模型的文本视图,搜索模型常量
fmu_InputStartForInitialization,将其值修改为true。当该值为true时,FMU 将使用输入变量的start值进行初始化,而不是由输入端口计算值,从而规避输入与输出端口的直通特性; - 用户可通过调整参量
fmu_xxx_u_start设置 FMU 输入变量的初值,其中xxx为变量的数据类型,例如Real。

# #1309 环路拆分后仿真失败
问题现象:将原系统模型环路中的一部分拆分出来导出为 FMU,将该 FMU 导入后再次集成到原系统模型,出现仿真失败或结果差异明显。
问题分析:原系统模型中的环路部分可能构成线性或非线性方程组,而方程组中的未知变量需要同时求解。人为拆分其中一部分并导出为 FMU 会破坏原模型的约束关系。
- 若导出的 FMU 为 Co-Simulation 类型,因其采用协同仿真形式,重新集成后的系统模型与原模型不再等价;
- 若导出的 FMU 为 ModelExchange 类型,则重新集成后的系统模型会形成外层大环路中嵌套 FMU 小环路的结构。仿真求解时,大环路在迭代过程中需进入 FMU 内部执行小环路迭代,整体求解效率降低,同时不能保证与原模型具有相同的求解特性。

问题定位:
- 翻译原模型,统计输出报表中的线性与非线性方程信息;
- 分别翻译拆分后的子模型,统计输出报表中的线性与非线性方程信息;
- 若子模型中的方程块或方程中的变量个数减少,则拆分方式可能破坏了原模型的环路特性。
解决方案:重新调整拆分方案,避免人为解耦破坏模型环路特性。
# #1310 仿真精度不足
问题现象:导入的 Co-Simulation 类型 FMU 模型集成到原系统模型后,仿真结果与原始模型相比存在精度问题或明显偏差。
问题分析:Co-Simulation 类型 FMU 与系统其它部分采用协同仿真方式,其计算逻辑为两部分模型在一个通信步长内独立求解,并在通信步长点交换输入与输出变量。在此方式下,FMU 内部执行一个通信步长的积分计算时,其输入变量
是固定不变的;而原模型的方程级耦合方式中,输入变量 随时间连续变化,因此能获得更精确的计算结果。 问题定位:打开导入后 FMU 模型的参数面板,将通信步长参数
fmu_StepSize缩小,检查仿真结果是否有所改善。注意
注意:若导出 FMU 使用的是定步长算法,则必须确保
fmu_StepSize为 FMU 固定积分步长的整数倍。解决方案:
- 导出 FMU 时若采用定步长算法,应适当缩小积分步长;
- 调整通信步长
fmu_StepSize为合适的值,以提高仿真精度。
# #1311 FMU 与原模型仿真结果差异大
问题现象:直接仿真
Co-Simulation类型 FMU 模型(无输入输出连接)与原模型相比,结果差异明显。问题分析:原模型对仿真精度非常敏感,尤其当模型存在离散事件时刻与积分步或通信步重合时,外部时间与 FMU 内部时间的细微偏差可能导致仿真结果明显不同。此外,仿真原模型所用的求解算法、步长和精度配置可能不合适,导致求解结果未收敛,因此直接比较两份未收敛的结果没有实际意义。
问题定位:对原模型设置不同的求解算法、步长和精度配置进行仿真,确认原模型是否在特定条件下才能得到收敛结果。
解决方案:导出 FMU 时,应选择与原模型求解算法、步长和精度相匹配的配置,以确保原模型能得到收敛解。
# FMU 由第三方工具导出
在这种应用场景下,第三方工具导出的 FMU 可能存在特定使用限制,或不完全符合 FMI 规范,因此在 Sysplorer 平台导入和仿真时可能出现问题。
提示
为排除第三方工具自身问题,建议用户使用 FMI 官方推荐的 FMU 验证工具 (opens new window)进行交叉测试。
# 导入阶段
# #1401 缺少库文件
问题现象:导入时报错缺少对应平台的库文件。
问题分析:问题类似 #1302,Sysplorer 导入 FMU 时需根据当前系统环境(Windows/Linux)及其位数(64 位/32 位)查找 FMU 文件中是否存在相应的动态库文件。如果未找到对应版本的动态库,则会报错。
问题定位:同 #1302。
解决方案:
- 使用第三方工具导出多种环境及其位数的 FMU 文件;
- 将这些 FMU 文件的
binaries文件夹合并成一个; - 这样,一个 FMU 文件中就包含了多种环境的动态库文件,从而避免缺少库文件的报错。
# #1402 无法独立运行
问题现象:导入时报错 FMU 依赖于导出平台,无法独立运行。
问题分析:第三方工具导出的 FMU 文件可能不能独立运行,通常需要与第三方工具进行通信。具体使用方法需参考第三方工具的帮助文档。目前,一些低版本的 Simulink 或 Amesim 导出的 FMU 不能独立运行。
问题定位:
- 使用解压工具(如 WinRAR)解压 FMU 文件,并使用文本编辑工具打开
modelDescription.xml; - 搜索
needsExecutionTool属性,如果其值为true,则表示该 FMU 无法独立运行。

- 使用解压工具(如 WinRAR)解压 FMU 文件,并使用文本编辑工具打开
解决方案:
- 参见第三方工具帮助文档,了解如何正确使用其导出的 FMU 文件;
- 切换至高版本软件或调整导出设置,确保属性
needsExecutionTool=false。
# 编译阶段
本节主要针对源码形式的 FMU,即第三方工具直接导出模型的源代码,而非将其编译为动态库文件。通常,将模型编译成动态库文件可以方便后续的集成操作。然而,在一些跨平台使用场景下,例如需要将模型从 Windows 平台移植到 Linux 平台进行仿真,使用源码形式的 FMU 可以根据当前平台环境自适应编译,因此具有更强的可移植性。一些第三方工具在导出 FMU 时,也可以同时生成对应平台的动态库文件,可通过解压 FMU 文件并查看binaries文件夹内容来确认。
# #1510 符号重定义
问题现象:模型编译失败,
C编译器提示符号重定义。问题分析:源码形式 FMU 中可能定义了某些函数或宏定义,与 Sysplorer 求解器内置函数冲突。
问题定位:根据输出面板的报错提示,或打开
build.log文件查看具体重定义的函数名或宏定义。解决方案:
- 修改源码中造成冲突的函数名或宏定义;
- 导入时不选择源码导入,规避此问题。注意:低版本 Sysplorer 导入功能没有导入选项,当 FMU 文件中
modelDescription.xml存在源码信息时,导入程序默认按源码方式导入。此时可将源码信息删除,如下图红色框部分,使其按动态库方式导入(用户需确保该 FMU 文件包含目标平台环境下的动态库文件):

# #1511 多个源码 FMU 集成
问题现象:同 #1510,但系统模型中同时包含多个源码形式 FMU 模型。
问题分析:同一工具导出的不同模型的源码形式 FMU 中定义了相同函数或宏定义,低版本 Sysplorer 未支持这类场景。
问题定位:检查当前系统模型是否包含多个相同工具导出的源码形式 FMU 模型。
解决方案:同 #1510。
# #1512 符号未定义
问题现象:模型编译失败,
C编译器提示未找到符号定义。问题分析:该源码形式 FMU 必须通过
makefile文件实现编译,低版本 Sysplorer 未支持调用makefile执行源码编译的功能。问题定位:
- 解压 FMU 并查看
sources文件夹中是否存在makefile模板文件; - 检查
modelDescription.xml中SourceFiles内容是否包含sources文件夹中所有C文件。
- 解压 FMU 并查看
解决方案:
- 导入时不选择源码导入,规避此问题。低版本 Sysplorer 的处理同 #1510 删除源码文件;
- 或者修改
modelDescription.xml的SourceFiles内容,将 FMU 文件sources文件夹中的C文件按照 #1510 中的样式写入SourceFiles标签,确保 Sysplorer 编译 FMU 源码时能够找到所有C文件。
注意
注意,由于
makefile中可能指定了 Sysplorer 的C编译器不支持的特殊编译指令,方式二可能失效。
# #1513 未找到头文件
问题现象:模型编译失败,
C编译器提示未找到头文件或符号未定义。问题分析:FMI 接口函数均为标准
C函数,因此 Sysplorer 使用C编译器编译源码形式的 FMU。如果用户在源文件中引用了C++头文件并使用了C++标准库函数,C编译器将编译失败。问题定位:
- 检查 FMU 源文件中是否引用了
C++头文件和函数; - 根据编译报错信息判断是否由
C++函数导致。
- 检查 FMU 源文件中是否引用了
解决方案:
- 导入时不选择源码导入,规避此问题。低版本 Sysplorer 的处理同 #1510 删除源码文件;
- 完全使用
C函数实现 FMU 源码功能,或通过显式加载C++动态库的方式绕过编译时的链接错误。
# 仿真初始化阶段
# #1601 加载 FMU 失败
问题现象:同 #1302,FMU 文件为 V3 版本,且包含目标平台的位数,但切换平台位数为 32 位后报错
The dll is not a valid Win32 application.. Can't load fmu.问题分析:V3 FMU 文件导入后的模型文本中指定了当前平台位数对应的 FMU 解压后动态库相对路径。FMU 模型仿真时会在该相对路径中加载动态库文件。切换平台位数后,由于模型文本中的相对路径未变,该路径下无法找到对应位数的动态库文件,导致仿真失败。
问题定位:
- 使用文本视图查看导入后生成的
Modelica模型; - 检查
constructor函数中LibraryDirectory的相对路径是否与目标平台不符。

- 使用文本视图查看导入后生成的
解决方案:
- 切换平台位数后重新导入 FMU;
- 使用 V2 FMU。FMI 2.0 定义的
binaries路径结构与Modelica规范一致,导入后生成的相对路径无需包含平台位数层级,Sysplorer 会根据当前平台位数在相应位数的 FMU 动态库路径下查找。
# #1602 初始化失败
问题现象:仿真初始化失败。
问题分析:问题同 #1402,是由于第三方工具导出的 FMU 文件不能独立运行,即
needsExecutionTool=true,但低版本 MWROKS 未在导入阶段报错,因此该问题在仿真阶段才暴露。问题定位:
- 使用解压工具如 WinRAR 解压 FMU 文件,并使用文本编辑工具打开
modelDescription.xml文件; - 搜索
needsExecutionTool,如果该属性为true,则表示该 FMU 无法独立运行。
- 使用解压工具如 WinRAR 解压 FMU 文件,并使用文本编辑工具打开
解决方案:
- 参见第三方工具帮助文档,了解如何正确使用其导出的 FMU 文件;
- 切换高版本软件或调整导出设置,确保属性
needsExecutionTool=false。
# 连续仿真阶段
# #1610 Set 布尔变量失败
问题现象:Sysplorer 仿真时
Set布尔类型输入变量或参量后出现结构化异常、仿真失败等问题。问题分析:仿真 FMU 时,Sysplorer 通过调用 FMU 的
fmiSetxxx接口函数将外部输入变量值提供给 FMU。fmiSetxxx中的xxx表示数据类型,如Real/Integer/Boolean/String,这些数据类型由 FMI 规范定义。如果第三方工具生成 FMU 时所采用的数据类型与 FMI 规范不一致,则fmiSetxxx可能引发非法内存写入,导致程序崩溃。注意
目前已发现部分平台定义的布尔类型(
typedef char fmi2Boolean;)与 FMI 2.0(typedef int fmi2Boolean;)规范不一致。问题定位:
- 查看第三方平台帮助文档是否有相关说明;
- 检查第三方平台安装路径下是否存在 FMI 类型定义头文件,如 FMI2 的
fmi2TypesPlatform.h、FMI3 的fmi3PlatformTypes.h,确认其是否与 FMI 规范一致; - 删除 FMU 模型中布尔类型输入连接,同时删除 FMU 模型文本中与布尔类型有关的
Set函数调用,重新仿真验证是否无异常。
解决方案:确认第三方平台的 FMU 帮助文档是否支持指定类型定义,并重新导出 FMU 文件。
# #1611 Set 字符串变量失败
问题现象:Sysplorer 仿真时
Set字符串类型输入变量或参量后出现结构化异常、仿真失败等问题。问题分析:仿真 FMU 时,Sysplorer 通过调用 FMU 的
fmiSetString接口函数将外部输入的字符串变量值提供给 FMU。fmiSetString的字符串实参在函数调用结束后会被销毁,因此 FMU 内部需在Set函数执行时拷贝该字符串,而不能仅保存字符串地址。
问题定位:删除 FMU 模型的字符串类型输入连接,同时删除 FMU 模型文本中与字符串类型相关的
Set函数调用,重新仿真验证是否无异常。解决方案:向第三方平台反馈该问题。
# FMU 创建多实例
Sysplorer 导入 FMU 后生成的 FMU 封装模型,是一个通用的Modelica模型组件,用户可以在一个大系统中实例化多个 FMU 模型。然而,一些第三方工具导出的 FMU 并不支持多实例调用,用户可查看modelDescription.xml,搜索属性canBeInstantiatedOnlyOncePerProcess,若该属性为true,表示该 FMU 不支持多实例调用。
# #1630 集成多个 FMU 封装模型报错
问题现象:在一个模型中拖入一个 FMU 封装模型后能正常仿真,再次拖入或将其复制后会出现仿真结构化异常和仿真结果错误。
问题分析:第三方工具导出的 FMU 不支持多实例调用,可能原因是 FMU 内部维护了全局变量,不同实例调用同一 FMU 函数时会修改该全局变量,导致后续仿真出现问题。

问题定位:
- 使用解压工具如 WinRAR 解压 FMU 文件,并使用文本编辑工具打开
modelDescription.xml文件; - 搜索
canBeInstantiatedOnlyOncePerProcess,如果该属性为true,则表示该 FMU 不支持多实例调用。
- 使用解压工具如 WinRAR 解压 FMU 文件,并使用文本编辑工具打开
解决方案:调整原模型名称并使用第三方工具重新导出一个 FMU,在 Sysplorer 中导入该新 FMU 后再进行集成使用。