可以使用参数来设置组件的单位属性吗?

时间:2019-05-15 17:20:55

标签: runtime-error modelica openmodelica systemmodeler

到目前为止,使用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

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

尝试在OpenModelica [OMEdit v。1.13.2(64位)]中模拟上述模型会显示:

  

SimCodeUtil.mo:8492:9-8492:218]:内部错误意外的表达式(应该早些处理,可能在前端处理。Unit / displayUnit表达式不是字符串文字:c.hasUnit

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

编辑:从answer to an older question of mine开始,我相信至少可以使用final参数来设置单位属性。最终进行修改(例如c( final hasUnit = "myUnit" )不能解决问题。

1 个答案:

答案 0 :(得分:0)

来自Wolfram MathCore的某人给了我feedback on Wolfram Community,关于这个问题:

  

您是正确的,因为它没有违反规范,   尽管将其设为常量会更有意义,因为您会   如果允许您更改,则使所有静态单元检查无效   建立模拟后的单元。我们在   规范Modelica Specification Issue # 2362)。

因此,在提出他们已经实施的Modelica规格更改方面,MatheCore比游戏早了。 ;-)

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

作为一种变通方法,用于设置unit属性的变量应该具有恒定 可变性,但是仍然可以通过包含在用户对话框中来使用{ {1}}。