Main Content

MATLAB Function 模块中创建结构体

您可以在 MATLAB Function 模块中为输入、输出、局部、持久或参数变量创建和使用结构体。MATLAB Function 模块中的结构体可以包含任何类型和大小的字段,包括复路信号、总线和结构体数组。

在创建结构体之前,您必须决定 MATLAB Function 变量的作用域。请参阅Create and Define MATLAB Function Block Variables

输入变量

为输入变量创建结构体时,MATLAB Function 模块根据输入信号确定结构体的类型、大小和复/实性。要为输入变量定义结构体,请执行以下操作:

  1. 在定义结构体的基础工作区中创建一个 Simulink.Bus 对象。

  2. MATLAB Function 模块中标识或添加一个输入变量。输入变量的作用域属性设置为输入

  3. 将变量的类型属性设置为继承:与 Simulink 相同总线: <对象名称>。对于 <object name>,请输入定义结构体属性的 Simulink.Bus 对象的名称。

Simulink® 模型中的总线作为结构体出现在 MATLAB Function 模块中。

输出变量

为输出变量创建结构体时,需要创建一个 Simulink.Bus 对象,然后在 MATLAB® 函数代码中定义变量的类型、大小和复/实性。代码和对象中的属性必须匹配。要定义输出变量的结构体,请执行以下操作:

  1. 在基础工作区创建一个 Simulink.Bus 对象,以定义结构体。

  2. MATLAB Function 模块中标识或添加输出变量。输出变量的作用域属性设置为输出

  3. 类型属性设置为总线: <对象名称>。对于 <object name>,请输入定义结构体的 Simulink.Bus 对象的名称。

  4. 将输出结构体初始化为 MATLAB 函数中的变量,如用于代码生成的结构体定义中所述。将输出变量的结构体配置与 Simulink.Bus 对象匹配,包括每个元素的数量、类型和大小。

MATLAB Function 模块的结构体输出在 Simulink 模型中显示为总线。MATLAB Function 模块支持非虚拟总线输出,但不支持虚拟总线输出。

局部变量

要定义作为结构体的局部变量,请在 MATLAB 函数中定义结构体,如用于代码生成的结构体定义中所述。您无法在符号窗格中定义局部变量,也无法在属性检查器中修改属性。默认情况下,MATLAB Function 模块会在每个时间步后清除局部变量值。

持久变量

要定义作为结构体的持久变量,请在函数代码中将该变量声明为持久变量。请参阅 persistentInitialize Persistent Variables in MATLAB Functions。例如,要声明持久变量 myVar,请输入:

persistent myVar

然后在 MATLAB 函数中定义变量结构体。您无法在符号窗格中定义持久变量,也无法在属性检查器中修改它们的属性。

参数变量

要定义作为结构体的参数变量,请执行以下操作:

  1. 在基础工作区、模型工作区或包含 MATLAB Function 模块的封装子系统中创建一个结构体变量。

  2. MATLAB Function 模块中标识或添加参数变量。请参阅配置 MATLAB Function 模块参数变量。参数变量的作用域属性设置为参数。需要匹配变量的名称。

不可调结构体参数的 fimath 属性

结构体的初始值确定包含定点值的不可调结构体参数的 fimath 属性。您在属性检查器中定义的 MATLAB Function 模块的 fimath 属性不指定这些值。

全局变量

您可以在 MATLAB Function 模块中定义全局变量,以访问 Simulink.Signal 对象或 Data Store Memory 模块中的仿真数据。请参阅在 MATLAB Function 模块中使用全局数据。要定义作为结构体的全局变量,请执行以下操作:

  1. 在基础工作区创建一个 Simulink.Bus 对象,以定义结构体。

  2. MATLAB Function 模块中标识或添加全局变量。全局变量将作用域属性设置为数据存储内存。具有此作用域的变量从 Data Store Memory 模块或 Simulink.Signal 对象中的关联数据继承其属性。

  3. 在函数代码中声明全局变量。例如,要声明全局变量 myVar,请输入:

    global myVar

有关示例,请参阅将来自数据存储内存的总线写入 MATLAB Function 模块

为结构体和字段赋值

定义结构体后,您可以为结构体、子结构体或结构体变量的字段赋值。请遵循以下指导原则:

操作条件
将一个结构体赋给另一个结构体必须将每个结构体定义为具有相同数量、类型和大小的字段,并且将其定义为基础工作区中的 Simulink.Bus 对象,或者在本地定义为隐式结构体声明。
将一个结构体赋给另一个结构体的子结构体必须将结构体定义为与子结构体具有相同数量、类型和大小的字段,并且将其定义为基础工作区中的 Simulink.Bus 对象,或者在本地定义为结构体声明。
将一个结构体的元素赋给另一个结构体的元素对应的元素必须具有相同的类型和大小。

例如,下表根据使用 MATLAB Function 模块读写总线中所述的模型设定描述有效和无效的结构体赋值:

赋值有效还是无效?原理说明
outbus = mystruct;有效Simulink.Bus 对象 MainBus 定义结构体 outbus,并且 mystruct 的本地定义与 MainBus 的字段属性匹配。
outbus = inbus;有效Simulink.Bus 对象 MainBus 同时定义 outbusinbus
outbus1 = inbus.ele3;有效由于 Simulink.Bus 对象 SubBus 同时定义 outbus1inbus.ele3,因此它们具有相同的类型和大小。
outbus1 = inbus;无效另一个 Simulink.Bus 对象定义结构体 outbus1inbus

MATLAB Function 模块中结构体的限制

  • 对于 Simulink 信号、参数或数据存储内存,无法使用包含元胞数组或类的结构体。

  • 无法对总线数组使用可变大小数据。请参阅使用总线数组组合非虚拟总线

另请参阅

相关主题