【发布时间】:2019-05-15 17:20:54
【问题描述】:
到目前为止,使用 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
(注意:错误是由 Mathematica 12.0 中的 WSMLink'WSMSimulate 给出的,它在内部运行 System Modeler 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 中运行而没有任何错误)?
编辑:从answer to an older question of mine 开始,我相信至少可以使用最终参数来设置单位属性。进行最终修改(例如 c( final hasUnit = "myUnit" ) 不能解决问题。
【问题讨论】:
-
只使用“模型中心”和“模拟中心”是否模拟。
WSMLink'WSMSimulate听起来像是与 Matematica 功能相关的东西。 -
@jrhodin 我已经删除了 WSM 12.0,但是当我安装它时,它不会只使用“模型中心”和“模拟中心”在那里编译。我认为至少可以使用“最终”参数来设置单位属性...
-
这在 Dymola 中有效,即使在迂腐模式下(更严格地检查代码是否符合 Modelica 规范)。
-
使用
constant而不是parameter有区别吗? -
是的,参数会更好,并且应该可以工作,但至少你现在有一个解决方法。您也可以使用
replaceable constant并在实例化期间设置单位。
标签: runtime-error modelica openmodelica systemmodeler