对子结构体和字段进行索引

要对 Stateflow 结构体的子结构体和字段进行索引,请使用圆点表示法。名称的第一部分标识父对象。后续部分标识层次化路径上的各个子级。当父级为结构体时,其子级为单个字段或包含其他结构体(也称为子结构体)的字段。Stateflow 结构体的字段名称与定义该结构体的 Simulink.Bus 对象的元素名称一致。

例如,此模型中的图包含一个输入结构体 (in)、一个输出结构体 (out) 和两个本地结构体(localbus 和 subbus)。

该图使用 Simulink.Bus 对象 BusObject 定义输入结构体 in、输出结构体 out 和本地结构体 localbus。这些结构体有四个字段:sb、a、b 和 c。字段 sb 是从 Simulink.Bus 对象 SubBus 定义的子结构体。

该图使用 Simulink.Bus 对象 SubBus 定义本地结构体 subbus。此结构体有一个名为 ele 的字段。

1b314993df1bd67a658886f0f84c558f.png

此列表说明 Stateflow 图解析圆点表示法中的符号以对这些结构体的字段进行索引的方法:

in.c - 输入结构体 in 的字段 c。

out.sb - 输出结构体 out 的子结构体 sb。

in.a(1) - 输入结构体 in 的向量字段 a 的第一个值。

subbus.ele(2,2) - 本地结构体 subbus 的字段 ele 的第二行第二列的值。

in.sb.ele(3,4) - 子结构体 in.sb 的字段 ele 的第三行第四列中的值。

为结构体和字段赋值

您可以为任何 Stateflow 结构体、子结构体或作用域不为 Input 的结构体的字段赋值。

要将一个结构体赋给另一个结构体,请在基础工作区中基于同一 Simulink.Bus 对象定义这两个结构体。

要将一个结构体赋给另一个结构体的一个子结构体(或者反之),请基于同一 Simulink.Bus 对象定义该结构体和子结构体。

要将一个结构体的字段赋给另一个结构体的字段,这些字段必须具有相同的类型和大小。您可以基于不同 Simulink.Bus 对象定义 Stateflow 结构体。

以下列表基于此示例中的结构体设定说明有效和无效的结构体赋值:

in = localbus; - 无效。不能为输入结构体赋值。

out = localbus; - 有效。out 和 localbus 均基于相同的 Simulink.Bus 对象 BusObject 进行定义。

subbus = in; - 无效。结构体 subbus 和 in 基于不同 Simulink.Bus 对象进行定义。

subbus = in.sb; - 有效。结构体 subbus 和子结构体 in.sb 基于相同的 Simulink.Bus 对象 SubBus 进行定义。

in.sb = subbus; - 无效。您不能对输入结构体的子结构体进行写入操作。

out.sb = subbus; - 有效。子结构体 out.sb 和结构体 subbus 基于相同的 Simulink.Bus 对象 SubBus 进行定义。

in.c = out.c; - 无效。不能为输入结构体的字段赋值。

out.sb.ele = subbus.ele; - 有效。字段 out.sb.ele 与字段 subbus.ele 具有相同的类型和大小(int8 类型的 3×3 矩阵)。

localbus.a(1) = in.c; - 有效。值 localbus.a(1) 与字段 in.c 具有相同的类型和大小(double 类型的标量)。

例如,在状态 A 的 entry 动作中,Stateflow 图调用函数 abc2sb 和 sb2abc,并将结果存储在本地结构体 localbus 和 subbus 中。然后,该图将本地结构体 out 和 localbus 的值组合起来,写入输出结构体 subbus。

ba525263597a8215c35c04a461a96fc5.png

图形函数 abc2sb 接受 BusObject 类型的结构体,并返回 SubBus 类型的结构体。该函数将来自其输入的字段 a、b 和 c 的值组合在一起,并重排入一个 int8 类型的 3×3 矩阵中。然后,此函数将此矩阵存储为输出结构体的字段 ele。

9b6b83164979c477e2dd481ca7ffb875.png

MATLAB® 函数 sb2abc 接受 SubBus 类型的结构体,并返回 BusObject 类型的结构体。该函数将来自其输入的字段 ele 的值分解为三个组成部分:一个向量、一个 3×2 矩阵和一个标量。该函数将这些组成部分存储在一个本地 MATLAB Y 中,后者与 Simulink.Bus 对象 BusObject 具有相同的结构体。然后,该函数将 MATLAB struct Y 的值赋给输出结构体 y。

function y = sb2abc(u)

% extract data from input structure

E = int8(magic(3));

A = double(u.ele(1:2,1));

B = uint8(u.ele(:,2:3));

C = double(u.ele(3,1));

% create local structure

X = struct('ele',E);

Y = struct('sb',X,'a',A,'b',B,'c',C);

% assign value to output structure

y = Y;

end

运行仿真

当您对该示例进行仿真时,Stateflow 图使用输入总线的字段 sb 的值来填充输出总线的字段 a、b、c。该图还使用输入总线的字段 a、b、c 的值来填充输出总线的字段 sb。

2e527135b54a1c6795860481601333a6.png

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐