是否可以使用内部/外部全局设置类型并使其可替换?

时间:2019-06-07 09:34:06

标签: modelica units-of-measurement openmodelica systemmodeler

问题描述

我想在经济建模(例如系统动力学)中使用非SI单位进行时间分析。当然,我可以花 s )然后使用displayUnit,据我所知,没有很好的方法来修改 displayUnit 我主要使用的是System Modeler中的 time

因此,在编写库时,我希望用户选择一个名为type的全局ModelTime,理想情况下,在某些情况下将其声明为innerreplaceable顶级班。然后,模型中的任何组件都可以使用全局type来始终如一地对待任何与时间相关的var。

最小示例

以下示例显示了我想如何实现这一点。

  • package Units声明了两种非SI单位类型(Time_yearTime_month
  • package Interfaces包含部​​分模型类GenericSimulationModel,它将成为使用该库编写的任何模型的顶级范围。应该提供type ModelTime作为innerreplaceable
  • package Components定义了一个简单的block类,该类通过ModelTime定义使用outer来定义其output y,并在其中简单地显示time全局选择的时间单位
  • model Example将所有这些联系在一起,以提供一个示例,说明使用该库的任何模型应如何工作

代码如下:

model MinimalExample

  package Units
    type Time_year = Real(final quantity = "Time", final unit = "yr");    
    type Time_month = Real(final quantity = "Time", final unit = "mo");
  end Units;

  package Interfaces
    partial model GenericSimulationModel "Top-level model scope providing global vars"
      inner replaceable type ModelTime = Years "Set to : Months, Years";
    protected
      type Years = Units.Time_year;
      type Months = Units.Time_month;
    end GenericSimulationModel;
  end Interfaces;

  package Components
    block ComponentUsingTime
      outer type ModelTime = MinimalExample.Units.Time_year;
      output ModelTime y;
    equation
      y = time;
    end ComponentUsingTime;
  end Components;

  model Example
    extends Interfaces.GenericSimulationModel(
      redeclare replaceable type ModelTime = Months
    );
    Components.ComponentUsingTime c;
  end Example;
equation

end MinimalExample;

尽管所有内容在System Modeler和OpenModelica中都可以正确编译,但是很遗憾,该方法无法解决:在上述Example模型的组件c中未使用重新声明的类型。

我该怎么做才能实现自己的目标?

1 个答案:

答案 0 :(得分:0)

我从Wolfram MathCore(系统建模人员)的某人那里收到了feedback on Wolfram Community

  

您在MinimalExample.example和MinimalLibrary.Example中看到的行为是错误,从我可以看到的情况来看,我已将其转发给从事这些工作的开发人员。