预订演示
前页 后页

OpenModelica仿真疑难解答

虽然本主题描述了使用 OpenModelica 时可能出现的问题,但其中许多要点同样适用于使用 MATLAB Simulink 执行仿真。

公共仿真问题

此输出表描述了在使用 OpenModelica 时可能会阻止模型被模拟的一些常见问题。在系统输出窗口的“编译”选项卡中选择输出。这些消息是从 OpenModelica 编译器 (omc.exe) 转储的,它通常会将您指向 OpenModelica源代码的行。这将帮助您找到大部分错误。

问题

描述

方程的数量少于变量的数量。您可能忘记将某些属性设置为“属性”,这意味着该值在模拟过程中不会改变。在开始模拟之前,您可能必须提供“属性”属性值。 (通过仿真数据集设置值。)

正在键入到端口的 Blocks 不包含保存的属性。例如,一个块“ChargePort”包含两个部分——“v:电压”和“i:电流”。属性“i : Current”应定义为 PhSVariable,属性“isConserved”设置为“ True ”。

PhSConstants 可能没有默认值——它们应该被提供。

PhSVariable A开始可能没有初始值——应该提供一个。

属性可能由配置包外部的元素(块或值类型)键入;使用包导入连接器来解决这个问题。

SysML仿真配置Filters

“SysML仿真配置”对话框默认显示包中的所有元素,包括值类型、约束、部件和块、端口和约束属性、连接器数据集。对于中型模型,完整列表可能会很长,您可能很难找到潜在的建模错误。

在 TwoTanks 示例中,如果我们清除 Tank.area属性'PhSConstant',然后进行验证,我们会发现这个错误:

错误:方程太少,系统欠定。该模型有 11 个方程和 13 个变量。

此错误表明我们可能忘记为“属性”设置某些属性。

我们现在可以做的是单击工具栏右侧的第二个按钮(用于配置的过滤器)并打开此处显示的对话框。单击全部按钮,然后取消选择“抑制块”和“抑制可变部件”复选框,然后单击确定按钮。

现在我们将有一个更短的变量列表,从中我们可以发现“面积”在仿真过程中没有变化。然后我们将其定义为“PhSConstant”并提供一个初始值来解决问题。

模型验证示例

信息

讨论

约束中未定义的变量

在 TwoTanks 示例中,当我们浏览到“constraintBlock.Outcontrol.约束”时,假设我们发现了一个输入错误:我们在约束中输入了“v”而不是“b”。

所以,而不是:

a=b*(c+d)

我们输入:

a=v*(c+d)

单击工具栏上的验证按钮。这些错误消息将出现在“Modelica”选项卡中:

正在验证模型...

错误:在范围 OutControl 中找不到变量 v。 (表达式:“a=v*(c+d);”)

Error: Error occurred while flattening模型TanksConnectedPI

发现的错误和警告数:2

双击错误行;配置列表显示并突出显示约束。

更改'v' 改回 'b' 并再次单击 Validate 按钮。未发现任何错误,问题已解决。

提示:使用 SysML仿真配置视图是更改块或约束块约束的快捷方式。你可以:

  • 更改约束到位
  • 删除使用约束的上下文菜单
  • 使用块或约束块的上下文菜单添加新约束

重复的变量名称

在 TwoTanks 示例中,浏览到block.tank.constraintProperty.e1 。假设我们给两个属性取了相同的名字:

  • 右键单击e1 ,选择“在项目中查找浏览器”选项,并将名称更改为e2;重新加载“SysML仿真配置”对话框
单击工具栏上的验证按钮;这些错误消息出现在“Modelica”选项卡中:

正在验证模型...

错误:重复元素(由于继承的元素)不相同:(表达式:“SensorValue e2;”)

Error: Error occurred while flattening模型TanksConnectedPI

发现的错误和警告数:2

双击错误行;配置列表显示并突出显示约束属性。

更改其中一个的名称从e2改回e1并再次单击 Validate 按钮;没有发现错误,问题已解决。

属性定义在 ConstraintBlocks Not Used

在 TwoTanks 示例中,在浏览器窗口中,我们浏览到元素“示例模型.系统工程.ModelicaExamples.TwoTanks.constraints.OutFlow”。

假设我们添加了一个属性“ c ”和一个潜在的新约束,但我们忘记了为实例同步 - ConstraintProperties。如果我们不运行验证,这将导致方程式太少,系统欠定错误。

在“SysML仿真配置”对话框中重新加载包,然后单击工具栏上的“验证”按钮。这些错误消息将出现在“Modelica”选项卡中:

正在验证模型...

错误:ConstraintProperty“e4”缺少在键入 ConstraintBlock“OutFlow”中定义的参数。 (缺失:c)

错误:方程式太少,系统未定。模型有 11 个方程和 12 个变量。

发现的错误和警告数:2

双击错误行;配置列表显示并突出显示 ConstraintProperty。 ConstraintProperty 被键入到outFlow并且缺少新参数“ c ”。

右键单击配置列表中的ConstraintProperty,选择“在所有图表中查找”选项,然后右键单击图表上的“约束”属性;选择'特征|部件/属性”并选中“显示拥有/继承”复选框,然后单击“c”。

在“SysML仿真配置”对话框中重新加载模型,然后单击“验证”按钮。这些错误消息将出现在“Modelica”选项卡中:

正在验证模型...

     错误:ConstraintProperty“e4”没有参数“c”的任何传入或传出绑定连接器。

错误:方程式太少,系统未定。模型有 11 个方程和 12 个变量。

发现的错误和警告数:2

为了解决这个问题,我们可以根据实际逻辑做两件事之一:

  1. 如果在ConstraintBlock中属性'c'是必需的,并且使用'c'定义了一个约束,那么我们需要在ConstraintProperty的上下文中添加一个属性并绑定到参数'c'。
  2. 如果不需要属性'c',那么我们可以在约束块中点击这个属性,然后按Ctrl+D键。 (相应的 ConstraintProperties 将自动删除“c”。)

学到更多