在 simulink 中对查找 table 进行建模,它应该通过 quires w.r.t 时间并且还能够仅在特定时间段内获得结果

Modeling a lookup table in simulink, which should pass the quires w.r.t time and also be able to get results only for certain time periods

我要查找的数据 table 如下图所示。假设第一列是我的断点 1,第一行是断点 2,其他单元格是我的 table 数据。

假设我想传递以下 x,y 个值 w.r.t 我希望模型只计算其中的几个(例如,我只想计算 x,y 的 4-7 个值)

通过以上 x,y 值后我的输出文件是

我想为每个时间步传递数据点,而不是像所有时间步长的所有数据点一样

如果我们查看子系统的输出文件,结果将添加到先前的数据点。

它实际上应该在一个时间步只传递一个数据点,结果应该添加到前一个数据点的值。

我做了一些解决你的问题的方法,这里是我的方法:

首先让我们看看如何只计算特定间隔的总和。我建议使用 Enabled subsystem block。它只有在被信号激活时才起作用。为您的时间间隔发出特定信号很容易。有很多方法。比如你可以这样走:

10.5 是您的时间间隔限制。 现在只有我们这个时间子系统会工作并汇总您的数据。子系统:


我检查了你的数据:

 xy_data =

 1   650    50
 2   675    70
 3   700    90
 4   725   110
 5   750   130
 6   775   150
 7   800   170
 8   825   190
 9   850   210
10   875   230

查找中的数据table:

我得到结果 228。 (您可以在 Display2 into Subsystem 处看到结果)。 我一步一步地检查它,看起来它工作正常(它真的接近 table 值!)。

要在每个时间步获取 z 的值,只需在查找 table 之后添加 to workspace 块,如下所示:

现在,如果您计算 4-5 秒的总和,您将得到我的结果 228(实际上是 227.9903 - 它只是四舍五入)。 为什么我在这里放置 Unit Delay 块:计算 SUM 是必要的 - 要获得总和,您需要获取当前值并添加到上一步的总和。要从上一步获取信号值,您必须使用单位延迟。


关于时间步长的第二个问题。如果您不想手动更改它,可以通过工作区中的一些 MATLAB 命令来完成。例如,您可以编写脚本,并仅更改其中的时间步长值。

mdl = 'NameOfSimulinkModel'           %your model name
open_system(mdl);                     % open it in visible mode
configSet = getActiveConfigSet(mdl)   % load all parameters of model
s = configSet.getComponent('Solver')  % get handle at Solver parameters

s.getProp('FixedStep')                % get current step value
s.setProp('FixedStep', '0.1')         % set needed value
sim(mdl)                              % start simulation in Simulink

所以你看到你的数据,计算所需的时间步长值,从命令Window设置它并开始模拟。

希望对您有所帮助! 这是我模型的最新版本:here.