在一些交互式仿真工作中,可以方便地仿真到某个时间点,更改一些参数,然后继续仿真。
使用FMU进行仿真,则需要重新加载或重置FMU,然后为系统状态输入新的初始值,该初始值是先前仿真的状态的最终值。您还需要以与之前的模拟类似的方式输入与默认值不同的参数值。
当您使用 PyFMI 时,有一个方便的关联函数 get_states_list() ,如下所示:
from pyfmi import load_fmu
...
model = load_fmu('file of fmu')
stateDict = model.get_states_list()
Run Code Online (Sandbox Code Playgroud)
字典 stateDict 包含连续时间状态,这对于进一步自动更新初始状态值与先前模拟的最终状态值非常有帮助。据我了解,可能的离散时间状态不包括在内,并且需要手动处理。
如何使用 FMPy 获得类似的(连续时间)状态字典?或者更好的是,还包括离散时间状态?
我在 Modelica 中有一个简单的电机模型,它在 Dymola 中以恒定电压运行时给出了预期的速度输出。但是当我将它导出为联合仿真 fmu(使用 Dymola 的 dassl 求解器)时,它在 fmpy 和 Simulink 等其他环境中给出了不同的答案。
model motor
Modelica.Blocks.Interfaces.RealInput vol "voltage" annotation (Placement(
transformation(extent={{-140,-20},{-100,20}})));
Modelica.Blocks.Interfaces.RealOutput v[1] "velocity" annotation (Placement(
transformation(extent={{100,-10},{120,10}})));
Real x[2](start={0,0}) "stateVector";
parameter Real A[:,:]=[1.511, -0.5488;1, 0];
parameter Real B[:] = {0.0625,0};
parameter Real C[:,:] = [0.03294,0.02697];
parameter Modelica.SIunits.Time dT = 0.1 "samplingTime";
equation
x = A*delay(x, dT) + B*vol;
v = C*x;
annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false)));
end motor;
Run Code Online (Sandbox Code Playgroud)
只有当输入(此处为 vol)是恒定输入时,才能看到这种差异。对于阶跃或斜坡输入,Modelica 模型和 fmu 给出相同的答案。因此我认为这可能与 Dymola vs fmu 中 vol 的起始值有关。因此,我在输入端口上添加了起始值,但这没有帮助。
Modelica.Blocks.Interfaces.RealInput …
Run Code Online (Sandbox Code Playgroud) 我想导出一个具有受控选择的输入和输出的FMU.
我有一个成功编译成FMU的模型,但是几个内部变量在FMU中作为输出变量出现.
在编译FMU时是否可以隐藏这些变量?
例如,我希望我的模型有3个输入和6个输出.但是,编译后,FMU有26个来自内部模型的变量.这些变量会随着时间的推移接收内部更改的更新.
我正在使用Dymola 2019(虽然我可以使用任何版本).
我在 Windows 上生成了一个 FMU,并在 Mac 上使用 Matlab Simulink 导入了 FMU,并得到以下错误。我搜索了这个问题并从这里的答案中得到了一些线索 https://tomlankhorst.nl/quick-fix-matlab-fmu-import-error/,似乎 FMU 在 Windows 和 Mac 上生成时会以不同的形式存储.
问题是:是否可以在 Windows 上生成仍可在 Mac 上运行的 FMU。