在 MATLAB 函数中访问 Simulink 总线信号
此示例说明如何使用 MATLAB 和 Stateflow® 结构体在 MATLAB® 函数中读取和写入 Simulink® 总线信号。MATLAB 结构体使您能够将不同大小和类型的数据捆绑到一个变量中。您可以创建一个 MATLAB 结构体来实现以下目的:
将相关数据存储在 MATLAB 函数的一个局部变量或持久变量中
读取或写入局部 Stateflow 结构体
在输入或输出端口与 Simulink 总线信号对接
MATLAB 函数仅支持非虚拟总线。有关详细信息,请参阅合成接口规范 (Simulink)。
在 MATLAB 函数中定义结构体
在此示例中,Stateflow 图处理来自一个 Simulink 总线信号的数据,并将结果输出到另一个 Simulink 总线信号。输入和输出总线信号都由 Simulink.Bus
(Simulink) 对象 BusObject
定义。这些总线有四个字段:sb
、a
、b
和 c
。字段 sb
也是由 Simulink.Bus
对象 SubBus
定义的总线信号。它有一个名为 ele
的字段。
在图中,Simulink 总线信号与 Stateflow 结构体 in
和 out
对接。函数 sb2abc
从输入结构体中提取信息,并将其存储在局部 Stateflow 结构体 localbus
中。然后,该图将局部结构体的值和结构体数组 subBusArray
的元素之一组合起来,写入输出结构体。有关访问和修改 Stateflow 结构体或 Stateflow 结构体数组的内容的详细信息,请参阅对 Stateflow 结构体进行索引并赋值。
MATLAB® 函数 sb2abc
接受 SubBus
类型的 Stateflow 结构体,并返回 BusObject
类型的 Stateflow 结构体。该函数将来自其输入的字段 ele
的值分解为三个组成部分:一个向量、一个 3×2 矩阵和一个标量。该函数将这些组成部分存储在一个局部 MATLAB
中,后者与 struct
Simulink.Bus
对象 BusObject
具有相同的字段。然后,该函数将 MATLAB struct
的值赋给输出结构体 y
。
function y = sb2abc(u)
% extract data from input structure
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=int8(zeros(3))); Y = struct(sb=X,a=A,b=B,c=C);
% assign value to output structure
y = Y;
end
定义输入和输出结构体
在 MATLAB 函数中,您可以通过定义函数的输入和输出结构体来访问局部 Stateflow 结构体或对接 Simulink 总线信号:
在基础工作区中,创建一个定义结构体数据类型的
Simulink.Bus
对象。在符号窗格中,选择函数输入或输出。
在属性检查器中,将类型属性设置为
Bus: <object name>
。用定义 Stateflow 结构体的Simulink.Bus
对象的名称替换 <对象名称>。
例如,在函数 sb2abc
中:
输入结构体
u
的类型属性指定为Bus: SubBus
。输出结构体
y
的类型属性指定为Bus: BusObject
。
有关详细信息,请参阅Define Stateflow Structures。
定义局部和持久结构体变量
要将相关数据存储在 MATLAB 函数内的单个变量中,您可以创建一个 MATLAB struct
类型的局部或持久变量。例如,函数 sb2abc
定义了两个局部 MATLAB 结构体,用于在写入输出结构体 y
之前临时存储从输入结构体 u
提取的数据:
X
是标量struct
,具有名为ele
的单个字段。此字段包含一个类型为int8
的 3×3 矩阵,此矩阵与Simulink.Bus
对象SubBus
的结构体相匹配。Y
是具有以下四个字段的标量struct
:sb
是SubBus
类型的子结构体,a
是double
类型的二维向量,b
是uint8
类型的 3×2 矩阵,c
是double
类型的标量。这些字段与Simulink.Bus
对象BusObject
的结构体相匹配。
有关详细信息,请参阅为代码生成定义标量结构体 (Simulink)。
另请参阅
struct
| Simulink.Bus
(Simulink)