首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接可扩展连接器中的参数变量

连接可扩展连接器中的参数变量
EN

Stack Overflow用户
提问于 2019-04-02 14:05:28
回答 2查看 581关注 0票数 0

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

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

  • OpenModelica编译第2版,但不编译第1版bus_param_out:未能实例化方程连接(controlBus.num,numberPar);翻译错误:在扁平模型bus_param时出错
  • Dymola不编译版本1或版本2连接不引用连接中的连接器(bus_in.controlBus.num,bus_in.num); 但是bus_in.num是一种Real和Modelica规范,表示可扩展连接器中的所有组件都被视为连接器实例,即使它们没有被声明为连接器实例,也就是可以连接到例如一个Real变量。

我做错了什么?我是不是遗漏了什么?我的最终目标是将一个parameter变量链接到一个可扩展的连接器(例如,通知不同的车辆组件电池的数量),而不需要额外的冗余变量。这个是可能的吗?

测试代码如下:

  • bus_param.mo bus_param bus_param_in bus_in;bus_param_out bus_out;方程连接(bus_in.controlBus,bus_out.controlBus);end bus_param_custom;
  • bus_param_in.mo bus_param_in实数;总线controlBus;方程连接(controlBus.num,num);端bus_param_in;
  • bus_param_out.mo - Version 1型bus_param_out参数实numberPar = 3.0;总线controlBus;方程连接(controlBus.num,numberPar);
  • bus_param_out.mo - Version 2模型bus_param_out参数Real numberPar = 3.0;实数;总线controlBus;等式数= numberPar;连接(controlBus.num,numberPar);
  • bus.mo可扩展连接器总线端总线;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-04 12:31:22

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

为了简化它的使用,下面是演示包的完整代码,演示如何在总线上读取和写入参数。它与Dymola 2019 FD01在踏板模式和OMEdit v1.13.2。

代码语言:javascript
复制
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连接器实例。 (以上代码中的缓冲区)

  1. 模型和块不允许具有前缀参数。 因此,我们需要常量块来写值,我们不能在这里使用RealOutput连接器。
  2. 对于参数,通常由其约束方程自动生成初始方程。 为了防止这种情况,我们必须设置(fixed=false)。这允许我们在初始化阶段使用一个变量的值来分配参数--在我们的例子中,是缓冲区。
票数 2
EN

Stack Overflow用户

发布于 2019-04-02 21:46:43

你可以用

代码语言:javascript
复制
Modelica.Blocks.Interfaces.RealOutput num

若要声明可以在connect语句中使用的Real,请执行以下操作。

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

连接不引用连接中的连接器。

官方的方法是使用Modelica.Blocks.Sources.Constant,这相当于RealOutput。您可以直接使用这样的参数:

代码语言:javascript
复制
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。其他一切都会导致错误。

试着用图形界面连接所有的东西,这可能会把事情弄清楚。

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

代码语言:javascript
复制
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 = controlBus.num;高于声明的变量的可变性。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55476809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档