我想使用expandable connector
(例如Bus-like structure)来建模(主要是)input
和output
连接来建立更复杂的子系统(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节“可扩展连接器” 中找到:
在生成连接方程式之前,将在可扩展连接器中声明的非参数标量变量和非参数数组元素标记为仅存在。可以使用数组尺寸“:”声明非参数数组元素,以指示大小未知。这适用于简单类型的变量和结构化类型的变量。
如f.wue所示,我们应该连接connectors
-不仅仅是输入和输出。我在上面的代码中对此进行了更改,但是并不能解决问题。
答案 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中的显示方式。这甚至是您想要实现的行为吗?
答案 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中工作。