【问题标题】:Saving a specific simulation time节省特定的模拟时间
【发布时间】:2015-09-09 14:27:53
【问题描述】:

我有一个在 simulink 中实现的双轨模型。为了控制速度,我使用了 PID 控制器,因此速度的输出如下所示:

现在我想实现一个 MATLAB 函数或 simulink 块来跟踪速度达到稳态行为的时间并将其放入某种存储中。我尝试通过以下带有 MATLAB-function-block 的 MATLAB 函数来实现类似的功能:

function y = fcn(t,v,dv,tv)
  %#codegen
  if (v==tv+0.01) & (dv<0)
  y=t
end

t 是时钟信号,v 是速度,dv 是速度的一阶导数,tv 是目标速度。这个函数的问题是“在某些执行路径上没有定义y”。你有什么想法如何使这项工作?

【问题讨论】:

    标签: matlab storage simulink


    【解决方案1】:

    我在没有 MATLAB 函数的情况下使用 simulink 块 data store memory 及其 readwrite 块解决了这个问题。从右下角进来的信号是瞬时速度。 if 语句是

    (u1 >= 22.2) & (u1<=22.3) & (u2<0)
    

    由于 simulink 使用时间步长并且瞬时速度永远不会完全是 22.2,所以您不能使用 u1==22.2

    【讨论】:

      【解决方案2】:

      在 SimuLink 中,为您的函数添加第二个输出和第五个输入。然后使用该新输出作为函数的反馈。

      function [y, output] = fcn(t,v,dv,tv,input)
      y = 0;
      output = input;
      if (v == tv + 0.01) && (dv < 0)
          y = t;
          if (input == -1)
              output = t;
          end
      end
      

      output 附加到IC 块,在其中将input 初始值设置为-1 或您要使用的任何值。然后将IC 块附加到函数的inputoutput会通过功能不断反馈。一旦设置,它将永远重新获得它的价值。

      【讨论】:

      • 感谢您的努力,但同时我自己解决了这个问题。既然你的解决方案有效,我还是赞成!
      【解决方案3】:
      function y = fcn(t,v,dv,tv)
        %#codegen
      y = zeros(length(t),1); % Initialise the array
      for ii = 1:length(t)
        if (v==tv+0.01) & (dv<0)
        y(ii)=t;
        else
        y(ii)=0;
        end
      end
      y(y==0)=[];
      end
      

      两个变化:在y=t 之后添加一个分号以强制它在每次设置时都不打印它。其次,您的问题else y=[];,这意味着如果您不遵守if 声明,y 将是一个空矩阵。

      现在,每次您不遵守 if 声明时,它都会存储一个 0y(y==0)=[]; 行删除所有零,如果您希望 y 与输入变量的长度相同,请注释此行。

      function y = fcn(t,v,dv,tv)
        %#codegen
      y = zeros(length(t),1); % Initialise the array
      ii=1;
      while exist(t)
        if (v==tv+0.01) & (dv<0)
        y(ii)=t;
        else
        y(ii)=0;
        end
      ii = ii+1;
      end
      y(y==0)=[];
      end
      

      【讨论】:

      • 好吧,这是我问题的第一部分,但仍然没有解决。可能我说得不够清楚:我希望该函数能够记住 if 语句第一次为真的时间。但是如果我这样离开它,它将在每个模拟步骤上覆盖 y,因为在第一次之后 if 将始终为真。你也能解决这个问题吗?
      • 嗯,这对我来说看起来不错,但不幸的是不适用于 simulink。我认为这是因为 simulink 无法确定 t 的长度,或者 t 对于每个模拟步骤的长度始终为 1....错误说明:维度 2 固定在左侧,但在右侧变化([1 x 1] ~= [1 x :?])。函数 'Steuerung/MATLAB Function' (#194.168.169),第 10 行,第 1 列:“y”启动诊断报告。组件:MATLAB 函数 |类别:编码器错误
      • 啊,这确实有问题。让我看看我是否可以实现while 循环代码。完成,虽然我不确定这是否真的有效。这是一个有趣的问题。
      • 不幸的是,exist-function 不适用于 simulink,我已经尝试过。
      • 好的,我现在在 simulink 本身中找到了一个没有 matlab 函数的问题的解决方案。如果您对解决方案感兴趣,请告诉我,我会添加答案。无论如何,感谢您的努力和兴趣!
      猜你喜欢
      • 2016-11-21
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2017-04-18
      相关资源
      最近更新 更多