对 Stateflow 结构体进行索引并赋值
此示例说明如何访问和修改 Stateflow® 结构体的内容或 Stateflow 结构体的数组。Stateflow 结构体是您从
对象定义的一种数据类型。您可以使用 Stateflow 结构体将不同大小和类型的数据一起捆绑到一个数据对象中。有关详细信息,请参阅Access Bus Signals Through Stateflow Structures。Simulink.Bus
(Simulink)
对子结构体和字段进行索引
要对 Stateflow 结构体的子结构体和字段进行索引,请使用圆点表示法。名称的第一部分标识父结构体。后续部分标识层次化路径上的各个子级。这些子级可以是单个字段,也可以是包含其他结构体(也称为子结构体)的字段。Stateflow 结构体的字段名称与定义该结构体的 Simulink.Bus
对象的元素名称一致。当一个字段包含向量、矩阵或数组时,您可以使用图的动作语言支持的索引表示法来访问其元素。
例如,此模型中的图包含一个输入结构体 (in
)、一个输出结构体 (out
)、一个局部结构体 (localbus
) 和一个局部结构体数组 (subBusArray
)。
该图使用
Simulink.Bus
对象BusObject
定义输入结构体in
、输出结构体out
和局部结构体localbus
。这些结构体有四个字段:sb
、a
、b
和c
。字段
sb
是从Simulink.Bus
对象SubBus
定义的子结构体。此子结构体有一个名为ele
的字段。该图使用
Simulink.Bus
对象SubBus
定义局部结构体数组subBusArray
。该数组的大小为 4。该数组中的每个元素均为结构体,其中包含一个名为ele
的字段。
此列表列举了基于此示例的结构体设定将圆点表示法和数值索引进行组合的表达式:
in.c
- 输入结构体in
的字段c
in.a(1)
- 输入结构体in
的向量场a
的第一个元素out.sb
- 输出结构体out
的子结构体sb
out.sb.ele
- 子结构体out.sb
的字段ele
out.sb.ele(2,2)
- 子结构体out.sb
的字段ele
的第二行第二列中的元素subBusArray(1)
- 结构体数组subBusArray
的第一个元素subBusArray(1).ele
- 结构体subBusArray(1)
的字段ele
subBusArray(1).ele(3,4)
- 结构体subBusArray(1)
的字段ele
的第三行第四列中的元素
由于图使用 MATLAB 作为动作语言,您可以通过使用由括号分隔的从 1 开始的索引来访问此示例中数组的元素。在使用 C 语言作为动作语言的图中,使用由方括号分隔的从 0 开始的索引。有关详细信息,请参阅Stateflow 中向量和矩阵的运算。
为结构体和字段赋值
您可以写入作用域不是 Input
的任何 Stateflow 结构体。您可以为整个结构体、子结构体或单个字段赋值。
要将一个结构体赋给另一个结构体,请在基础工作区中基于同一
Simulink.Bus
对象定义这两个结构体。要将一个结构体赋给另一个结构体的一个子结构体(或者反之),请基于同一
Simulink.Bus
对象定义该结构体和子结构体。要将一个结构体的字段赋给另一个结构体的字段,这些字段必须具有相同的类型和大小。您可以基于不同
Simulink.Bus
对象定义 Stateflow 结构体。
例如,此示例中的图进行以下赋值:
localbus = sb2abc(in.sb)
- 结构体localbus
和 MATLAB® 函数sb2abc
的输出参数是基于相同的Simulink.Bus
对象BusObject
定义的。该函数将其输入分解为三个组成部分:一个向量、一个 3×2 矩阵和一个标量。该函数将这些组成部分作为其输出的字段a
、b
和c
返回。有关此函数的详细信息,请参阅在 MATLAB 函数中访问 Simulink 总线信号。subBusArray(1) = in.sb
- 结构体subBusArray(1)
和子结构体in.sb
基于相同的Simulink.Bus
对象SubBus
进行定义。subBusArray(2) = abc2sb(in)
- 结构体subBusArray(2)
和图形函数abc2sb
的输出参数是基于相同的Simulink.Bus
对象SubBus
定义的。该函数将来自其输入的字段a
、b
和c
的值组合在一起,并重排入一个int8
类型的 3×3 矩阵中。它将此矩阵以其输出的字段ele
形式返回。subBusArray(3).ele = transpose(in.sb.ele)
- 字段subBusArray(3).ele
的类型和大小与transpose(in.sb.ele)
的结果相同。两者均为int8
类型的 3×3 矩阵。subBusArray(4).ele = int8(magic(3))
- 字段subBusArray(4).ele
的类型和大小与int8(magic(3))
的结果相同。两者均为int8
类型的 3×3 矩阵。out = localbus
-out
和localbus
均基于相同的Simulink.Bus
对象BusObject
进行定义。out.sb = subBusArray(idx)
- 子结构体out.sb
和结构体subBusArray(idx)
基于相同的Simulink.Bus
对象SubBus
进行定义。
运行仿真
当您对该示例进行仿真时,Stateflow 图使用输入结构体的字段 sb
的值来填充输出结构体的字段 a
、b
、c
。参数 idx
选择结构体数组 subBusArray
的元素以用作输出的子结构体 sb
。在此示例中,idx
等于 2,因此图使用输入结构体的字段 a
、b
、c
的值来填充子结构体。
当您对 idx
使用其他各值时,子结构体 out.sb
将分别包含与 in.sb
、in.sb
的转置或一个 3×3 幻方相同的值。
另请参阅
Simulink.Bus
(Simulink)