Modelica仿真组件
Modelica仿真
Modelica Simulation
算盘Modelica仿真组件用于仿真Modelica(一种多领域系统建模语言)语言描述的系统模型。其内部执行一系列仿真必要操作,即模型描述文件的转译、分析、代码优化、C语言程序生成、编译以及仿真运行和结果数据输出。用户仅需提供必要的Modelica模型描述文件及自定义输入数据(如无需自定义输入也可忽略)后即可运行该组件完成上述一系列操作得到仿真结果。另外,此组件提供将Modelica模型转为FMU文件和下载功能,方便用户将导出的FMU模型在其他模板中运行。
首先用户需要在参数设置中上传一个后缀为*.mo
的Modelica模型文件。文件名和模型model名称一致。默认输出所有输入输出数据,如需自定义请在参数设置中设置“要记录的变量列表”的参数值。
如何使用算盘Modelica仿真组件
上传Modelica模型描述文件
目前阶段算盘Modelica仿真无前端模型编辑界面,用户可以用第三方Modelica编辑器如(开源的OpenModelica,苏州同元的MWorks.Sysplorer,MapleSim,Dymola等桌面软件)拖拽生成Modelica模型文件。
如下简单Modelica模型,输入信号和模型内的一个正弦波用做加法操作,然后接到了一个死区操作,最后接到一个限阈值操作,作为最后模型输出。
该Modelica模型文本描述为,
model sin1
一行代表该模型名称为sin1
。该文件文件名为sin1.mo
。
within ;
model sin1
annotation (Diagram(coordinateSystem(extent = {{-140.0, -100.0}, {140.0, 100.0}},
preserveAspectRatio = false,
grid = {2.0, 2.0})),
Icon(coordinateSystem(extent = {{-100.0, -100.0}, {100.0, 100.0}},
preserveAspectRatio = false,
grid = {2.0, 2.0})));
Modelica.Blocks.Sources.Sine sine
annotation (Placement(transformation(origin = {-104.0, -20.0},
extent = {{-10.0, -10.0}, {10.0, 10.0}})));
Modelica.Blocks.Interfaces.RealOutput y
annotation (Placement(transformation(origin = {36.0, 8.0},
extent = {{-6.0, -6.0}, {6.0, 6.0}})));
Modelica.Blocks.Nonlinear.Limiter limiter
annotation (Placement(transformation(origin = {-2.0, 8.0},
extent = {{-10.0, -10.0}, {10.0, 10.0}})));
Modelica.Blocks.Nonlinear.DeadZone deadZone
annotation (Placement(transformation(origin = {-36.0, 8.0},
extent = {{-10.0, -10.0}, {10.0, 10.0}})));
Modelica.Blocks.Interfaces.RealInput u
annotation (Placement(transformation(origin = {-111.0, 17.0},
extent = {{-11.0, -11.0}, {11.0, 11.0}})));
Modelica.Blocks.Math.Add add
annotation (Placement(transformation(origin = {-72.0, 8.0},
extent = {{-10.0, -10.0}, {10.0, 10.0}})));
equation
connect(limiter.y, y)
annotation (Line(origin = {7.0, -20.0},
points = {{2.0, 28.0}, {29.0, 28.0}},
color = {0, 0, 127}));
connect(deadZone.y, limiter.u)
annotation (Line(origin = {-39.0, -20.0},
points = {{14.0, 28.0}, {25.0, 28.0}},
color = {0, 0, 127}));
connect(u, add.u1)
annotation (Line(origin = {-99.0, 21.0},
points = {{-12.0, -4.0}, {7.0, -4.0}, {7.0, -7.0}, {15.0, -7.0}},
color = {0, 0, 127}));
connect(add.y, deadZone.u)
annotation (Line(origin = {-53.0, 9.0},
points = {{-8.0, -1.0}, {5.0, -1.0}},
color = {0, 0, 127}));
connect(sine.y, add.u2)
annotation (Line(origin = {-88.0, -9.0},
points = {{-5.0, -11.0}, {0.0, -11.0}, {0.0, 11.0}, {4.0, 11.0}},
color = {0, 0, 127}));
end sin1;
我们可以将此文件上传到Modelica仿真组件。
自定义仿真输入数据(可选)
如果您的Modelica模型没有定义输入端子或您无需自定义输入数据也可略过此步骤。
在上述Modelica文件中可以看到我们的输入端子名为u
,因为有Modelica.Blocks.Interfaces.RealInput u
,同理输出端子名为y
,因为有Modelica.Blocks.Interfaces.RealOutput y
。
我们可提供一个csv文件用于输入端子u的自定义输入数据。例如将如下内容保存为一个csv文件然后上传到“CSV上传组件”,csv文件名可以为任意英文名称,比如user_data.csv
。该文件第一列为时间轴,单位秒,其余列为输入端子对应该时间的输入值。对于其他时间点的输入,仿真引擎会使用插值法确定输入值。比如在此csv文件中我们仅定义了5个时间点的输入值,但是其他时间点的输入值会用插值法取得。
time,u
0.0,0.0
0.4,0.5
0.8,0.5
1.0,0.0
1.1,0.0
仿真自定义参数配置(可选)
如果您接受Modelica模型默认仿真配置,此步骤可以略过。
您可以根据需求配置Modelica仿真组件的其他参数。如下我们在“初始化参数配置”配置["sine.freqHz=5.0", "deadZone.uMax=0.5"]
,这将更改模型中正弦波模块的频率为5Hz,以及死区模块的最大值为0.5。“仿真参数”配置["stopTime=2", "tolerance=1e-08"]
,将会让模型仿真时长为2秒后停止,更改默认容差值为1e-08。对于“要记录的变量列表”参数,因为我们仅需记录模型的输入、输出随时间变化数据。所以我们填了["u", "y"]
。您也可以不填,组件默认会输出所有输入输出数据。如果您需要记录模型内部模块仿真过程产生数据,比如记录死区模块的输出,您可以增加一个deadZone.y
,即在“要记录的变量列表”中填["u", "y", "deadZone.y"]
。
在“创建FMU”选项中选择是否生成FMU文件以及FMU的格式,联合仿真/模型交换。有关FMU技术本身内容,请参考语雀文档。
运行仿真
在“Modelica仿真”选中时候点击“运行该节点”,如下图
改组件运行结束后,您可以在“查看结果”中查看、下载仿真结果CSV文件以及创建的FMU文件。
运行下游组件,在运行“折线图”组件前,如下,在其“字段设置”中分别选择X, Y 轴字段。
运行“折线图”组件后您可看到按仿真结果数据生成的曲线图,蓝色“u”为模型输入数据随时间变化曲线,紫色“y”为模型输出数据随时间变化曲线。
更多关于Modelica仿真技术本身的介绍可以参考语雀文档。