【问题标题】:Connect parameter variables in expandable connector在可扩展连接器中连接参数变量
【发布时间】:2019-04-02 14:05:28
【问题描述】:

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

    可扩展连接器中的所有组件都被视为连接器实例,即使它们未声明为这样 [即可以连接到例如实变量]。

我做错了什么?我错过了什么吗? 我的最终目标是将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 dymola openmodelica


    【解决方案1】:

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

    为了方便使用,这里有一个演示包的完整代码来展示如何在总线上读取和写入参数。 它在迂腐模式下与 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)。这允许我们在初始化阶段为参数分配一个可变性更高的变量的值 - 在我们的例子中是缓冲区。

    【讨论】:

    【解决方案2】:

    你可以使用

    Modelica.Blocks.Interfaces.RealOutput num
    

    声明一个可在连接语句中使用的 Real。

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

    Connect 不是指 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。其他一切都会导致错误。

    尝试用图形界面连接所有东西,这可能会让事情变得清晰。

    您可以像这样在 connect 之外使用可扩展连接器:

    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会导致如下错误:

    定义方程的可变性:number_of_bus = 控制总线.num;高于声明的可变性 变量。

    因为连接器是时变的,参数是常数。

    【讨论】:

    • 我在 OpenModelica 中获得了当前前端:v1 和 v2 成功。对于 -d=newInst 都没有成功(bus_in.num 不是有效的连接器)。而且,连接到bus_param_out 中的参数会导致方程平衡问题(它变成断言而不是方程)。
    • @f.wue:它可以工作,但我不明白为什么需要将变量设为连接器才能使可扩展连接器工作。这不是规范(我认为)所说的。 @sjoelund.se 你是说 v1 和 v2 确实可以在没有 newInst 的情况下与 OpenModelica 一起工作,而当你启用 newInst 时它们工作。无论如何,我修改了问题以明确我想知道我是否可以直接连接到parameter变量。
    • 我希望我的编辑使我的答案更加完整。当我使用 dymola 时,我不知道 -d=newInst 是什么或做什么。当前布局中出现方程平衡问题,是的,但问题是如何将参数连接到连接器。
    • -d=newInst 是 OpenModelica 中的新扁平化,它检查了 Modelica 规范中的更多限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2020-11-15
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多