在可扩展连接器中连接参数变量

Connect parameter variables in expandable connector

两个模型通过(空的)可扩展连接器连接。 两者之一,在可扩展连接器和 parameter 变量之间建立连接。

没想到会有什么问题。相反,我遇到了一些问题:

我做错了什么?我错过了什么吗? 我的最终目标是 link 一个 parameter 变量到一个可扩展的连接器(例如,通知不同的车辆组件关于电池单元的数量,比方说) 没有 需要一个额外的冗余变量。这可能吗?

测试代码如下:

你可以使用

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;

请注意,实现远非简单明了。 为了克服以下限制,需要对助手 类 进行一些调整:

  1. 连接语句中只能使用连接器。
    所以我们需要
    • 写入值的常量块实例
      (上面代码中的助手)
    • 用于读取值的 RealOutput 连接器实例
      (上面代码中的缓冲区)
  2. 模型和块不允许有前缀参数。
    因此我们需要常量块来写入值,我们不能在这里使用 RealOutput 连接器。
  3. 对于参数,通常会根据其绑定方程自动生成初始方程。
    为了防止这种情况,我们必须设置 (fixed=false)。这允许我们在初始化阶段为参数分配具有更高可变性的变量的值——在我们的例子中是缓冲区。