Описание проблемы
Я хотел бы использовать не-SI-единицы для времени в экономическом моделировании (например, System Dynamics). Хотя, конечно, я мог бы пойти на секунды ( s ) и затем использовать displayUnit
, насколько мне известно, нет хорошего способа изменить displayUnit для время в System Modeler, которое я в основном использую.
Итак, при написании библиотеки я бы хотел, чтобы пользователь выбрал глобальный type
с именем ModelTime
, который в идеале должен быть объявлен как inner
и replaceable
в некотором классе верхнего уровня. Тогда любой компонент в модели может использовать глобальный type
для последовательной обработки любых связанных со временем переменных.
Минимальный пример
Следующий пример показывает, как я хотел бы реализовать это.
package Units
объявляет два типа единиц не-SI (Time_year
, Time_month
)
package Interfaces
содержит частичный класс модели GenericSimulationModel
, который будет областью верхнего уровня для любой модели, написанной с использованием библиотеки. Предполагается предоставить type ModelTime
как inner
и replaceable
класс
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, к сожалению, это не сработает: объявленный тип не используется в компоненте c в приведенной выше модели Example
.
Что я могу сделать, чтобы достичь того, что я хочу сделать?