3

到目前为止,使用 Wolfram System Modeler 4.3 和 5.1 可以编译以下最小示例而不会出现错误:

model UnitErrorModel
    MyComponent c( hasUnit = "myUnit" );

    block MyComponent
        parameter String hasUnit = "1";
        output Real y( unit = hasUnit );
    equation
        y = 10;
    end MyComponent;

end UnitErrorModel;

但是随着 WSM 12.0 的新版本(版本的跳跃是由于与 Wolfram 的旗舰 Mathematica 的当前版本保持一致),我收到一条错误消息:

内部错误:Codegen.getValueString:非常量表达式:c.hasUnit

(注意:该错误是WSMLink'WSMSimulate在内部运行 System Modeler 12.0 的 Mathematica 12.0 中给出的;这里询问"InternalValues"上述模型的属性,因为我现在还没有安装 WSM 12.0)。

尝试在 OpenModelica [OMEdit v. 1.13.2 (64-bit)] 中模拟上述模型显示:

SimCodeUtil.mo: 8492:9-8492:218]: Internal error Unexpected expression (应该更早处理,可能在前端。Unit/displayUnit 表达式不是字符串文字:c.hasUnit

所以似乎设置单位属性我不能使用具有参数可变性的变量?为什么会这样 - 毕竟编译器在编译运行时可以硬连线单元就足够了(毕竟给定的模型将在 WSM 4.3 和 5.1 中运行而没有任何错误)?

编辑:从我的一个较旧问题的答案中,我相信至少可以使用最终参数来设置单位属性。进行最终修改(例如c( final hasUnit = "myUnit" ),不能解决问题。

4

1 回答 1

0

Wolfram MathCore 的某个人就这个问题向我提供了关于 Wolfram 社区的反馈:

您是正确的,因为它不违反规范,尽管将其设为常量更有意义,因为如果您在构建模拟后被允许更改单位,您将使所有静态单位检查无效。我们就这方面的规范提交了一个问题Modelica Specification Issue # 2362)。

因此,MatheCore在提出他们已经实施的 Modelica 规范更改方面有点领先。;-)

注意:在 Wolfram System Modeler (12.0) 中使用注释Evaluate = true不会解决问题(参见上面@matth 的评论)。

作为一种解决方法,用于设置unit属性的变量应该具有恒定的 可变性,但仍然可以通过包含在用户对话框中以使用annotation(Dialog(group = "GroupName")).

于 2019-07-03T16:58:48.960 回答