在可扩展连接器中连接参数变量
Connect parameter variables in expandable connector
两个模型通过(空的)可扩展连接器连接。
两者之一,在可扩展连接器和 parameter
变量之间建立连接。
没想到会有什么问题。相反,我遇到了一些问题:
- OpenModelica 编译版本 2,但不编译版本 1
[bus_param_out]: Failed to instantiate equation connect(controlBus.num, numberPar);
Translation Error: Error occurred while flattening model bus_param
- Dymola 不编译版本 1 或版本 2
Connect does not refer to connectors in connect(bus_in.controlBus.num, bus_in.num);
但是 bus_in.num
是 Real
并且 Modelica 规范说
All components in an expandable connector are seen as connector instances even if they are not declared as such [i.e. it is possible to connect to e.g. a Real variable].
我做错了什么?我错过了什么吗?
我的最终目标是 link 一个 parameter
变量到一个可扩展的连接器(例如,通知不同的车辆组件关于电池单元的数量,比方说) 没有 需要一个额外的冗余变量。这可能吗?
测试代码如下:
bus_param.mo
model bus_param
bus_param_in bus_in;
bus_param_out bus_out;
equation
connect(bus_in.controlBus, bus_out.controlBus);
end bus_param_custom;
bus_param_in.mo
model bus_param_in
Real num;
bus controlBus;
equation
connect(controlBus.num, num);
end bus_param_in;
- bus_param_out.mo - 版本 1
model bus_param_out
parameter Real numberPar = 3.0;
bus controlBus;
equation
connect(controlBus.num, numberPar);
end bus_param_out;
- bus_param_out.mo - 版本 2
model bus_param_out
parameter Real numberPar = 3.0;
Real number;
bus controlBus;
equation
number = numberPar;
connect(controlBus.num, numberPar);
end bus_param_out;
- bus.mo
expandable connector bus
end bus;
你可以使用
Modelica.Blocks.Interfaces.RealOutput num
声明一个可在连接语句中使用的实数。
编辑:
据我所知,将参数连接到连接器是不可能的。 Dymola 将产生错误:
Connect does not refer to connectors in connect
官方的方式是Modelica.Blocks.Sources.Constant
,相当于RealOutput
。您可以直接使用这样的参数:
model bus_param_out
parameter Real number = 3;
Modelica.Blocks.Sources.Constant num_con(k=number);
bus controlBus;
equation
connect(controlBus.num, num_con.y);
end bus_param_out;
使用可扩展连接器并连接这些连接器时,您必须确保只设置bus.num
一次。其他一切都会导致错误。
尝试使用图形界面连接所有内容,这可能会解决问题。
您可以像这样在连接之外使用可扩展连接器:
model bus_param_out
Real number_of_bus;
parameter Real number = 3;
Modelica.Blocks.Sources.Constant num_con(k=number);
bus controlBus;
equation
connect(controlBus.num, num_con.y);
number_of_bus = controlBus.num;
end bus_param_out;
但是尝试声明 parameter Real number_of_bus
将导致以下错误:
The variability of the definition equation: number_of_bus =
controlBus.num; is higher than the declared variability of the
variables.
因为连接器是时变的,参数常量。
f.wue 已经展示了如何将参数写入总线。
post 还解释了如何在不增加可变性的情况下读取值(因此它仍然是一个参数)。
为了方便使用,这里给出了一个演示包的完整代码,展示了如何在总线上读写参数。
它适用于迂腐模式下的 Dymola 2019 FD01 和 OMEdit v1.13.2。
package ParmeterToBus
expandable connector bus
end bus;
model bus_param_out
parameter Real numberPar;
Modelica.Blocks.Sources.Constant helper(k=numberPar);
bus controlBus;
equation
connect(controlBus.number, helper.y);
end bus_param_out;
model bus_param_in
Modelica.Blocks.Interfaces.RealOutput buffer;
bus controlBus;
final parameter Real num(fixed=false); // users should not modify it, hence its final
initial equation
num = buffer;
equation
connect(buffer, controlBus.number);
end bus_param_in;
model example
bus_param_in bus_in;
bus_param_out bus_out(numberPar=7);
equation
connect(bus_in.controlBus, bus_out.controlBus);
end example;
end ParmeterToBus;
请注意,实现远非简单明了。
为了克服以下限制,需要对助手 类 进行一些调整:
- 连接语句中只能使用连接器。
所以我们需要
- 写入值的常量块实例
(上面代码中的助手)
- 用于读取值的 RealOutput 连接器实例
(上面代码中的缓冲区)
- 模型和块不允许有前缀参数。
因此我们需要常量块来写入值,我们不能在这里使用 RealOutput 连接器。
- 对于参数,通常会根据其绑定方程自动生成初始方程。
为了防止这种情况,我们必须设置 (fixed=false)。这允许我们在初始化阶段为参数分配具有更高可变性的变量的值——在我们的例子中是缓冲区。
两个模型通过(空的)可扩展连接器连接。
两者之一,在可扩展连接器和 parameter
变量之间建立连接。
没想到会有什么问题。相反,我遇到了一些问题:
- OpenModelica 编译版本 2,但不编译版本 1
[bus_param_out]: Failed to instantiate equation connect(controlBus.num, numberPar); Translation Error: Error occurred while flattening model bus_param
- Dymola 不编译版本 1 或版本 2
但是Connect does not refer to connectors in connect(bus_in.controlBus.num, bus_in.num);
bus_in.num
是Real
并且 Modelica 规范说All components in an expandable connector are seen as connector instances even if they are not declared as such [i.e. it is possible to connect to e.g. a Real variable].
我做错了什么?我错过了什么吗?
我的最终目标是 link 一个 parameter
变量到一个可扩展的连接器(例如,通知不同的车辆组件关于电池单元的数量,比方说) 没有 需要一个额外的冗余变量。这可能吗?
测试代码如下:
bus_param.mo
model bus_param bus_param_in bus_in; bus_param_out bus_out; equation connect(bus_in.controlBus, bus_out.controlBus); end bus_param_custom;
bus_param_in.mo
model bus_param_in Real num; bus controlBus; equation connect(controlBus.num, num); end bus_param_in;
- bus_param_out.mo - 版本 1
model bus_param_out parameter Real numberPar = 3.0; bus controlBus; equation connect(controlBus.num, numberPar); end bus_param_out;
- bus_param_out.mo - 版本 2
model bus_param_out parameter Real numberPar = 3.0; Real number; bus controlBus; equation number = numberPar; connect(controlBus.num, numberPar); end bus_param_out;
- bus.mo
expandable connector bus end bus;
你可以使用
Modelica.Blocks.Interfaces.RealOutput num
声明一个可在连接语句中使用的实数。
编辑: 据我所知,将参数连接到连接器是不可能的。 Dymola 将产生错误:
Connect does not refer to connectors in connect
官方的方式是Modelica.Blocks.Sources.Constant
,相当于RealOutput
。您可以直接使用这样的参数:
model bus_param_out
parameter Real number = 3;
Modelica.Blocks.Sources.Constant num_con(k=number);
bus controlBus;
equation
connect(controlBus.num, num_con.y);
end bus_param_out;
使用可扩展连接器并连接这些连接器时,您必须确保只设置bus.num
一次。其他一切都会导致错误。
尝试使用图形界面连接所有内容,这可能会解决问题。
您可以像这样在连接之外使用可扩展连接器:
model bus_param_out
Real number_of_bus;
parameter Real number = 3;
Modelica.Blocks.Sources.Constant num_con(k=number);
bus controlBus;
equation
connect(controlBus.num, num_con.y);
number_of_bus = controlBus.num;
end bus_param_out;
但是尝试声明 parameter Real number_of_bus
将导致以下错误:
The variability of the definition equation: number_of_bus = controlBus.num; is higher than the declared variability of the variables.
因为连接器是时变的,参数常量。
f.wue 已经展示了如何将参数写入总线。 post 还解释了如何在不增加可变性的情况下读取值(因此它仍然是一个参数)。
为了方便使用,这里给出了一个演示包的完整代码,展示了如何在总线上读写参数。 它适用于迂腐模式下的 Dymola 2019 FD01 和 OMEdit v1.13.2。
package ParmeterToBus
expandable connector bus
end bus;
model bus_param_out
parameter Real numberPar;
Modelica.Blocks.Sources.Constant helper(k=numberPar);
bus controlBus;
equation
connect(controlBus.number, helper.y);
end bus_param_out;
model bus_param_in
Modelica.Blocks.Interfaces.RealOutput buffer;
bus controlBus;
final parameter Real num(fixed=false); // users should not modify it, hence its final
initial equation
num = buffer;
equation
connect(buffer, controlBus.number);
end bus_param_in;
model example
bus_param_in bus_in;
bus_param_out bus_out(numberPar=7);
equation
connect(bus_in.controlBus, bus_out.controlBus);
end example;
end ParmeterToBus;
请注意,实现远非简单明了。 为了克服以下限制,需要对助手 类 进行一些调整:
- 连接语句中只能使用连接器。
所以我们需要- 写入值的常量块实例
(上面代码中的助手) - 用于读取值的 RealOutput 连接器实例
(上面代码中的缓冲区)
- 写入值的常量块实例
- 模型和块不允许有前缀参数。
因此我们需要常量块来写入值,我们不能在这里使用 RealOutput 连接器。 - 对于参数,通常会根据其绑定方程自动生成初始方程。
为了防止这种情况,我们必须设置 (fixed=false)。这允许我们在初始化阶段为参数分配具有更高可变性的变量的值——在我们的例子中是缓冲区。