主要内容

以结构格式记录状态

使用结构格式可以提供优于数组格式。方法记录状态时数组格式,状态的顺序沿列在记录的数组取决于块排序的顺序。各种因素可以影响块排序顺序,这可以改变状态的顺序从一个模拟到下一个。当你使用结构格式中,块名与该块的记录状态数据一起存储,因此您可以在不考虑块排序顺序的情况下处理数据。

以数组格式记录状态

方法记录状态时数组格式,记录的数据存储在一个数组中N列,N状态数,和行,每个模拟时间步骤一个。这种m × n矩阵形式很容易在MATLAB®中操作。但是,状态变量沿记录矩阵列的顺序取决于块排序顺序。因此,任何期望模型中块的状态与状态矩阵列之间有固定映射的MATLAB代码,在由于模型的变化而导致块排序顺序发生变化时,都容易出现破坏。

例如,考虑模型sldemo_state_logging1而且sldemo_state_logging2

mdl1 =“sldemo_state_logging1”;mdl2 =“sldemo_state_logging2”;open_system (mdl1);open_system (mdl2);

这两个模型包含相同的块,以相同的方式连接。唯一的区别是输出端口的顺序。方法模拟模型并记录状态数组格式。

simOut1 = sim(mdl1,“SaveFormat”“数组”);simOut2 = sim(mdl2,“SaveFormat”“数组”);

提取状态向量金宝app仿真软件。SimulationOutput对象,其中包含模拟中记录的所有数据。

x1 = simOut1.get(“xout”);x2 = simOut2.get(“xout”);

的日志状态数据x1而且x2是不同的,因为块的顺序不同,所以日志数组中的列与模型中的块之间的映射是不同的。

isequal (x1, x2)
Ans =逻辑0

使用结构格式记录状态

再次模拟模型,但这次以结构格式记录状态。

simOut1 = sim (mdl1,“SaveFormat”“结构”);simOut2 = sim (mdl2,“SaveFormat”“结构”);

从中提取包含记录状态的结构SimulationOutput对象。

x1s = simOut1.get(“xout”);x2s = simOut2.get(“xout”);

显示这些结构,其中包含两个字段:时间而且信号.的时间字段为空,因为数据是使用结构格式,而不是StructureWithTime格式。您可以使用StructureWithTime当您需要保存时间数据和状态数据时格式化。

disp (x1);disp (x2);
Time: [] signals: [1x2 struct] Time: [] signals: [1x2 struct]

结构信号Field是一个结构数组,模型中每个具有状态数据的块都有一个结构。中的每个块数据结构信号字段包含字段的状态数据和blockName字段,其中包含产生该状态数据的块的名称。可以将状态数据提取到一个可以处理的矩阵中,处理方法类似于使用数组格式。

要修复状态排序问题,首先使用块名称将状态数据按固定顺序排序。例如,您可以对状态数据进行排序,以便块按照字母顺序排列,无论块排序顺序如何,从一个模拟到下一个模拟都保持相同。

[~, idx1] = sort({x1s.signals.blockName});X1 = [X1 .signals(idx1).values];[~, idx2] = sort({x2s.signals.blockName});X2 = [x2s.signals(idx2).values];isequal (x1, x2)
Ans =逻辑1

在按块名的字母顺序重新对信号字段进行排序之后,如果以相同的顺序提取值字段数据,则可以像使用数组格式,但是块状态数据的顺序从一个模拟到下一个模拟不会改变。