# 仿真
本文汇总了使用 Sysplorer 软件对模型仿真时的常见问题及解决方法。
# 仿真失败
有以下 4 种仿真失败 FAQ 供您参考:
# 问题描述(一)
仿真启动失败,输出栏弹出 "can not find vc software"。
# 解决方法
进入主页 > 选项 > 仿真 > C 编译器,重新设置编译器。
内置 Gcc:默认内置的 GCC 编译器;
自定义 Gcc:设置本地 GCC 编译器目录。通过单击
可以选择编译器所在目录;自动检测到的 VC:自动检测列出本机已有的 Visual Studio 编译器版本;
自定义 VC:设置 Visual Studio 编译器目录。通过单击
可以选择编译器所在目录;编译器详细信息:显示选择或者设置的编译器详细信息,包括名字、平台和路径;
校验编译器:校验编译器是否设置成功。
提示
Sysplorer 支持以下的编译器:
Microsoft Visual C++ 2019
Microsoft Visual C++ 2017
Microsoft Visual C++ 2015
Microsoft Visual C++ 2013
Microsoft Visual C++ 2012
Microsoft Visual C++ 2010
Gcc
# 问题描述(二)
FMU 模型仿真失败。导入 FMU 后进行仿真,仿真时失败,输出窗口输出如下信息。
# 问题原因
导出 FMU 时选择的编译器版本与仿真时位数不同。
# 解决方法
检查导出 FMU 时使用的编译器版本,进入主页 > 仿真设置> 编译 > 平台,选择 32 位/64 位版本,保持仿真与导出 FMU 时使用的编译器版本一致。
# 问题描述(三)
模型仿真失败,输出面板显示“创建编译 C 代码的进程失败”。
# 解决方法
增加一个环境变量后重启软件,环境变量名为“ComSpec”,值为C:\Windows\system32\cmd.exe。
# 问题描述(四)
模型仿真时报错“仿真-启动失败”。
# 问题原因
由于电脑系统或安全软件对软件的权限进行限制,导致软件无法仿真。由于系统权限导致的仿真失败,可参考下述方法解决。
# 解决方法
进入系统开始>设置;

选择隐私和安全性> Windows 安全中心;

进入后,单击 打开 Windows 安全中心;

关闭防火墙与文件限制,如下所示。重启软件,即可正常仿真。

# 无法检测到本地 VC 编译器
# 问题描述
进入主页 > 仿真设置 > 编译 > C 编译器设置,选择自动检测到的 VC,在下拉菜单中缺少本地 VC 编译器的某些版本或使用检测到的 VC 编译器无法仿真。
# 解决方法
在系统 cmd(命令提示符)中,使用命令"%Sysplorer安装目录%\Bin64\vswhere.exe" -legacy -prerelease -format json,查看是否能检测到本地 VC 编译器。
若通过
vswhere.exe无法找到本地 VC 编译器,则可以检查本地 VC 文件夹内是否有文件损坏或没有安装成功,重新安装 VC 编译器后重试;若
vswhere.exe可以找到本地 VC 编译器,且使用该 VC 编译器无法进行仿真,则可以进入仿真 > 仿真设置 > 编译 > C 编译器设置中校验该编辑器,查看本地 VC 编辑器是否缺少与仿真所选平台位数相同的版本,如仿真所选平台为 64 位,本地 VC 编译器仅有 32 位。
# 二维动画仿真时不播放
# 问题描述
仿真后单击工具栏中的播放
按钮,二维动画不播放。
# 问题原因
仿真太快无法观察到动画。
# 解决方法
在主页标签页中,进入仿真设置>仿真调速页签,勾选启用调速以减慢仿真,设置减速比。仿真时,将根据减速比,实时同步仿真。减速比默认为 1,表示仿真时间与物理时间基本是同步的,如果设置为 0.5,则表示仿真 1 秒,物理时间需要 2 秒。
相关信息,请参见仿真设置-仿真调速。
# 搭建仿真模型子模块用 model 还是 block
# 问题描述
Sysplorer 里 model 和 block 有什么区别,搭建仿真模型子模块用 model 还是 block。
# 解决方法
搭建仿真模型子模块建议使用 model。
模型类(model)和块类(block)功能完全相同。但使用块类(block)有一个限制,块的每个连接器组件必须用于所有连接器变量的前缀输入/输出,其目的是对块图的输入/输出块进行建模。由于输入/输出前缀的限制,块之间的连接只能根据块图语义进行。
# 仿真设置中步长与模块采样周期是否相关
# 问题描述
Sysplorer 仿真模型中有可设置采样周期的模块时,该模块的采样周期与仿真设置中的步长不一致,会对模型的仿真结果产生影响吗。
# 问题原因
当模块的采样周期与仿真设置的步长不一致时,采用变步长积分算法(Dassl),对模型的仿真结果没有影响;采用定步长积分算法(Euler),可能会影响模型的仿真结果,因为定步长算法只在输出的时间点检测事件。例如:定步长设置为 0.3,采样频率设置为 0.05,模型仿真时只会在 0.3 的整数倍时刻检测事件,就可能会遗漏事件。
# 解决方法
- 采用变步长积分算法(Dassl),不影响模型的仿真结果;
- 采用定步长积分算法(Euler),需要将该模块的采样周期与仿真设置的步长保持一致。
# 查表使用外部数据文件时仿真报错
# 问题描述
Sysplorer 使用外部数据文件时,仿真报错“End-of-file reached when reading numeric data of matrix "tabdata(6,13)" from file "xxxxxx"”。
# 解决方法
检查外部数据文件的维度是否正确。例如,下图的数据维度是(6, 13),数据维度错误;

修改数据维度为(6, 9);

成功执行仿真。
# 问题描述
Sysplorer 使用外部数据文件时,仿真报错“Not possible to open file "xxxxxx": No such file or directory”。
# 解决方法
检查模型路径是否正确。例如,下图的文件名称“tab”与“tababc”不一致,导致相应路径下找不到该文件;

修改文件路径为:
loadResource("modelica://ReadData/Resources/tab.txt");成功执行仿真。
# 问题描述
Sysplorer 使用外部数据文件时,仿真报错“The values of the first column of table "xxxxxx" are not strictly increasing”。
# 解决方法
检查数据文件中的第一列数据是否单调递增。例如,下图第三个数据“10”有问题,导致数据序列不是递增的;

将数据修改为单调递增;

成功执行仿真。
# 问题描述
Sysplorer 使用外部数据文件时,仿真报错“Table matrix "tab" not found on file "xxxxxx"”。
# 解决方法
检查查表模型的表格名称。例如,外部文件里表格的名称为“tabdata”,而参数设置中表格的名称为“tab”,设置错误;

修改查表模型的 tableName 为“tabdata”;

成功执行仿真。
# 波形函数等模块步长设置与频率不匹配导致输出波形不符合预期
# 问题描述
在相同的仿真设置下,正弦输出模块设置不同的频率分别为 10 HZ,1 HZ。
仿真得到的结果值如下:
从仿真曲线可以直观的看出,sine 模块输出的曲线非正弦曲线,sine1 模块输出的曲线符合正弦曲线的特征。
# 问题原因
仿真设置步长为 0.01 s,sine 模块设置频率为 10 HZ,即 1 秒的时间间隔内,周期性现象重复发生 10 次,每次所需的时间为 0.1 s;sine1 模块设置频率为 1 HZ,即 1 秒的时间间隔内,周期性现象重复发生 1 次,每次所需的时间为 1 s;对比与步长的关系,当所需时间大于等于步长时,能够正常采样,当所需时间小于步长时间,由于采样数不够,因此不能展示输出模块所期望的现象。
# 解决方法
根据自己所用模块,判断所需的采样时间,在仿真设置中给定相应的步长即可,即仿真步长要尽量远小于频率设置的步长。例如仿真设置步长为 0.01 s,sin 模块设置的频率为 0.1 HZ 时(每次周期现象发生所需时间为 10 s)满足仿真步长远小于频率设置的步长的要求,故能获得正确的波形,且采样数越多,结果越精细。
# 仿真结果找不到变量
# 问题描述
模型中存在变量或参数,但在仿真生成的结果中找不到。
# 问题原因(一)
模型设置了部分变量作为仅保存标记的变量或设置仿真时要保存的变量,此时未被选择的变量不会在仿真结果中显示。
# 解决方法
在模型的图形视图中右击,上下文菜单中单击设置仿真时要保存的变量,弹出如下图所示的设置仿真时要保存的变量窗口;

根据需求勾选需要保存的指定变量,或直接选择保存模型所有变量。
# 问题原因(二)
仿真设置中勾选了参数估值以便优化模型(改善仿真效率),生成的仿真结果不会包含参数。
# 解决方法
进入主页 > 仿真设置 > 模型翻译,取消勾选参数估值以便优化模型(改善仿真效率);

重新翻译仿真该模型。
# 如何导出变量结果
# 问题描述
如何将仿真结果数据导出。
# 解决方法
右击仿真实例标题,在弹出的上下文菜单中选择结果导出,支持导出mat和csv两种个数的数据文件。
# 自动保存仿真结果文件占用硬盘空间
# 问题描述
Sysplorer 每进行一次仿真就单独保存一个结果文件占用硬盘空间。
# 解决方法
可以进入主页 > 选项 > 仿真 > 常规 中关闭自动保存仿真结果。
# 数据导出到 Excel,同一时间数据保存了两次
# 问题描述
数据导出到 Excel,同一时间数据保存了两次。
# 问题原因
由于仿真的时候发生事件,变量不确定,导致同一时间数据存储了两次。
# 解决方法
在 Sysplorer 页面顶部主页页签中单击仿真设置按钮,弹出仿真设置页面,单击输出,在输出变量选择栏中取消勾选存储事件时刻的变量值(勾选后,仿真过程中事件时刻的变量值会被存储);

取消勾选后,重新单击仿真设置按钮,仿真成功后,在仿真浏览器中勾选需要导出的数据结果;

单击仅导出当前曲线窗口结果按钮,保存结果;

打开导出的数据,此时数据是每个步长记录一次数据值,如下图所示。

# 两个独立系统分别仿真很快,合并到一个模型仿真后变慢
# 问题描述
多个系统模型作为独立模型仿真时,每个模型的仿真效率都较高,但是将这些彼此间完全独立的系统模型(无任何连线、无数据交互、无变量依赖)全部置于同一个模型文件中,发现这个复合模型的仿真效率非常低。
# 问题原因
某个系统模型的离散事件对其他模型产生影响
假设两个模型 A、B,模型 A 的计算量很小,但有较多的离散事件,如写一个 when sample(0,1e-5) ,尽管离散采样事件数多,但该模型计算量小故可以很快算完。模型B的计算量大,但其模型行为中不包含离散事件,这种连续特性使得变步长算法可以一下跨越很大的时间步,因此虽然模型单步计算量大,但计算点较少,仿真效率很高。
将模型 A 和 B 作为独立模型仿真时,两者的仿真效率都很高。当模型 A 和 B 置于同一个模型文件中仿真,即使没有变量依赖关系,但他们的仿真代码是集成在一起的,当模型A触发离散采样事件后,求解器执行事件更新程序,此时模型 B 也需要同步计算(如果不计算B那么后处理曲线中模型B的变量在该时刻的值会显示错误),带来了不必要的计算,而且由于模型A的离散事件数多,每次事件更新都要计算模型B的内容,这才使得集成后的模型解算效率低。
集成后模型的状态变量个数大幅增加,造成解算困难
单独模型的状态变量个数相对较小,数值积分算法求解效率相对较高。当多个模型置于同一模型文本中,此时状态变量个数叠加,这导致数值积分算法求解困难,这种情况在使用隐式积分算法时比较明显。
隐式积分算法在积分过程中需要求解非线性方程组,其中非线性迭代变量为状态变量及其导数变量。非线性方程组的求解效率与其规模不存在线性关系,当状态变量个数过大时,非线性迭代收敛过程可能变得特别缓慢。
不同模型的状态变化率差异大
不同模型的动态变化过程可能具有明显差异,比如有些模型的状态变化很缓慢,而有的模型状态变化较为剧烈,这使得将这些有明显差异的模型集成在一个模型文本后,形成了一个刚性特别强的大系统。刚性系统的求解效率通常比较慢。并且不同模型状态变量的值域范围差异比较大,这也增加了数值积分算法的积分收敛难度。
物理建模中的非线性行为
物理建模可能产生较大的非线性方程组,如液压系统常包含阀门、管路中的阻力系数等非线性特性。求解这些非线性方程组通常较为耗时,上述 1/2/3 种情况都会造成集成后模型相比独立模型的计算点大幅增加,在每个计算点都需要计算这些大规模非线性方程组,因此整体计算效率严重下降。
# 解决方法
尝试使用
noEvent屏蔽模型中不必要的离散事件;把某个模型采用 FMU 的方式集成,避免状态变量个数叠加,应尽量将没有事件的系统导出为 FMU;
采用时钟机制,把其中一个系统模型关联上一个时钟变量,这种方式优于FMU集成方式。
# 系统仿真异常情况分析
在物理系统(如机械传动、电气电路、流体动力等)的建模仿真过程中,异常现象的出现会直接影响仿真结果的准确性与可靠性,进而导致设计决策偏差或工程方案失效。本节将基于常见的物理系统建模仿真问题,梳理异常现象的分类、核心成因、排查流程及解决措施,为工程人员快速定位并解决仿真异常提供参考,确保仿真模型能真实反映物理系统的运行特性。
# 问题描述(一)
# 关于“参数估值选项”使用
- 翻译过程中出现方程冗余,翻译失败;
- 仿真过程中出现初始化失败,无法正常仿真。
主要出现在原模型可正常仿真,但当前系统模型仿真时遇到仿真异常的情况。
提示
可检查仿真设置中是否开启了“参数估值以便优化模型”选项。由于该选项为非常规仿真设置无法保存在模型中,会跟随软件设置变动因此可确认该选项是否有勾选。
# 问题原因
当参数估值勾选后,会将模型中所有自由参量替换为数值常数,降低模型中的复杂度。对方程进行了处理,可能过程中改变了方程求解,导致模型求解性与未勾选有区别。具体关于该选项的设置详情可在 Sysplorer 使用手册中搜索 “参数估值”进行了解。
# 解决方法
由于勾选参数估值后可以减小线性和非线性方程撕裂后的环路大小,多数情况可以加快模型仿真求解速度,所以建议勾选。但如果勾选后出现模型翻译方程出错,那么一是要检查模型方程是否存在问题,若找不到方程问题,则选择不勾选,使模型能够仿真。
# 问题描述(二)
# 编译器选择问题
对于调用外部函数的系统模型,使用 GCC 编译器进行求解时报错。
# 问题原因
如果模型中调用了外部函数,对于调用的外部函数如果非 GCC 编译,或者使用的位数不同很可能在使用 GCC 编译器进行系统的仿真求解时导致失败。
# 解决方法
切换编译器进行编译仿真。
# 问题描述(三)
# 算法选择问题
进行算法切换时,系统求解时会出现仿真结果不一致或者求解失败的情况。
# 问题原因
算法是对真实物理/数学系统的“近似求解工具”,而不同工具的“近似逻辑、求解精度、稳定性策略”存在本质区别。这些差异最终体现在结果的准确性、收敛性、效率甚至物理合理性上。对于不同物理系统(如线性/非线性、静态/动态、刚性/柔性)的数学特性差异极大,而算法往往是针对特定类型的系统设计的,“适配性不匹配”必然导致结果差异甚至求解失败。
# 解决方法
根据系统特点合理选择仿真设置中的积分算法,对于 Sysplorer 中的积分算法可通过 Sysplorer 使用手册查找常见积分算法来选择合适的求解算法。
# 问题描述(四)
# 非线性求解问题
- 排除仿真设置影响后,仿真时出现初始化失败;
- 初始化时间过长,卡在 0s 无进展;
- 仿真过程中出现非线性迭代,进而仿真失败或计算结果异常的情况。
非线性量可通过输出窗口进行查看。
# 问题原因
建模过程中“非线性”问题不仅可能导致仿真失败还会使计算结果偏离正确解,比如在流体系统中较为常见的,建模时未满足容-阻相连机制时,极易产生大量的非线性问题,所谓的容阻相连机制本质是流体系统中“能量存储”与“能量耗散”的耦合作用机制,类似电路中电容(存储电能)与电阻(消耗电能)的组合效应。具体关于非线性迭代量的影响可通过 Sysplorer 使用手册的帮助文档进行查看。
# 解决方法
- 缩减系统非线性迭代量(比如流体系统搭建满足容阻相连机制);
- 非线性迭代变量的选择也会影响模型求解,内核会优先将在模型顶层给定了 start 值的变量选为非线性迭代变量,但不一定就会选为非线性迭代变量。若用户希望将某个变量作为求解变量,可以尝试在模型顶层为其给定 start 值。
# 问题描述(五)
# 关于“运行时检查报错”使用
仿真过程中出现仿真失败,单步计算失败。
主要出现在原模型可正常仿真,但当前系统模型仿真时遇到仿真异常的情况。
提示
可检查仿真设置中是否开启了“运行时检查报错”选项。由于该选项为非常规仿真设置无法保存在模型中,会跟随软件设置变动因此可确认该选项是否有勾选。
# 问题原因
仿真设置中的“运行时检查错误”选项勾选后,模型翻译时为一些运算合法性不确定的表达式生成运行时检查代码,比如除法 /、开方 sqrt、assert 等等。如果有这种运行时检查代码,求解器在仿真过程中会检查运算的合法性,如果不合法则报错并且抛异常。如果这些不合法的运算出现在非线性方程的迭代过程,或是变步长算法的导数计算过程,那么求解器会尝试调整迭代初值或者缩小步长,经过这些调整后模型可能就正常求解了。如果没有勾选这个选项,仿真时不合法的运算结果可能是 Nan 或者 INF,这些非法数值在后续计算中的行为无法确定,不同编译器或者编译优化选项设置的情况可能不同,但都可能导致后续仿真失败。
# 解决方法
优化系统尽量避免非线性。
# 总结与预防建议
除以上常见的异常现象外,还有部分易忽略的问题容易导致仿真异常:
| 序号 | 分类 | 场景 | 解决方法 |
| 1 | 关于检查过程中的报错 | 连线维度不匹配导致的检查报错,如当连接接口均为多维端口时,维度不匹配时会出现报错 | 连接维度一致,避免缺少方程 |
| 2 | 连线缺失,方程数与变量数不一致导致的报错 | 补充缺失连线 | |
| 3 | 使用的插值表未给定数值 | 给定对应数据 | |
| 4 | 关于翻译过程中的报错 | 系统搭建不符合实际,如电类系统未接地导致翻译时方程奇异或缺方程多方程 | 系统保证接地 |
| 5 | 使用 GCC 编译器时,翻译过程中生成求解器失败 | 切换编译器进行尝试 | |
| 6 | 关于仿真过程中的报错 | 初始化失败,如非线性迭代量模块较大时导致的初始化失败,或使用 CombiTimeTable 时不满足时序递增(第一列为时间列需要满足严格递增)的要求 | 模块使用严格按照模型使用说明进行 |
| 7 | 仿真中途出现仿真失败,如系统求解发散,求解算法选择不合理等 | 切换求解算法及更改仿真步长等 |
为避免系统异常现象在进行仿真前可根据以下建议进行预防:
- 保证系统搭建符合实际,尽量避免非线性量过多;
- 参数设置合理没有超出模型使用范围;
- 仿真设置合理包括求解步长、算法积分选择、编译器选择以及其他特殊仿真设置等。