到目前为止,使用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" )
不能解决问题。
答案 0 :(得分:0)
来自Wolfram MathCore的某人给了我feedback on Wolfram Community,关于这个问题:
您是正确的,因为它没有违反规范, 尽管将其设为常量会更有意义,因为您会 如果允许您更改,则使所有静态单元检查无效 建立模拟后的单元。我们在 规范(Modelica Specification Issue # 2362)。
因此,在提出他们已经实施的Modelica规格更改方面,MatheCore比游戏早了。 ;-)
注意:在Wolfram System Modeler(12.0)中,使用注释Evaluate = true
不能解决问题(请参见上面@matth的注释)。
作为一种变通方法,用于设置unit
属性的变量应该具有恒定 可变性,但是仍然可以通过包含在用户对话框中来使用{ {1}}。