Modelica 使用sample()函数时无法为数组赋值

Modelica 使用sample()函数时无法为数组赋值,modelica,openmodelica,Modelica,Openmodelica,我正在尝试自己实现DFT,因为OpenModelica中的FFT示例不适合我,我不知道为什么。 但我已经陷入了采样正弦函数并将采样值分配给缓冲区数组的困境。 这就是为什么我试图让它变得更简单,只给仍然不起作用的数组分配一个计数器变量“iTick”。 请参见基本示例 有人能告诉我为什么这不起作用,以及我如何在使用sample()函数时实际为数组赋值吗 block DFT import Modelica.Constants.pi; parameter Integer N = 360 "To

我正在尝试自己实现DFT,因为OpenModelica中的FFT示例不适合我,我不知道为什么。 但我已经陷入了采样正弦函数并将采样值分配给缓冲区数组的困境。 这就是为什么我试图让它变得更简单,只给仍然不起作用的数组分配一个计数器变量“iTick”。 请参见基本示例

有人能告诉我为什么这不起作用,以及我如何在使用sample()函数时实际为数组赋值吗

block DFT
  import Modelica.Constants.pi;

  parameter Integer N = 360 "Total number of samples";

  Integer iTick;
  Real y_buf[N];


algorithm

when sample(0, 0.1) then     
  iTick :=iTick + 1;

  if iTick >= 1 and iTick <= N then
    y_buf[iTick] := iTick;
  end if;
end when;

end DFT;
一旦初始化
iTick
y\u buf
,您的“符号警告”就会消失。但是,代码仍然不起作用。OpenModelica模拟了它,但是
y\u buf
的项永远不会更新

此问题可能与
delay
运算符未在算法部分工作的问题有关。因此,我建议采取类似的解决方法:尽量避免使用算法部分。通过等式部分和适当的初始化,您的最小示例可以如下所示:

block DFT
  import Modelica.Constants.pi;

  parameter Integer N = 360 "Total number of samples";

  Integer iTick(start=0, fixed=true);
  Real y_buf[N](start=fill(0, N), fixed=fill(true, N));

equation 

  when sample(0, 0.1) then
    iTick = pre(iTick) + 1;
  end when;

  for i in 1:N loop
    when iTick >= i then
      y_buf[i] =  iTick;
    end when;
  end for;

end DFT;
一旦初始化
iTick
y\u buf
,您的“符号警告”就会消失。但是,代码仍然不起作用。OpenModelica模拟了它,但是
y\u buf
的项永远不会更新

此问题可能与
delay
运算符未在算法部分工作的问题有关。因此,我建议采取类似的解决方法:尽量避免使用算法部分。通过等式部分和适当的初始化,您的最小示例可以如下所示:

block DFT
  import Modelica.Constants.pi;

  parameter Integer N = 360 "Total number of samples";

  Integer iTick(start=0, fixed=true);
  Real y_buf[N](start=fill(0, N), fixed=fill(true, N));

equation 

  when sample(0, 0.1) then
    iTick = pre(iTick) + 1;
  end when;

  for i in 1:N loop
    when iTick >= i then
      y_buf[i] =  iTick;
    end when;
  end for;

end DFT;

经过长时间的搜索和尝试,我发现神奇的单词“离散”解决了我的问题!我还无法解释原因,但请参见下面的工作示例:

model Test
  import Modelica.Constants.pi;

  parameter Integer N = 360 "Total number of samples";

  Integer iTick(start=0, fixed=true);
  discrete Real y_buf[N](start=fill(0,N), fixed=fill(true, N));


algorithm

when sample(0, 0.1) then     
  iTick :=iTick + 1;

  if iTick >= 1 and iTick <= N then
    y_buf[iTick] := iTick;
  end if;
end when;
end Test;
模型试验
导入Modelica.Constants.pi;
参数整数N=360“样本总数”;
整数iTick(开始=0,固定=true);
离散实y_buf[N](开始=填充(0,N),固定=填充(真,N));
算法
当样本为(0,0.1)时
iTick:=iTick+1;

如果iTick>=1且iTick经过长时间的搜索和尝试,我发现神奇的单词“离散”解决了我的问题!我还无法解释原因,但请参见下面的工作示例:

model Test
  import Modelica.Constants.pi;

  parameter Integer N = 360 "Total number of samples";

  Integer iTick(start=0, fixed=true);
  discrete Real y_buf[N](start=fill(0,N), fixed=fill(true, N));


algorithm

when sample(0, 0.1) then     
  iTick :=iTick + 1;

  if iTick >= 1 and iTick <= N then
    y_buf[iTick] := iTick;
  end if;
end when;
end Test;
模型试验
导入Modelica.Constants.pi;
参数整数N=360“样本总数”;
整数iTick(开始=0,固定=true);
离散实y_buf[N](开始=填充(0,N),固定=填充(真,N));
算法
当样本为(0,0.1)时
iTick:=iTick+1;

如果iTick>=1,并且iTick您的代码在Dymola 2020中运行良好,那么这似乎与该工具相关……您的代码在Dymola 2020中运行良好,因此这似乎与该工具相关……非常感谢marco!不幸的是,这个问题与OpenModelica有关,因为我必须使用它。你的答案对我来说还是有点奇怪,因为我只习惯于编程语言,但它确实有效!Modelica模型可以有方程部分和算法部分。算法部分的代码是“按原样”执行的,就像其他编程语言一样,自上而下执行。方程部分使您能够定义数学方程,如果需要,Modelica工具将重新排列这些方程。因此,在方程部分中,方程的因果关系及其执行顺序在模型转换之前是未知的。在许多书籍和一些免费提供的教程中都有列出,它们应该解释Modelica的这些基本概念。非常感谢marco!不幸的是,这个问题与OpenModelica有关,因为我必须使用它。你的答案对我来说还是有点奇怪,因为我只习惯于编程语言,但它确实有效!Modelica模型可以有方程部分和算法部分。算法部分的代码是“按原样”执行的,就像其他编程语言一样,自上而下执行。方程部分使您能够定义数学方程,如果需要,Modelica工具将重新排列这些方程。因此,在方程部分中,方程的因果关系及其执行顺序在模型转换之前是未知的。在许多书籍和一些免费提供的教程中都有列出,它们应该解释Modelica的这些基本概念。很好!肯定比我的答案好。我猜Dymola会在必要时自动将变量声明为离散变量,因此这可能就是您问题中的代码仅在Dymola中工作,而在OpenModelica中不工作的原因。很好!肯定比我的答案好。我猜Dymola会在必要时自动将变量声明为离散变量,因此这可能就是您问题中的代码仅在Dymola中工作,而在OpenModelica中不工作的原因。