可以使用 inner/outer 全局设置类型并且可以替换吗?

Can a type be set globally using inner/outer and be replaceable?

问题描述

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

因此,在编写一个库时,我希望用户选择一个名为 ModelTime 的全局 type,理想情况下它会被声明为 innerreplaceable在一些顶级 class。然后模型中的任何组件都可以使用全局 type 来一致地处理任何与时间相关的变量。

最小示例

下面的例子展示了我想如何实现它。

代码如下:

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 中没有使用重新声明的类型。

我可以做些什么来实现我想做的事情?

我从 Wolfram MathCore 的某个人(System Modeler 的开发人员)那里收到了一些 feedback on Wolfram Community

The behavior you see for MinimalExample.example and MinimalLibrary.Example are bugs, and from what I can see they should work, I have forwarded them to a developer working on these things.