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

时间:2019-06-17 15:21:16

标签: modelica openmodelica systemmodeler

我想使用expandable connector(例如Bus-like structure)来建模(主要是)inputoutput连接来建立更复杂的子系统(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声明为子组件,也不通过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-不仅仅是输入和输出。我在上面的代码中对此进行了更改,但是并不能解决问题。

2 个答案:

答案 0 :(得分: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模型连接任何其他值,并将它们连接到RealInput的{​​{1}}。

编辑:

我更改了包装,并添加了SimpleBusModel。这是当我模拟OuterModel时结果在dymola中的显示方式。这甚至是您想要实现的行为吗?

enter image description here

答案 1 :(得分:0)

我已经收到answer on a similar question on Wolfram Community的确认,确认 Wolfram System Modeler (版本12.0.0或更早)当前不支持expandable connector内的灵活数组大小

解决方法

在Wolfram System Modeler中,我们目前必须以常规方式(即通过修改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中工作。