以结构格式记录状态
使用结构
格式可以提供优于数组
格式。方法记录状态时数组
格式,状态的顺序沿列在记录的数组取决于块排序的顺序。各种因素可以影响块排序顺序,这可以改变状态的顺序从一个模拟到下一个。当你使用结构
格式中,块名与该块的记录状态数据一起存储,因此您可以在不考虑块排序顺序的情况下处理数据。
以数组格式记录状态
方法记录状态时数组
格式,记录的数据存储在一个数组中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
在按块名的字母顺序重新对信号字段进行排序之后,如果以相同的顺序提取值字段数据,则可以像使用数组
格式,但是块状态数据的顺序从一个模拟到下一个模拟不会改变。