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

时间:2019-04-02 14:05:29

标签: modelica dymola openmodelica

两个模型通过(空)可扩展连接器连接。 两者之一,在可扩展连接器和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.numReal,Modelica规范说
      

    可扩展连接器中的所有组件都被视为连接器实例,即使它们没有这样声明也是如此。可以连接到例如一个实数变量]。

我在做什么错?我想念什么吗? 我的最终目标是将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;
    

2 个答案:

答案 0 :(得分:2)

您可以使用

library(purrr)
walk(as.vector(paste0("D:/SPY_data/", d$filing_date_year)), dir.create)

walk2(d$href.y,
      paste(d$filing_date_year, d$CIKAccNumFileDate_web_extension,
            sep = "/"),
      function(x, y) {
        download.file(x, 
                      destfile = paste0("D:/SPY_data/", y),
                      quiet = FALSE)
      }) 

声明可在connect语句中使用的Real。

编辑: 据我所知,不可能将参数连接到连接器。 Dymola将产生错误:

  

连接不指连接中的连接器

官方方法是使用Modelica.Blocks.Interfaces.RealOutput num ,它等效于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; 一次。其他所有内容都会导致错误。

尝试使用图形界面连接所有内容,这可能会清除一切。

您可以在connect外部使用可扩展连接器,如下所示:

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; 将导致以下错误:

  

定义方程式的可变性:number_of_bus =   controlBus.num;高于声明的可变性   变量。

因为连接器是随时间变化的并且参数是常数。

答案 1 :(得分:2)

f.wue已经展示了如何向总线写入参数。 这篇文章还解释了如何在不增加可变性的情况下读取该值(因此它是一个参数)。

为简化用法,此处是演示包的完整代码,以演示如何在总线上读取和写入参数。 它可以在pedantic模式下与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. connect语句中只能使用连接器。
    所以我们需要
    • 用于写入值的常量块的实例
      (上面代码中的帮助器)
    • 用于读取值的RealOutput连接器的实例
      (上面代码中的缓冲区)
  2. 不允许模型和块具有prefix参数。
    因此,我们需要常量块来写入值,我们不能在此处使用RealOutput连接器。
  3. 对于参数,通常会从其绑定方程式自动生成一个初始方程式。
    为了防止这种情况,我们必须设置(fixed = false)。这样一来,我们就可以在初始化阶段为参数分配可变性更高的值-在本例中为缓冲区。