3

我想使用expandable connector(例如类似总线的结构)来(主要)为更复杂的子系统建模input和连接(An将不允许其元素具有不同的单元,并且扁平列表变得笨拙,而 a不允许仅轻松连接它的一个变量没有写方程)。outputarrayrecord

虽然您可以简单地将一个变量连接到一个 expandable connector而没有问题,但它的unit(和其他属性)不会被传递。因此,我想在可扩展连接器(例如 like 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为子组件并通过以下方式传递数组大小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 规范(版本 3.2 修订版 2)中,我们在第 9.1.3 节可扩展连接器中找到:

在生成连接方程之前,在可扩展连接器中声明的非参数标量变量和非参数数组元素被标记为仅可能存在。非参数数组元素可以用数组维度“:”声明,表示大小未知。这适用于简单类型的变量和结构化类型的变量。

正如 f.wue 所指出的,我们应该连接connectors- 而不仅仅是输入和输出。我在上面的代码中对此进行了更改,但这并没有解决问题。

4

2 回答 2

1

可行的是使用 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标准库中的模型连接任何其他值,并将它们连接RealInputSimpleBusModel.

编辑:

我更改了包并添加了一个OuterModel. 这就是我模拟 OuterModel 时结果在 dymola 中的样子。这甚至是您想要实现的行为吗?

在此处输入图像描述

于 2019-06-18T12:26:11.120 回答
0

我收到了关于 Wolfram 社区上类似问题的答案,确认Wolfram System Modeler(版本 12.0.0 或更早版本)目前不支持expandable connector.

解决方法

在 Wolfram System Modeler 中,我们目前必须以常规方式传递数组大小信息(即通过修改大小参数):

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。

于 2019-07-08T15:06:34.773 回答