OpenModelica中的可变采样频率

OpenModelica中的可变采样频率,modelica,openmodelica,Modelica,Openmodelica,我指的是这个帖子: 我想测量一个RMS值或一个具有可变采样频率的平均值,我可以将其作为输入信号输入 建议的方法几乎符合我的需要,如下所示: model RMS constant Real f_max = 2*2*asin(1.0); constant Real f = 1+abs(2*asin(time)); Real signal = sin(time); Real rms = if time < f then (if time < 1e-10 then signa

我指的是这个帖子:

我想测量一个RMS值或一个具有可变采样频率的平均值,我可以将其作为输入信号输入

建议的方法几乎符合我的需要,如下所示:

model RMS
  constant Real f_max = 2*2*asin(1.0);
  constant Real f = 1+abs(2*asin(time));
  Real signal = sin(time);
  Real rms = if time < f then (if time < 1e-10 then signal else sqrt(i_sq / time)) else sqrt(i_sq_f / f);
  Real i_sq(start=0, fixed=true);
  Real i_sq_f = i_sq - delay(i_sq, f, f_max);
equation
  der(i_sq) = signal^2;
end RMS;
这一个抛出了一个错误:可变性常数的分量f具有绑定1.0+abs2.0*作为更高可变性变量的时间


有没有办法解决这个问题并将频率作为实际输入值输入?

代码的主要问题是,时间是一个变量,意味着它会随着时间的推移而改变其值。这对应于第3.8章中的连续时间表达式。变量只能分配给具有相同或更高可变性的变量。因此,不可能将从时间计算的某个值指定为常数,因为结果将不是常数。因此,去掉f定义中的常数将解决这个问题

将常量替换为f定义中的输入将使工具期望从外部提供f。或者,您可以使用Modelica.Blocks.Interfaces.RealInput

而且f_max听起来更像一个参数而不是常数


此外,如果时间大于1,则“asintime”将出现问题。但这是另一回事……

代码的主要问题是,时间是一个变量,意味着它随时间而改变其值。这对应于第3.8章中的连续时间表达式。变量只能分配给具有相同或更高可变性的变量。因此,不可能将从时间计算的某个值指定为常数,因为结果将不是常数。因此,去掉f定义中的常数将解决这个问题

将常量替换为f定义中的输入将使工具期望从外部提供f。或者,您可以使用Modelica.Blocks.Interfaces.RealInput

而且f_max听起来更像一个参数而不是常数

此外,如果时间大于1,则“asintime”将出现问题。但这是另一回事……

f的表达式是时变的,但f被声明为常数

简单地替换常量实f=。。。输入实数f=。。。。然后,如果愿意,可以从模型外部指定f。

f的表达式是时变的,但f声明为常量


简单地替换常量实f=。。。输入实数f=。。。。然后,如果愿意,可以从模型外部指定f。

找到了解决方案,上面的示例中出现了一些问题。一个具有常数实f,一个具有常数实f_max,在需要时间差的位置,使用频率代替

下面是一个工作块

model RMS
  constant Real f_max = 10000;
Modelica.Blocks.Interfaces.RealInput f annotation(
    Placement(visible = true, transformation(origin = {0, 106}, extent = {{-20, -20}, {20, 20}}, rotation = -90), iconTransformation(origin = {0, 106}, extent = {{-20, -20}, {20, 20}}, rotation = -90))); 
 Modelica.Blocks.Interfaces.RealInput signal annotation(
    Placement(visible = true, transformation(origin = {-108, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-108, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
  Real dt = 1/f;
  Real rms = if time < dt then (if time < 1e-10 then signal else sqrt(i_sq / time)) else sqrt(i_sq_f / dt);
  Real i_sq(start=0, fixed=true);  
  Real testi = delay(i_sq, dt, f_max);
  Real i_sq_f = i_sq - delay(i_sq, dt, f_max);
Modelica.Blocks.Interfaces.RealOutput y annotation(
    Placement(visible = true, transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
  der(i_sq) = signal^2;
  y = rms;
end RMS;


编辑:模拟步长必须大于第一个if条件下的时间。否则,此程序仍可能抛出错误除以0。找到解决方案后,上面的示例中出现了一些问题。一个具有常数实f,一个具有常数实f_max,在需要时间差的位置,使用频率代替

下面是一个工作块

model RMS
  constant Real f_max = 10000;
Modelica.Blocks.Interfaces.RealInput f annotation(
    Placement(visible = true, transformation(origin = {0, 106}, extent = {{-20, -20}, {20, 20}}, rotation = -90), iconTransformation(origin = {0, 106}, extent = {{-20, -20}, {20, 20}}, rotation = -90))); 
 Modelica.Blocks.Interfaces.RealInput signal annotation(
    Placement(visible = true, transformation(origin = {-108, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-108, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
  Real dt = 1/f;
  Real rms = if time < dt then (if time < 1e-10 then signal else sqrt(i_sq / time)) else sqrt(i_sq_f / dt);
  Real i_sq(start=0, fixed=true);  
  Real testi = delay(i_sq, dt, f_max);
  Real i_sq_f = i_sq - delay(i_sq, dt, f_max);
Modelica.Blocks.Interfaces.RealOutput y annotation(
    Placement(visible = true, transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
  der(i_sq) = signal^2;
  y = rms;
end RMS;

编辑:模拟步长必须大于第一个if条件下的时间。否则,此程序仍可能抛出错误除以0