此示例显示了如何以结构格式的Simulink®模型的记录状态轨迹如何优于以阵列格式记录状态的传统方法。金宝app沿着记录矩阵中的列的状态排序取决于块排序顺序,Simulink软件在模型编译期间确定。金宝app各种因素可以影响块排序顺序,这可以改变州的排序。
此示例说明了如何在结构格式中记录状态,该结构格式将块名与状态轨迹存储,可以帮助防止状态排序问题。
默认情况下,Simulink软件金宝app以阵列格式记录状态轨迹,这是一个带有n列的矩阵,其中n是状态的数量。矩阵具有M行,每行对应于单个仿真时间步长。此MY-N矩阵形式易于操纵MATLAB®。但是,沿记录矩阵的列的状态变量的排序取决于块排序顺序。因此,当由于模型中的变化导致块分类顺序发生变化时,任何预期模型中的块状态和状态矩阵列之间的固定映射的MATLAB代码都易于破坏。
例如,考虑以下两个框图:
mdl1 ='sldemo_state_logging1';mdl2 ='sldemo_state_logging2';Open_System(MDL1);Open_System(MDL2);
这两个图具有相同的块,唯一的区别是输出端口的排序。模拟模型并以阵列格式记录状态:
simout1 = sim(mdl1,'saplformat'那'大批');simout2 = sim(mdl2,'saplformat'那'大批');
从Simulink.simulationOutput对象中提取状态向量,金宝app该对象包含模拟的输出日志:
x1 = simout1.get('xout');x2 = simout2.get('xout');
注意,在两个框图中,集成器块的相对排序不同。这会导致记录状态X1
和X2
要不同,因为列和状态之间的映射不同:
isequal(x1,x2)
ans =逻辑0
再次模拟模型,但此时间以结构格式记录状态:
simout1 = sim(mdl1,'saplformat'那'结构');simout2 = sim(mdl2,'saplformat'那'结构');
从仿真输出对象中提取包含状态日志的结构:
x1s = simout1.get('xout');x2s = simout2.get('xout');
显示这些结构。请注意,这些结构有两个字段:时间和信号。该字段的“时间”是空的,因为我们为模型参数'SaveFormat'选择了“结构”。我们本可以选择“structionTime”来存储状态结构中的时间向量:
disp(x1s);disp(x2s);
时间:[]信号:[1x2结构]时间:[]信号:[1x2 struct]
该软件将状态轨迹记录到xs.signals(k).values
以及块的名称xs.signals(k).blockname
这对应于这些状态。将状态提取为如下所示的矩阵(如阵列格式):
x1a = [x1s.signals.values];x2a = [x2s.signals.values];
请注意,状态排序问题仍然存在(x1a.
和x2a.
与之相同X1
和X2
,通过阵列格式获得):
Isequal(x1a,x2a)
ans =逻辑0
要修复状态排序问题,请使用存储的块名与值映射到固定顺序的值,例如,块名称的字母顺序:
[〜,idx1] = sort({x1s.signals.blockname});x1 = [x1s.signals(idx1).values];[〜,idx2] = sort({x2s.signals.blockname});x2 = [x2s.signals(idx2).values];isequal(x1,x2)
ans =逻辑1
通过重新排序信号阵列X1
和X2
进入块名称的字母顺序,并以该顺序提取值字段,进入矩阵X1
和X2
,我们具有将状态记录到矩阵中的机制,其中块状态的固定映射到记录矩阵的列。
关闭模型并清除在此示例中使用的变量:
close_system(mdl1);close_system(mdl2);清除ANS.IDX1.IDX2.MDL1MDL2.SIMOUT1SIMOUT2.X1x1a.X1S.X2x2a.X2S.