如何在可扩展连接器中使用灵活的阵列大小?
How to use flexible array sizes within an expandable connector?
我想使用 expandable connector
(例如 Bus-like structure)为更复杂的子系统(主要是)input
和 output
连接建模(An array
将 不允许其元素具有不同的单位,并且扁平列表 变得笨拙,而 record
不允许仅连接其变量之一而无需编写方程式)。
虽然您可以简单地将变量连接到 empty expandable connector
而不会出现问题,但它的 unit
(和其他属性)将不会被传递。因此,我想在可扩展连接器中灵活地声明变量(例如 x[:]
),并让它们的尺寸由实际连接决定。
不幸的是,这在 OpenModelica 和 Wolfram System Modeler:
中均无效
package FirstAttempt
model SimpleBusModel
DataBus dataBus;
Modelica.Blocks.Interfaces.RealOutput x[ nout ](each unit = "widgets");
parameter Integer nout = 2;
equation
x = ones( nout );
connect( x, dataBus.x );
end SimpleBusModel;
expandable connector DataBus
Real[:] x(each unit = "widgets");
end DataBus;
end FirstAttempt;
... 也不会将 connector
声明为子组件并通过 inner
和 outer
传递数组大小:
model SimpleBusModel
DataBus dataBus;
Modelica.Blocks.Interfaces.RealOutput x[ nout ](each unit = "widgets");
inner parameter Integer nout = 2;
expandable connector DataBus
Real[nout] x(each unit = "widgets");
outer parameter Integer nout;
end DataBus;
equation
x = ones( nout );
connect( x, dataBus.x );
end SimpleBusModel;
如何设置具有灵活的预定义数组变量的expandable connector
?
更新:
这似乎是一个与 OpenModelica 和 Wolfram System Modeler 有关的问题,因为给出的示例在 Dymola 中运行良好(参见下面 f.wue 的评论)。我在 Wolfram Community.
上交叉发布了一个类似的问题
在 Modelica Specification(版本 3.2 修订版 2)中,我们在 第 9.1.3 节可扩展连接器中找到:
Before generating connection equations non-parameter scalar variables and non-parameter array elements declared in expandable connectors are marked as only being potentially present. A non-parameter array element may be declared with array dimensions “:” indicating that the size is unknown. This applies to both variables of simple types, and variables of structured types.
如 f.wue 所示,我们应该连接 connectors
- 而不仅仅是输入和输出。我在上面的代码中更改了它,但它没有解决问题。
可行的方法是使用 RealInputs 和 RealOutputs 而不仅仅是 Real。这样连接就可以工作并且单位可以正确传递。
package FirstAttempt
model OuterModel
SimpleBusModel sbm;
Modelica.Blocks.Sources.RealExpression dummy(y=3);
equation
connect(sbm.x[1], dummy.y);
connect(sbm.x[2], dummy.y);
end OuterModel;
model SimpleBusModel
DataBus dataBus;
Modelica.Blocks.Interfaces.RealInput x[nout](each unit = "widgets");
parameter Integer nout = 2;
equation
connect(x, dataBus.x_in);
end SimpleBusModel;
expandable connector DataBus
Real[:] x_in(each unit = "widgets");
end DataBus;
end FirstAttempt;
然后您可以使用标准库中的 Blocks.Routing
模型连接任何其他值,并将它们连接到 SimpleBusModel
的 RealInput
。
编辑:
我更改了包并添加了一个OuterModel
。这是我模拟 OuterModel 时在 dymola 中的结果。这甚至是您想要实现的行为吗?
我已收到 answer on a similar question on Wolfram Community 确认,Wolfram System Modeler(版本 12.0.0 或更早版本)目前不支持灵活的数组大小在 expandable connector
.
中
解决方法
在 Wolfram System Modeler 中,我们目前必须以常规方式传递 array-size 信息(即通过修改大小参数):
model SimpleBusModel
DataBus dataBus(nout = nout);
Modelica.Blocks.Interfaces.RealOutput x[nout](each unit = "widgets");
parameter Integer nout = 2;
expandable connector DataBus
Real[nout] x(each unit = "widgets");
parameter Integer nout;
end DataBus;
equation
x = ones(nout);
connect(x, dataBus.x);
end SimpleBusModel;
这也适用于 OpenModelica。
我想使用 expandable connector
(例如 Bus-like structure)为更复杂的子系统(主要是)input
和 output
连接建模(An array
将 不允许其元素具有不同的单位,并且扁平列表 变得笨拙,而 record
不允许仅连接其变量之一而无需编写方程式)。
虽然您可以简单地将变量连接到 empty expandable connector
而不会出现问题,但它的 unit
(和其他属性)将不会被传递。因此,我想在可扩展连接器中灵活地声明变量(例如 x[:]
),并让它们的尺寸由实际连接决定。
不幸的是,这在 OpenModelica 和 Wolfram System Modeler:
中均无效package FirstAttempt
model SimpleBusModel
DataBus dataBus;
Modelica.Blocks.Interfaces.RealOutput x[ nout ](each unit = "widgets");
parameter Integer nout = 2;
equation
x = ones( nout );
connect( x, dataBus.x );
end SimpleBusModel;
expandable connector DataBus
Real[:] x(each unit = "widgets");
end DataBus;
end FirstAttempt;
... 也不会将 connector
声明为子组件并通过 inner
和 outer
传递数组大小:
model SimpleBusModel
DataBus dataBus;
Modelica.Blocks.Interfaces.RealOutput x[ nout ](each unit = "widgets");
inner parameter Integer nout = 2;
expandable connector DataBus
Real[nout] x(each unit = "widgets");
outer parameter Integer nout;
end DataBus;
equation
x = ones( nout );
connect( x, dataBus.x );
end SimpleBusModel;
如何设置具有灵活的预定义数组变量的expandable connector
?
更新:
这似乎是一个与 OpenModelica 和 Wolfram System Modeler 有关的问题,因为给出的示例在 Dymola 中运行良好(参见下面 f.wue 的评论)。我在 Wolfram Community.
上交叉发布了一个类似的问题在 Modelica Specification(版本 3.2 修订版 2)中,我们在 第 9.1.3 节可扩展连接器中找到:
Before generating connection equations non-parameter scalar variables and non-parameter array elements declared in expandable connectors are marked as only being potentially present. A non-parameter array element may be declared with array dimensions “:” indicating that the size is unknown. This applies to both variables of simple types, and variables of structured types.
如 f.wue 所示,我们应该连接 connectors
- 而不仅仅是输入和输出。我在上面的代码中更改了它,但它没有解决问题。
可行的方法是使用 RealInputs 和 RealOutputs 而不仅仅是 Real。这样连接就可以工作并且单位可以正确传递。
package FirstAttempt
model OuterModel
SimpleBusModel sbm;
Modelica.Blocks.Sources.RealExpression dummy(y=3);
equation
connect(sbm.x[1], dummy.y);
connect(sbm.x[2], dummy.y);
end OuterModel;
model SimpleBusModel
DataBus dataBus;
Modelica.Blocks.Interfaces.RealInput x[nout](each unit = "widgets");
parameter Integer nout = 2;
equation
connect(x, dataBus.x_in);
end SimpleBusModel;
expandable connector DataBus
Real[:] x_in(each unit = "widgets");
end DataBus;
end FirstAttempt;
然后您可以使用标准库中的 Blocks.Routing
模型连接任何其他值,并将它们连接到 SimpleBusModel
的 RealInput
。
编辑:
我更改了包并添加了一个OuterModel
。这是我模拟 OuterModel 时在 dymola 中的结果。这甚至是您想要实现的行为吗?
我已收到 answer on a similar question on Wolfram Community 确认,Wolfram System Modeler(版本 12.0.0 或更早版本)目前不支持灵活的数组大小在 expandable connector
.
解决方法
在 Wolfram System Modeler 中,我们目前必须以常规方式传递 array-size 信息(即通过修改大小参数):
model SimpleBusModel
DataBus dataBus(nout = nout);
Modelica.Blocks.Interfaces.RealOutput x[nout](each unit = "widgets");
parameter Integer nout = 2;
expandable connector DataBus
Real[nout] x(each unit = "widgets");
parameter Integer nout;
end DataBus;
equation
x = ones(nout);
connect(x, dataBus.x);
end SimpleBusModel;
这也适用于 OpenModelica。