到目前为止,使用WolframSystemModeler4.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:非常量expression:c.hasUnit
(注意:这个错误是由WSMLink'WSMSimulate在内运行的SystemModeler12.0中给出的;这里询问上述模型的"InternalValues"属性,因为我现在还没有安装WSM12.0)。
在“OpenModelica OMEdit v. 1.13.2 (64位)”中,试图模拟上述模型表明:
SimCodeUtil.mo: 8492:9-8492:218]:内部错误意外表达式(应该更早地处理,可能在前端。Unit/displayUnit表达式不是字符串文本: c.hasUnit
因此,似乎要设置单元属性,我不能使用具有参数可变性的变量?为什么编译器在为运行时编译时不能硬连接单元(毕竟给定的模型将在WSM 4.3和5.1中没有任何错误地运行)?
编辑:从对我一个老问题的回答中,我认为至少可以使用最终的参数来设置单元属性。使修改成为最终结果(例如,c( final hasUnit = "myUnit" )不能解决问题。
发布于 2019-07-03 16:58:48
关于这个问题,来自Wolfram MathCore的人给了我一个MathCore:
您是正确的,因为它不违反规范,尽管使其成为常量更有意义,因为您将使所有静态单元检查无效,如果允许您在构建模拟之后更改单元。我们就这个规范(Modelica规范问题# 2362)提出了一个问题。
因此,MatheCore在提出他们已经实现的Modelica规范更改方面有点超前。;-)
注意:在Wolfram (12.0)中,使用注释Evaluate = true不会解决问题(cf )。上面@matth的评论。
作为一种变通方法,用于设置unit属性的变量应该具有常量可变性,但是可以通过用户对话框中包含的变量使用annotation(Dialog(group = "GroupName"))进行交互更改。
https://stackoverflow.com/questions/56154630
复制相似问题