Modelica编码标准/Modelica When语句

Modelica编码标准/Modelica When语句,modelica,openmodelica,Modelica,Openmodelica,大家好, 2020年新年快乐 我正在64位windows 7系统上使用Openmodelica 1.14发行版 我在OMSimulator中的“when”语句中遇到了一些问题。在寻找解决方案时,我遇到了一个问题。我仍然可以在Openmodelica的当前发布版本中看到报告的问题 我包括2664号机票的相关文件 SimpleTest.mo是否符合Modelica标准 编译SimpleTest.mo时,会抛出翻译警告 Assuming fixed start value for the follow

大家好,

2020年新年快乐

我正在64位windows 7系统上使用Openmodelica 1.14发行版

我在OMSimulator中的“when”语句中遇到了一些问题。在寻找解决方案时,我遇到了一个问题。我仍然可以在Openmodelica的当前发布版本中看到报告的问题

我包括2664号机票的相关文件

SimpleTest.mo
是否符合Modelica标准

编译
SimpleTest.mo
时,会抛出翻译警告

Assuming fixed start value for the following 1 variables:
         y:DISCRETE(flow=false fixed = false ) SimpleTest type: Integer

如何避免此错误?

这只是一个警告。当您定义这样的离散变量时,它取决于When条件下的前一个值,它必须有一个固定的起始值。仅仅提供一个起始值对编译器来说是一个猜测值,当您修复它时,您会告诉编译器它必须使用这个值进行初始化

如果不提供起始值,它将设置为零;如果不修复,编译器将自动修复它(导致警告)

简单的例子:

Integer y(start=0, fixed=true);
应用于您的模型:

model SimpleTest "just a simple model - Compilation etc."
  Modelica.Blocks.Interfaces.IntegerInput u annotation(Placement(visible = true, transformation(origin = {-100, 40}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-80, 40}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Blocks.Interfaces.IntegerOutput y(start=0, fixed=true) annotation(Placement(visible = true, transformation(origin = {100, 20}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 20}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
algorithm
  when change(u) then
    y := y + 2;
  end when;
  annotation(Icon(coordinateSystem(extent = {{-100, -100}, {100, 100}}, preserveAspectRatio = true, initialScale = 0.1, grid = {2, 2})), Diagram(coordinateSystem(extent = {{-100, -100}, {100, 100}}, preserveAspectRatio = true, initialScale = 0.1, grid = {2, 2}), graphics = {Rectangle(origin = {-6.15, 2.93}, fillColor = {0, 133, 199}, fillPattern = FillPattern.HorizontalCylinder, extent = {{-77.89, 83.75}, {88.14, -92.53}})}));
end SimpleTest;

这只是一个警告。当您定义这样的离散变量时,它取决于When条件下的前一个值,它必须有一个固定的起始值。仅仅提供一个起始值对编译器来说是一个猜测值,当您修复它时,您会告诉编译器它必须使用这个值进行初始化

如果不提供起始值,它将设置为零;如果不修复,编译器将自动修复它(导致警告)

简单的例子:

Integer y(start=0, fixed=true);
应用于您的模型:

model SimpleTest "just a simple model - Compilation etc."
  Modelica.Blocks.Interfaces.IntegerInput u annotation(Placement(visible = true, transformation(origin = {-100, 40}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-80, 40}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Blocks.Interfaces.IntegerOutput y(start=0, fixed=true) annotation(Placement(visible = true, transformation(origin = {100, 20}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 20}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
algorithm
  when change(u) then
    y := y + 2;
  end when;
  annotation(Icon(coordinateSystem(extent = {{-100, -100}, {100, 100}}, preserveAspectRatio = true, initialScale = 0.1, grid = {2, 2})), Diagram(coordinateSystem(extent = {{-100, -100}, {100, 100}}, preserveAspectRatio = true, initialScale = 0.1, grid = {2, 2}), graphics = {Rectangle(origin = {-6.15, 2.93}, fillColor = {0, 133, 199}, fillPattern = FillPattern.HorizontalCylinder, extent = {{-77.89, 83.75}, {88.14, -92.53}})}));
end SimpleTest;

y(start=0,fixed=true)
消除翻译警告。when语句
y:=y+2
是有效的modelica代码吗?a对不起,我没有领会你的意思。在一个实际的算法中,如果它是在一个等式中,你需要声明
y=pre(y)+2
。正如一个小的澄清:在一个算法中,只允许赋值,这和在常规编程语言中一样有效。另一方面,等式可以重新排列,因此
y=y+2
无效,因为它表明
0=2
永远不可能为真。当和ìf语句出现在等式中时,您可以制定
,如果您这样做,您需要尊重这一点。
pre
运算符使用左极限值,即最后一个时间步长的值。一般来说,我希望尽可能多地使用公式,但尽量避免使用
pre
y(start=0,fixed=true)
消除了翻译警告。when语句
y:=y+2
是有效的modelica代码吗?a对不起,我没有领会你的意思。在一个实际的算法中,如果它是在一个等式中,你需要声明
y=pre(y)+2
。正如一个小的澄清:在一个算法中,只允许赋值,这和在常规编程语言中一样有效。另一方面,等式可以重新排列,因此
y=y+2
无效,因为它表明
0=2
永远不可能为真。当
和ìf语句出现在等式中时,您可以制定
,如果您这样做,您需要尊重这一点。
pre
运算符使用左极限值,即最后一个时间步长的值。一般来说,我更喜欢尽可能多地使用方程,但尽可能避免
pre