找不到(Modelica内部/外部)的相应内部声明

时间:2019-07-01 12:36:10

标签: modeling modelica openmodelica

我最近开始使用Modelica(OpenModelica)作为建模工具,并且在使用内部/外部功能方面遇到了问题。我正在尝试创建一个包含环境温度和压力值的环境模型,以便其他模型可以使用该值。我尝试使用内部关键字和外部关键字来执行此操作,但始终收到以下警告:

  

找不到组件.Real的相应“内部”声明   component.T0声明为“外部”。现有的“内部”组成部分   分别是:。真实环境。范围定义:Test.Ambient。检查是否   您没有拼错“外部”组件名称。请声明   在顶部范围内具有相同名称的“内部”组件。持续的   通过仅考虑“外部”组件声明来展平。

在这些行下面,您可以看到我正在尝试简化的代码。

这些行下面的三个模型包含在一个名为Test的程序包中。

其中温度T0定义为内部的环境模型:

within Test;

    model Ambient

        inner Real T0;

        equation
            T0 = 300;

end Ambient;

试图通过外部运算符调用T0的组件的模型:

within Test;

model Component

    Real T;
    outer Real T0;
    parameter Real k = 2;

    equation
        T = k * time + T0;

end Component;

环境模型和零部件模型都被拖放到组合模型中:

within Test;

model System
  Test.Ambient ambient annotation(
    Placement(visible = true, transformation(origin = {-30, 30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Test.Component component annotation(
    Placement(visible = true, transformation(origin = {30, -10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation

end System;

在运行系统时,我收到上述警告。另外,变量不只是方程式(这很有意义,因为它无法将Component.T0与环境T0连接起来)

1 个答案:

答案 0 :(得分:5)

您的用例似乎与Modelica.Mechanics.MultiBodyModelica.Fluid中的用例非常相似。在这两种情况下,都有一个类包含系统的所有“全局”属性,分别称为worldsystem

因此,您的类Ambient应该定义为inner类。然后,通过outer语句访问该语句,以重新使用其中的值。使用代码时,可能会从模型内的 T0中访问Ambient。从您的示例代码来看,这不是您想要的...

将MSL中使用的技术应用于您的示例,将导致以下代码:

package Test
model Ambient
    inner Real T0;
  equation
    T0 = 300;
    annotation(defaultComponentPrefixes="inner");
end Ambient;

model Component
    Real T;
    Real T0 = ambient.T0;
    parameter Real k = 2;
  protected
    outer Test.Ambient ambient;
  equation
    T = k * time + T0;
end Component;

model System
  inner Test.Ambient ambient;
  Test.Component component;   
end System;

end Test;

一些评论:

  • 使用外部语句访问变量是在模型的protected部分中完成的,只是为了防止在结果中多次使用相同的变量。
  • defaultComponentPrefixes注释可确保在创建图形实例的情况下,模型具有前缀inner(如模型System所示)。