【问题标题】:Modelica - Increment doesn't follow conditionsModelica - 增量不遵循条件
【发布时间】:2015-02-06 18:18:52
【问题描述】:

我正在 Wolfram System Modeler 中创建 Max Per Interval 块。

为了便于解释,我只是将 Max 值设置为 10。

block HighWaterMarkPerInterval
  extends Modelica.Blocks.Interfaces.SISO;
protected
  Integer index;
  Real currentMax;
  Real endTimes[1, 45] = [30812532.2, 32037805, 33265581.8, 34493233.8, 35720861.5, 36948483, 38176307.7, 39426940.6, 40654485.4, 41882212.1, 43109672.7, 44337076, 45564265.7, 46793039.6, 48045130.9, 50749960.3, 52040090.6, 53558507.7, 54814537.3, 56331978.2, 57587753.3, 59105952.9, 60362517.8, 61879307.8, 63136031.5, 64363411.4, 65590464.3, 67738027.40000001, 84725789.8, 87831338.09999999, 89030965.40000001, 90258821.8, 91486663.5, 92714210.3, 93941727.7, 95166770.3, 97283519, 99434222.90000001, 100658067.1, 102807019, 104030032.7, 106179193, 107402090, 109550214.2, 110771545.3];
algorithm
  if endTimes[1, index] < time then
    index := pre(index) + 1;
    currentMax := 0;
  else
    currentMax := 10; // Constant to until I get logic working
  end if;
initial algorithm
  index := 0;
equation
  y = currentMax;
end HighWaterMarkPerInterval;

运行时,索引立即增加到无穷大。我觉得我的逻辑有问题,但我想不通。

该代码应该检查我们是否仍处于间隔时间,当我们越过下一个间隔时间时,它会将“currentMax”值设置为零。这将重置我在另一个块中实现的最大值。

任何帮助将不胜感激。谢谢。

编辑:代码部分表单示例。

model HighWaterMarkPerInterval
  annotation(Diagram(coordinateSystem(extent = {{-148.5, -105}, {148.5, 105}}, preserveAspectRatio = true, initialScale = 0.1, grid = {5, 5})));
  extends Modelica.Blocks.Interfaces.SISO;
  Modelica.Blocks.Math.Max maxblock(u1 = currentMax, u2 = u);
  Real flybyEnds[1, 45] = [30813151,32038322,33266015, truncated for space saving...];
  Integer index;
  Real currentMax;
initial equation
  index = 1;
  currentMax = 0;  
algorithm
  // When we are in the interval continually grab max block output and output currentMax
  when {time>=flybyEnds[1, index-1], time <=flybyEnds[1,index]} then 
    currentMax := pre(maxblock.y);
    y := currentMax;
  end when;
  // When we move to the next interval reset current max and move to the next interval
  when time > flybyEnds[1, index] then
    currentMax := 0;
    index := pre(index) + 1;
  end when;
end HighWaterMarkPerInterval;

【问题讨论】:

    标签: modelica systemmodeler


    【解决方案1】:

    您需要使用when,而不是if。您可以在Modelica by Example 中找到有关两者以及它们之间差异的讨论。

    herehere 上也讨论了这个问题。

    这是一个例子(完全未经测试,但它显示了基本思想):

    model HighWaterMarkPerInterval
      extends Modelica.Blocks.Interfaces.SISO;
      parameter Modelica.SIunits.Time sample_rate=3600;
      Real flybyEnds[45] = {30813151,32038322,33266015,...};
      Integer index;
      Real currentMax;
    initial algorithm
      // Specify the first time we are interested in...
      index := 1;
    algorithm 
      // At the start of the simulation, the initial max for the current
      // interval [0,30813151] is whatever u is.  The initial output value
      // is also the initial value for u
      when initial() then
        currentMax := u
        y := u;
      end when;
    
      // Check at some sample rate (faster than the flyby interval!)
      // if u > currentMax...
      when sample(sample_rate, sample_rate) then
        // New currentMax is the larger of either currentMax or u
        // when the sample took place
        currentMax := max(pre(currentMax), pre(u));
      end when;
    
      // At the end of the "flyby", record the maximum found since
      // the last flyby and specify the next flyby index.
      when time>=flybyEnd[index] then
        // New output is the value of currentMax from this interval
        y := pre(currentMax);
        // Now reset currentMax
        currentMax := pre(u);
        // Increment index up to the length of flybyEnd
        index := min(pre(index)+1, size(flybyEnd,1));
      end when;
    end HighWaterMarkPerInterval;
    

    【讨论】:

    • 我过去曾尝试实现when,但我不知道如何使用 when 功能重置它。如果它理解正确,我将需要 when-else 语句的功能来做我想做的事情。
    • 你能解释一下“重置”是什么意思吗?
    • 是的,对不起。 currentMax 应该在每个 endTime 处重置。我正在尝试计算每个间隔的currentMax 值,而不是整个模拟的高水位线。 endTimes 对应区间结束时间。
    • 你应该看看this example。我认为它会解释你想做的一切。它计算给定时间间隔内轴的旋转次数以估计速度。看起来和你想做的很相似。
    • 这里你不理解sample的用法。它并不意味着捕获飞越间隔。它的目的是在飞越间隔进行采样。您正在尝试记录极值,但无法明确检测到该极值。因此sample 用于检查当前值是否大于当前飞行间隔中的任何先前采样 值。该检查使用sample 完成,因为它不能在Modelica 中“连续”完成。所以采样周期必须比飞越间隔短得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多