主要内容

以结构格式的日志记录

此示例显示了如何以结构格式的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');

注意,在两个框图中,集成器块的相对排序不同。这会导致记录状态X1X2要不同,因为列和状态之间的映射不同:

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.与之相同X1X2,通过阵列格式获得):

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

通过重新排序信号阵列X1X2进入块名称的字母顺序,并以该顺序提取值字段,进入矩阵X1X2,我们具有将状态记录到矩阵中的机制,其中块状态的固定映射到记录矩阵的列。

关闭模型并清除在此示例中使用的变量:

close_system(mdl1);close_system(mdl2);清除ANS.IDX1.IDX2.MDL1MDL2.SIMOUT1SIMOUT2.X1x1a.X1S.X2x2a.X2S.