如何在可扩展连接器中使用灵活的阵列大小?

How to use flexible array sizes within an expandable connector?

我想使用 expandable connector(例如 Bus-like structure)为更复杂的子系统(主要是)inputoutput 连接建模(An array 不允许其元素具有不同的单位,并且扁平列表 变得笨拙,而 record 不允许仅连接其变量之一而无需编写方程式)。

虽然您可以简单地将变量连接到 empty expandable connector 而不会出现问题,但它的 unit(和其他属性)将不会被传递。因此,我想在可扩展连接器中灵活地声明变量(例如 x[:]),并让它们的尺寸由实际连接决定。

不幸的是,这在 OpenModelicaWolfram 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 声明为子组件并通过 innerouter 传递数组大小:

  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 模型连接任何其他值,并将它们连接到 SimpleBusModelRealInput

编辑:

我更改了包并添加了一个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。