我最近开始使用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连接起来)
答案 0 :(得分:5)
您的用例似乎与Modelica.Mechanics.MultiBody
和Modelica.Fluid
中的用例非常相似。在这两种情况下,都有一个类包含系统的所有“全局”属性,分别称为world
或system
。
因此,您的类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
所示)。