使用前缀常量或参数进行结构选择?

jan*_*ter 4 graphical-interaction modelica openmodelica

我尝试制作适用于不同平台的 Modelica 库代码。

我理解使用前缀“constant”是为了保护参数在编译后不被用户交互更改。如果您想允许更改,请使用前缀“参数”。

结构参数,例如水箱入口的数量,您可以自然地声明为

constant integer n_inlets = 1;
Run Code Online (Sandbox Code Playgroud)

当需要配置带有 n_inlets 的组件槽时,您可以编写代码

Tank tank(n_inlets=0);
Run Code Online (Sandbox Code Playgroud)

如果您决定水箱不应有任何入口。然后,编译后 n_inlets 被保护保持为 0,并且任何用户交互都不会改变它。

但是,如果你喜欢使用GUI来配置坦克,那么我认为你必须声明n_inlets作为参数,否则交互菜单将不会包含n_inlets。至少在 OpenModelica 中是这种情况,我猜其他 Modelica 实现中的 GUI 也是类似的。

配置完成后,我仍然希望保护 n_inlets 免受编译后后续用户交互的影响。有没有办法以这种方式编写代码?

Han*_*son 5

对于 Modelica 3.7,这一点已得到澄清,您可以将其声明为可评估参数https://specation.modelica.org/master/class-predefined-types-and-declarations.html#component-variability

parameter integer n_inlets = 1 annotation(Evaluate=true);
Run Code Online (Sandbox Code Playgroud)

可评估的参数应该在翻译之前设置,但不能在翻译之后设置。(实际上,将其用于数组大小也将强制进行评估。)

即使在 Modelica 3.7 之前,它也可以工作,并表明意图。

补充:但是,如果n_inlets给出连接器数组的大小,您应该使用connectorSizing而不是https://specation.modelica.org/master/annotations.html#connector-sizing。该参数应在连接时自动更新,并且不会出现在参数对话框中。