【问题标题】:How to use flexible array sizes within an expandable connector?如何在可扩展连接器中使用灵活的阵列大小?
【发布时间】:2019-06-17 15:21:16
【问题描述】:

我想使用expandable connector(例如Bus-like structure)为更复杂的子系统(主要)模拟inputoutput连接(array不允许有不同的单位它的元素和扁平列表变得笨拙,而 record 不允许在不编写方程式的情况下轻松连接其变量之一)。

虽然您可以简单地将一个变量连接到一个 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 节可扩展连接器中找到:

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

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

【问题讨论】:

  • 作为一个信息:您的实现在 dymola 中运行良好。也许 OpenModelica 只是不支持这个?
  • @f.wue 不幸的是,它在Wolfram System Modeler (Version 12.0) 中也不起作用。我曾经(天真地)相信 Modelica 是一种明确指定的语言?

标签: modelica openmodelica systemmodeler


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

编辑:

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

【讨论】:

  • 很遗憾,您的代码在 OpenModelica 和 Wolfram System Modeler 中都不起作用。我有点不清楚,使用RealInput 会发生什么重大变化?问题似乎是数组大小不是自动推导出来的。
  • 我认为连接可扩展连接器的正确方法是通过连接器本身。据我所知,Real 不是连接器,另一方面,RealInput / RealOutput 是连接器。 modelica 代码在不同软件上的行为不同,这很烦人。
  • 请检查我的编辑,也许我理解你的问题都错了
  • 对不起 - 不幸的是我检查得太快了,RealInputRealOutput 的使用都不能解决这个问题。在 System Modeler 和 OpenModelica 中,似乎无法正确告知 expandable connector 内的 x[:] 与其相连的 connector(例如 x[2])的实际尺寸。有一个美丽而实用的解决方案......
  • 没问题。我会保留我的答案,因为这适用于 dymola。 modelica 代码很大程度上依赖于所使用的软件,这真是一个遗憾。
【解决方案2】:

我收到了answer on a similar question on Wolfram Community 的确认,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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 2019-10-30
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多