如何在 Modelica 中使用多维连接器连接多维组件?
how to connect multi-dimensional components with multi-dimensional connectors in Modelica?
我试图将一个二维组件数组连接到一个包含一维连接器的一维组件数组,但是在检查模型时,出现显示尺寸不匹配的错误。
但是我可以将一个一维组件数组连接到一个包含一维连接器的组件,
那么为什么这不能适用于多维情况呢?
我做错了吗?
我查了代码,好像不能用
connect(tubeWall.port_b,surface.q_port);
但是如果我使用下面的代码,它工作正常。
for i in 1:x loop
for j in 1:y loop
connect(tubeWall[i].port_b[j], surface[i,j].q_port);
end for;
end for;
我做了更多测试,下面是运行良好的测试代码:
model Unnamed
gain_1[3] gain_1_1
Modelica.Blocks.Sources.Sine[3,3] sine
Modelica.Blocks.Math.Cos[3,3] cos
equation
connect(sine.y, gain_1_1.u);
connect(gain_1_1.y, cos.u);
end Unnamed;
model gain_1
Modelica.Blocks.Math.Gain[3] gain
Modelica.Blocks.Interfaces.RealOutput[3] y
Modelica.Blocks.Interfaces.RealInput[3] u
equation
connect(gain.y, y)
connect(u, gain.u)
end gain_1;
这是连接的屏幕截图:
看来这个想法是对的,但我不确定为什么它在我的模型中不起作用。希望有人可以给我的模型中无与伦比的错误提示或方向。
引用 Fritzon 的使用 Modelica 3.3 进行面向对象建模和仿真的原理:
The connect
contruct can be used to directly connect arrays of
connectors. For such array connections the following holds:
- The array dimensions of the connected arrays of connectors must match
- Each corresponding pair of elements is connected as a pair of scalar connectors
即参考connect(tubeWall.port_b,surface.q_port);
- 它不知道
surface[:,:]
的哪个维度去 tubeWall[:]
哪个维度去 port_b[:]
- for 循环有效,因为您接管了将这对元素连接为标量连接器的任务
我对你的建模任务的建议是,你创建一个接口块放在 surface
和 tubeWall
之间,你可以在其中按应有的方式实现元素连接。表面和界面之间的连接可能如下所示:
connect(surface, interface.surfacePort);
我试了一下,看看能不能弄明白。这里有三点可能会让您更接近于关于为什么物理连接(在您的情况下是热连接)和信号连接(在您的情况下是真实的 input/output,在您的情况下)之间存在不同行为的规范答案:
真正的 input/output 是因果关系,并且声明与物理连接器不同
connector RealInput = input Real "'input Real' as connector" annotation (...);
connector PhysConnector
Real pt;
flow Real flw;
annotation (...);
end PhysConnector;
真正的 input/output 看起来更像函数而不是连接器。我想 连接器连接数组的数组维度必须匹配 规则 apply/is 不会对它们强制执行。我可以想到不同的原因;其中两个可能是:
- 有一个公认的处理表格的框架,就像我们大多数人都同意查看地理地图左上角是西北一样。因此,连接会根据以下顺序自动排序:第 1 暗、第 2 暗、第 3 暗……另一方面,多维物理连接可能代表各种场景。最好让模型设计师负责正确构建它
- 真正的 input/output 生成一个赋值而不是一组方程式,因此在确定系统的因果关系时他们不会过多地使用排序算法
我最终尝试测试仅具有潜在变量的标准连接器,以查看问题是否是由于存在流量变量时生成的两个方程引起的。平面 Modelica 显示仅生成一个方程(如预期),但仍然不允许连接 matrix[:,:],array[:].array[:]
。
package MultidimConnections
connector RealConnector
Real r;
annotation(Icon(coordinateSystem(preserveAspectRatio=false)),Diagram(coordinateSystem(preserveAspectRatio=false)));
end RealConnector;
partial model RealInterface
RealConnector realConnector annotation(Placement(transformation(extent={{90,-10},{110,10}})));
annotation(Icon(coordinateSystem(preserveAspectRatio=false),graphics={Rectangle(extent={{-100,100},{100,-100}},lineColor={28,108,200},fillColor={170,213,255},fillPattern=FillPattern.None)}),Diagram(coordinateSystem(preserveAspectRatio=false)));
end RealInterface;
model Source
extends RealInterface;
parameter Real k = 0;
equation
k = realConnector.r;
annotation(Icon(coordinateSystem(preserveAspectRatio=false),graphics={Rectangle(extent={{-80,80},{80,-60}},lineColor={28,108,200},fillColor={151,226,75},fillPattern=FillPattern.Solid), Text(extent={{-100,-60},{100,-100}},lineColor={28,108,200},fillColor={151,226,75},fillPattern=FillPattern.Solid,textString="%name")}),Diagram(coordinateSystem(preserveAspectRatio=false)));
end Source;
model User
extends RealInterface;
Real double;
equation
double = 2*realConnector.r;
annotation(Icon(coordinateSystem(preserveAspectRatio=false), graphics={Rectangle(extent={{-80,80},{80,-60}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid), Text(extent={{-100,-60},{100,-100}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid,textString="%name")}),Diagram(coordinateSystem(preserveAspectRatio=false)));
end User;
model User_multi
MultidimConnections.User user annotation(Placement(transformation(extent={{-10,40},{10,60}})));
MultidimConnections.User user1 annotation(Placement(transformation(extent={{-10,-10},{10,10}})));
MultidimConnections.User user2 annotation(Placement(transformation(extent={{-10,-60},{10,-40}})));
RealConnector realConnector[3] annotation(Placement(transformation(extent={{110,-10},{90,10}})));
equation
connect(user.realConnector, realConnector[1]) annotation(Line(points={{10,50},{98,50},{98,-6.66667},{100,-6.66667}}, color={0,0,0}));
connect(user1.realConnector, realConnector[2]) annotation(Line(points={{10,0},{98,0},{98,4.44089e-16},{100,4.44089e-16}}, color={0,0,0}));
connect(user2.realConnector, realConnector[3]) annotation(Line(points={{10,-50},{98,-50},{98,6.66667},{100,6.66667}}, color={0,0,0}));
annotation(Icon(coordinateSystem(preserveAspectRatio=false), graphics={Rectangle(extent={{-80,80},{80,40}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid),Text(extent={{-100,-60},{100,-100}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid,textString="%name"),Rectangle(extent={{-80,28},{80,-12}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid),Rectangle(extent={{-80,-20},{80,-60}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid),Rectangle(extent={{-100,100},{100,-102}}, lineColor={28,108,200})}),Diagram(coordinateSystem(preserveAspectRatio=false)));
end User_multi;
model TestCustomReal
extends Modelica.Icons.Example;
Source source(k=1) annotation(Placement(transformation(extent={{-60,40},{-40,60}})));
User user annotation(Placement(transformation(extent={{60,40},{40,60}})));
User_multi user_multi annotation(Placement(transformation(extent={{60,-10},{40,10}})));
Source source_arr[3](k=1) annotation(Placement(transformation(extent={{-60,-10},{-40,10}})));
User_multi user_multi_array[3] annotation(Placement(transformation(extent={{60,-60},{40,-40}})));
Source source_mat[3,3](k=1) annotation(Placement(transformation(extent={{-60,-60},{-40,-40}})));
equation
connect(source.realConnector, user.realConnector) annotation(Line(points={{-40,50},{40,50}}, color={0,0,0}));
connect(source_arr.realConnector, user_multi.realConnector) annotation(Line(points={{-40,0},{40,0}}, color={0,0,0}));
connect(source_mat.realConnector, user_multi_array.realConnector) annotation(Line(points={{-40,-50},{40,-50}}, color={0,0,0}));
end TestCustomReal;
annotation(uses(Modelica(version="3.2.3")));
end MultidimConnections;
connect 构造仅在数组维度匹配时才起作用。
- 您可以在创建连接 window 时提供索引,以在 tubeWall 和表面之间建立正确的连接。这正是代码在做什么。
- 模型 Unnammed 有效,因为 gain_1_1.u 是一个尺寸为 [3,3] 的连接器。如果更改实例的大小 gain_1,您将看到差异。
因此您可以连接相同大小的数组或在连接期间明确提及索引。
希望对您有所帮助。
我试图将一个二维组件数组连接到一个包含一维连接器的一维组件数组,但是在检查模型时,出现显示尺寸不匹配的错误。 但是我可以将一个一维组件数组连接到一个包含一维连接器的组件, 那么为什么这不能适用于多维情况呢? 我做错了吗?
我查了代码,好像不能用
connect(tubeWall.port_b,surface.q_port);
但是如果我使用下面的代码,它工作正常。
for i in 1:x loop
for j in 1:y loop
connect(tubeWall[i].port_b[j], surface[i,j].q_port);
end for;
end for;
我做了更多测试,下面是运行良好的测试代码:
model Unnamed
gain_1[3] gain_1_1
Modelica.Blocks.Sources.Sine[3,3] sine
Modelica.Blocks.Math.Cos[3,3] cos
equation
connect(sine.y, gain_1_1.u);
connect(gain_1_1.y, cos.u);
end Unnamed;
model gain_1
Modelica.Blocks.Math.Gain[3] gain
Modelica.Blocks.Interfaces.RealOutput[3] y
Modelica.Blocks.Interfaces.RealInput[3] u
equation
connect(gain.y, y)
connect(u, gain.u)
end gain_1;
这是连接的屏幕截图:
看来这个想法是对的,但我不确定为什么它在我的模型中不起作用。希望有人可以给我的模型中无与伦比的错误提示或方向。
引用 Fritzon 的使用 Modelica 3.3 进行面向对象建模和仿真的原理:
The
connect
contruct can be used to directly connect arrays of connectors. For such array connections the following holds:
- The array dimensions of the connected arrays of connectors must match
- Each corresponding pair of elements is connected as a pair of scalar connectors
即参考connect(tubeWall.port_b,surface.q_port);
- 它不知道
surface[:,:]
的哪个维度去tubeWall[:]
哪个维度去port_b[:]
- for 循环有效,因为您接管了将这对元素连接为标量连接器的任务
我对你的建模任务的建议是,你创建一个接口块放在 surface
和 tubeWall
之间,你可以在其中按应有的方式实现元素连接。表面和界面之间的连接可能如下所示:
connect(surface, interface.surfacePort);
我试了一下,看看能不能弄明白。这里有三点可能会让您更接近于关于为什么物理连接(在您的情况下是热连接)和信号连接(在您的情况下是真实的 input/output,在您的情况下)之间存在不同行为的规范答案:
真正的 input/output 是因果关系,并且声明与物理连接器不同
connector RealInput = input Real "'input Real' as connector" annotation (...);
connector PhysConnector Real pt; flow Real flw; annotation (...); end PhysConnector;
真正的 input/output 看起来更像函数而不是连接器。我想 连接器连接数组的数组维度必须匹配 规则 apply/is 不会对它们强制执行。我可以想到不同的原因;其中两个可能是:
- 有一个公认的处理表格的框架,就像我们大多数人都同意查看地理地图左上角是西北一样。因此,连接会根据以下顺序自动排序:第 1 暗、第 2 暗、第 3 暗……另一方面,多维物理连接可能代表各种场景。最好让模型设计师负责正确构建它
- 真正的 input/output 生成一个赋值而不是一组方程式,因此在确定系统的因果关系时他们不会过多地使用排序算法
我最终尝试测试仅具有潜在变量的标准连接器,以查看问题是否是由于存在流量变量时生成的两个方程引起的。平面 Modelica 显示仅生成一个方程(如预期),但仍然不允许连接
matrix[:,:],array[:].array[:]
。
package MultidimConnections
connector RealConnector
Real r;
annotation(Icon(coordinateSystem(preserveAspectRatio=false)),Diagram(coordinateSystem(preserveAspectRatio=false)));
end RealConnector;
partial model RealInterface
RealConnector realConnector annotation(Placement(transformation(extent={{90,-10},{110,10}})));
annotation(Icon(coordinateSystem(preserveAspectRatio=false),graphics={Rectangle(extent={{-100,100},{100,-100}},lineColor={28,108,200},fillColor={170,213,255},fillPattern=FillPattern.None)}),Diagram(coordinateSystem(preserveAspectRatio=false)));
end RealInterface;
model Source
extends RealInterface;
parameter Real k = 0;
equation
k = realConnector.r;
annotation(Icon(coordinateSystem(preserveAspectRatio=false),graphics={Rectangle(extent={{-80,80},{80,-60}},lineColor={28,108,200},fillColor={151,226,75},fillPattern=FillPattern.Solid), Text(extent={{-100,-60},{100,-100}},lineColor={28,108,200},fillColor={151,226,75},fillPattern=FillPattern.Solid,textString="%name")}),Diagram(coordinateSystem(preserveAspectRatio=false)));
end Source;
model User
extends RealInterface;
Real double;
equation
double = 2*realConnector.r;
annotation(Icon(coordinateSystem(preserveAspectRatio=false), graphics={Rectangle(extent={{-80,80},{80,-60}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid), Text(extent={{-100,-60},{100,-100}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid,textString="%name")}),Diagram(coordinateSystem(preserveAspectRatio=false)));
end User;
model User_multi
MultidimConnections.User user annotation(Placement(transformation(extent={{-10,40},{10,60}})));
MultidimConnections.User user1 annotation(Placement(transformation(extent={{-10,-10},{10,10}})));
MultidimConnections.User user2 annotation(Placement(transformation(extent={{-10,-60},{10,-40}})));
RealConnector realConnector[3] annotation(Placement(transformation(extent={{110,-10},{90,10}})));
equation
connect(user.realConnector, realConnector[1]) annotation(Line(points={{10,50},{98,50},{98,-6.66667},{100,-6.66667}}, color={0,0,0}));
connect(user1.realConnector, realConnector[2]) annotation(Line(points={{10,0},{98,0},{98,4.44089e-16},{100,4.44089e-16}}, color={0,0,0}));
connect(user2.realConnector, realConnector[3]) annotation(Line(points={{10,-50},{98,-50},{98,6.66667},{100,6.66667}}, color={0,0,0}));
annotation(Icon(coordinateSystem(preserveAspectRatio=false), graphics={Rectangle(extent={{-80,80},{80,40}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid),Text(extent={{-100,-60},{100,-100}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid,textString="%name"),Rectangle(extent={{-80,28},{80,-12}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid),Rectangle(extent={{-80,-20},{80,-60}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid),Rectangle(extent={{-100,100},{100,-102}}, lineColor={28,108,200})}),Diagram(coordinateSystem(preserveAspectRatio=false)));
end User_multi;
model TestCustomReal
extends Modelica.Icons.Example;
Source source(k=1) annotation(Placement(transformation(extent={{-60,40},{-40,60}})));
User user annotation(Placement(transformation(extent={{60,40},{40,60}})));
User_multi user_multi annotation(Placement(transformation(extent={{60,-10},{40,10}})));
Source source_arr[3](k=1) annotation(Placement(transformation(extent={{-60,-10},{-40,10}})));
User_multi user_multi_array[3] annotation(Placement(transformation(extent={{60,-60},{40,-40}})));
Source source_mat[3,3](k=1) annotation(Placement(transformation(extent={{-60,-60},{-40,-40}})));
equation
connect(source.realConnector, user.realConnector) annotation(Line(points={{-40,50},{40,50}}, color={0,0,0}));
connect(source_arr.realConnector, user_multi.realConnector) annotation(Line(points={{-40,0},{40,0}}, color={0,0,0}));
connect(source_mat.realConnector, user_multi_array.realConnector) annotation(Line(points={{-40,-50},{40,-50}}, color={0,0,0}));
end TestCustomReal;
annotation(uses(Modelica(version="3.2.3")));
end MultidimConnections;
connect 构造仅在数组维度匹配时才起作用。
- 您可以在创建连接 window 时提供索引,以在 tubeWall 和表面之间建立正确的连接。这正是代码在做什么。
- 模型 Unnammed 有效,因为 gain_1_1.u 是一个尺寸为 [3,3] 的连接器。如果更改实例的大小 gain_1,您将看到差异。
因此您可以连接相同大小的数组或在连接期间明确提及索引。
希望对您有所帮助。