Modelica 如何在可扩展连接器中使用灵活的阵列尺寸?
我想使用Modelica 如何在可扩展连接器中使用灵活的阵列尺寸?,modelica,openmodelica,systemmodeler,Modelica,Openmodelica,Systemmodeler,我想使用可扩展连接器(例如a)为更复杂的子系统建模(主要是)输入和输出连接(一个数组将不允许其元素有不同的单位,扁平列表将变得很难处理,而一个记录不允许在不写等式的情况下轻松连接其一个变量) 虽然您可以简单地将变量连接到空的可扩展连接器,但它的单元(和其他属性)不会被传递。因此,我想灵活地声明可扩展连接器内的变量(例如x[:])并根据实际连接确定其尺寸 不幸的是,OpenModelica和Wolfram System Modeler中也没有验证这一点: …将连接器声明为子组件并通过内部和外部传递
可扩展连接器
(例如a)为更复杂的子系统建模(主要是)输入
和输出
连接(一个数组
将不允许其元素有不同的单位,扁平列表将变得很难处理,而一个记录
不允许在不写等式的情况下轻松连接其一个变量)
虽然您可以简单地将变量连接到空的可扩展连接器
,但它的单元
(和其他属性)不会被传递。因此,我想灵活地声明可扩展连接器内的变量(例如x[:]
)并根据实际连接确定其尺寸
不幸的是,OpenModelica和Wolfram System Modeler中也没有验证这一点:
…将连接器
声明为子组件并通过内部
和外部
传递数组大小也不会产生以下结果:
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;
如何设置带有灵活预定义数组变量的可扩展连接器
更新:
这似乎是一个与OpenModelica和Wolfram系统建模器有关的问题,因为在Dymola中给出的示例很好地解决了这个问题(参见下面的f.wue评论)。我在上交叉发布了一个类似的问题
在(第3.2版第2版)中,我们可以在第9.1.3节可扩展连接器中找到:
在生成连接方程之前,可扩展连接器中声明的非参数标量变量和非参数数组元素被标记为仅可能存在。非参数数组元素可以用数组维度声明为“:”表示大小未知。这既适用于简单类型的变量,也适用于结构化类型的变量
正如f.wue所指出的那样,我们应该连接
连接器
——而不仅仅是输入和输出。我在上面的代码中更改了这一点,但这并不能解决问题。可行的方法是使用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;
然后,您可以使用标准库中的块.Routing
模型连接任何其他值,并将它们连接到SimpleBusModel的RealInput
编辑:
我更改了包并添加了一个OuterModel
。这就是我模拟OuterModel时dymola中的结果。这就是您想要实现的行为吗
我收到一份确认函,确认Wolfram System Modeler(12.0.0版或更早版本)目前不支持可扩展连接器内的灵活阵列大小
变通办法
在Wolfram System Modeler中,我们目前必须以常规方式(即通过修改尺寸参数)传递阵列尺寸信息:
这也适用于OpenModelica。作为一个信息:您的实现在dymola中运行良好。可能OpenModelica不支持此功能?@f.wue不幸的是,它在中也不起作用。我曾经(天真地)相信Modelica是一种明确指定的语言?不幸的是,您的代码在OpenModelica和Wolfram System Modeler中都不起作用。我有点不清楚,使用RealInput
会有什么实质性的改变?问题似乎是数组大小不是自动推导出来的。我认为连接到ex的正确方法可扩展连接器是通过连接器本身实现的。据我所知,Real不是连接器,而RealInput/RealOutput则是连接器。modelica代码在不同软件上的行为不同,这让人非常恼火。请检查我的编辑,也许我完全错误地理解了您的问题抱歉-不幸的是,我检查得太快了,使用也不一样RealInput
和RealOutput
解决了这个问题。在System Modeler和OpenModelica中,似乎无法正确地将x[:]
可扩展连接器内部的x[:]
告知连接器的实际尺寸(例如x[2]
)这与它有关。有一个漂亮而实用的解决方案……没问题。我将保留我的答案,因为这在dymola中起作用。modelica代码强烈依赖于所使用的软件,这真是微不足道。
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;
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;